VisualStudio2010 MFCShellListControl和MFCShellTreeContrel基本使用学习心得以及文件拖动在Edit控件显示路径

2023-05-16

写个入门教程吧,因为我自己也算是个新手,从这个过程摸索过来知道新人是多么的不容易!

一.建立工程
工程加载的位置自行选择,工程名字自己修改吧
在这里插入图片描述
在这里插入图片描述
设置如上面图片所述,到这一步,可以点击Finish,进入到工程。(VisualStudio2010基础上修改)

二. 进入工程

在这里插入图片描述
在Toolbox界面给对话框拖动MFC ShellList Control和MFC ShelTree Control,至此可以看到类似于资源管理器一样的界面出来了
在这里插入图片描述
此时运行工程,没有任何错误,即拖动该两个控件,不需要添加任何代码,会保留基本功能。
在这里插入图片描述

三. 添加关联代码
在这里插入图片描述
利用类向导给控件添加变量,会在该位置自动生成以下代码。
在这里插入图片描述
在这里插入图片描述
也可以手动添加代码

	//在头文件中加入以下代码
	CMFCShellTreeCtrl m_mfcshelltree;
	CMFCShellListCtrl m_mfcshelllist;
//cpp文件
//DoDataExchange(CDataExchange* pDX)
DDX_Control(pDX, IDC_MFCSHELLLIST1, m_mfcshelllist);
DDX_Control(pDX, IDC_MFCSHELLTREE1, m_mfcshelltree);
//在OnInitDialog()加入关联
m_mfcshelltree.Expand(m_mfcshelltree.GetRootItem(), TVE_EXPAND);
m_mfcshelltree.SetRelatedList(&m_mfcshelllist);

至此,运行工程,Tree和List已经建立起关联
在这里插入图片描述

进行到这一步,会发现,在List这个对话框中针对文件右键没有任何针对文件的选项

m_mfcshelllist.EnableShellContextMenu(TRUE);  //TRUE启用右键菜单,FALSE禁用右键菜单

增加该功能会发现右键菜单多了很多东西

在这里插入图片描述

//打开的效果是显示发现Tree控件显示的是之前List菜单显示的东西,即从桌面的文件夹显示转成文件
m_mfcshelltree.SetFlags((SHCONTF)(SHCONTF_FOLDERS | SHCONTF_NONFOLDERS));

四 . 文件拖动

文件拖动这一块,我搜索了很多资料,但是能实现功能的不是很多,或者是有很多代码,但是拉过来以后发现了各式各样的错误。

我的想法是想做一个从外部拖一个文件到Edit Control控件中显示其路径的操作,但是目前来说实现的不是那么回事。

目前实现的是拖到MFC这个Dialog中,然后在指定的文本框中显示路径。

直接上代码吧

//TestMFCShellListandTreeDlg.h
afx_msg void OnRclickMfcshelllist1(NMHDR *pNMHDR, LRESULT *pResult);
//TestMFCShellListandTreeDlg.cpp
BEGIN_MESSAGE_MAP(CTestMFCShellListandTreeDlg, CDialogEx)
ON_NOTIFY(NM_RCLICK, IDC_MFCSHELLLIST1,&CTestMFCShellListandTreeDlg::OnRclickMfcshelllist1)
END_MESSAGE_MAP()
//TestMFCShellListandTreeDlg.cpp
//List控件中右键获取当前链接并显示在指定Edit Control中
//右键点击获取文件路径
void CTestMFCShellListandTreeDlg::OnRclickMfcshelllist1(NMHDR *pNMHDR, LRESULT *pResult)
{
	     LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
	// TODO: Add your control notification handler code here
	     CString Filename;
	  for(int i=0; i<m_mfcshelllist.GetItemCount(); i++)    
      {
		if( m_mfcshelllist.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED ) 
		{
            m_mfcshelllist.GetItemPath(Filename,i); 
			SetDlgItemText(IDC_MFCEDITBROWSE2,Filename);  //将路径设置在指定显示框
			//AfxMessageBox(Filename);					  //路径以对话框形式显示
		}
       }
	  *pResult = 0;
}

效果如下,点击右键可以显示文件路径,当然,也可以换成左键什么的?
在这里插入图片描述

测试从外部拖入文件到对话框显示路径操作,添加以下代码

//TestMFCShellListandTreeDlg.h
afx_msg void OnDropFiles(HDROP hDropInfo);

//TestMFCShellListandTreeDlg.cpp
BEGIN_MESSAGE_MAP(CTestMFCShellListandTreeDlg, CDialogEx)
		 ON_WM_DROPFILES()
END_MESSAGE_MAP()
//TestMFCShellListandTreeDlg.cpp
void CTestMFCShellListandTreeDlg::OnDropFiles(HDROP hDropInfo)
{  
	int DropCount = DragQueryFile(hDropInfo,-1,NULL,0);
	for(int i=0; i<DropCount; i++)
	{
        WCHAR filePath[MAX_PATH];
		DragQueryFile(hDropInfo, i,filePath,MAX_PATH);
		SetDlgItemTextW(IDC_EDIT1,filePath);
	}
	DragFinish(hDropInfo);
    CDialogEx::OnDropFiles(hDropInfo);
}

至此,将文件拖进Dialog,会在控件IDC_EDIT1位置显示文件路径。

另外对于对话框属性必须要设置:Behavior->Accept Files ->TRUE

至此,本次学习基本上都到这里了,还有很多功能还没有实现,等后期有学习再更新吧

本文再次编辑于20200710,接上次未解决的Edit拖动文件显示路径问题

可能理解的不全面啊
CEDIT类需要重载
即另外自己写一个派生类,继承父类CEDIT

推荐使用类向导添加类,这样会省去很多麻烦

废话不多说,上图

在这里插入图片描述

加载以后,系统会生成两个文件.cpp 和 .h文件

再次利用类向导,在CDragEdit类中重载他的WM_CREATE和WM_DROPFILES
在这里插入图片描述

//CDragEdit.h
//利用类向导添加的话该代码是自动生成的
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnDropFiles(HDROP hDropInfo);
//CDragEdit.cpp
//重载WM_CREATE
int CDragEdit::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CEdit::OnCreate(lpCreateStruct) == -1)
		return -1;

	DragAcceptFiles(TRUE); //其余都是类向导自己生成的,只需要添加这一句
	// TODO:  Add your specialized creation code here

	return 0;
}
//CDragEdit.cpp
//重载WM_DROPFILES
void CDragEdit::OnDropFiles(HDROP hDropInfo)
{
	 // TODO: 拖拽文件的响应函数
	 int DropCount=DragQueryFile(hDropInfo,-1,NULL,0);//取得被拖动文件的数目
	 // 定义一个缓冲区来存放读取的文件名信息
     TCHAR filePath[MAX_PATH];
	 // 循环依次取得拖动文件的File Name信息
	 for(int i=0;i<DropCount;i++)
	 {
		DragQueryFile(hDropInfo,i,filePath,MAX_PATH);//获得拖曳的第i个文件的文件名
		//此时 filePath已经获取到了文件路径
	 } 
    DragFinish(hDropInfo);
    SetWindowText(filePath);
    UpdateData(FALSE);
    CEdit::OnDropFiles(hDropInfo);
}

至此,对于CEDIT类的重载基本上已经完成

想要在对话框中展现效果

比如说我有一个IDD_EDITDlg的对话框,那么只需要用类向导对Edit Control控件添加关联变量即可

在这里插入图片描述

在该位置添加变量,选择Type时候只能选CEDIT,先添加,然后去代码里面将该类型换成我们重载后的类型即可,别忘记添加重载时候的头文件,否则识别不到该类型.

//DialogEx 头文件
#pragma once

#include "DragEdit.h"  //需要在使用的DialogEx头文件中添加

// CEditDlg dialog
class CEditDlg : public CDialogEx
{
	DECLARE_DYNAMIC(CEditDlg)

public:
	CEditDlg(CWnd* pParent = NULL);   // standard constructor
	virtual ~CEditDlg();

// Dialog Data
	enum { IDD = IDD_EDITDlg };

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

	DECLARE_MESSAGE_MAP()
public:
	CDragEdit m_DragEdit;   // 更改该类型为重载后的类,我这边是CDragEdit,仅作为参考
};
//Dialog cpp文件
void CEditDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_EDIT1, m_DragEdit); //利用类向导添加该位置自动生成
}

现在可以运行你的工程,将文件拖动进来试试了!!!

文章每个字每个图都是自己写好的,代码很多借鉴了不能用,然后自己又改了改跑起来后写下了这篇文章,希望可以帮助很多新入手的朋友,互相学习。 [Damogu]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VisualStudio2010 MFCShellListControl和MFCShellTreeContrel基本使用学习心得以及文件拖动在Edit控件显示路径 的相关文章

  • python利用PIL实现对图片截图

    在对图像处理时 xff0c 我们有时候需要对图片某区域进行截图 xff0c 话不多说 xff0c 直接上代码 xff1a from PIL import Image import sys 先将 input image 填充为正方形 def
  • PowerMock介绍和用法

    PowerMock PowerMock简介一 PowerMock xff1f 二 Mock底层原理1 Mockito2 PowerMock原理 三 应用场景1 依赖问题 xff0c 打桩 2 工程质量 PowerMock使用步骤一 添加依赖
  • Windows10 WSL2磁盘迁移

    一 使用 WSL 命令行工具 在 Windows 10 版本 1903 xff08 2019 年 4 月更新 xff09 或更高版本中 xff0c 您可以使用wsl exe命令行工具 1 导出分布 使用要移动的分发创建一个 tar文件wsl
  • linux下搭建confluence

    一 Java环境 java环境 二 mysql 2 1 安装前的检查和准备工作 2 1 1检查 1 是否安装过mysql xff1a rpm qa grep mysql 2 如果有的话 xff0c 就删除 xff08 XXXX是自己的mys
  • 译:SOME/IP 技术细节

    译 xff1a SOME IP 技术细节 原文 SOME IP technical details SOME IP Scalable service Oriented MiddlewarE over IP 基于 IP 可扩展面向服务中间件
  • Python requests_toolbelt的使用

    multipart form data Encoder The main attraction is a streaming multipart form data object MultipartEncoder Its API looks
  • ArchLinux中文安装教程

    以自己的电脑安装为参考 xff0c 已安装win10系统 最后效果为win10和arch双系统 xff01 xff01 xff01 一 准备工作 1 按照实际需要划分出一部分空闲磁盘空间 xff0c 右击想要安装arch的分区点击删除卷 x
  • C++20 范围库:关键优势——算法的组合

    从概念上讲 xff0c 范围 xff08 Range xff09 是一个简单的概念 xff1a 它只是一对迭代器 指向序列的开始和结束 xff08 在某些情况下是一个哨兵 xff09 然而 xff0c 这样的抽象却可以从根本上改变编写算法的
  • Drupal菜鸟笔记之使用Focal Point 模块实现图片压缩与裁剪

    在项目开发中总是有地方需要上传图片 xff0c 因此也常常需要对图片进行压缩与裁剪来达到我们想要的效果 最近项目中刚好要用到 xff0c 我就去搜索了 解了下图片的压缩与裁剪模块 xff0c 最后选择了 Focal Point Focal
  • Linux系统学习——ubuntu16.04开机蓝屏问题

    1 蓝屏原因 由于频繁地强制关机等原因造成 xserver xorg包出现损坏 xff0c 故在开机时屏幕显示出现问题 1 1 顺便提一下 xorg xorg 我们知道 xff0c Linux内核本身是没有图形化界面的 xff0c 其本身是
  • 最小生成树 Kruskal算法 Prim算法 洛谷P3366

    最小生成树 Kruskal算法 Prim算法 洛谷P3366 相较于Prim算法 xff0c 我觉得Kruskal算法更优 xff08 因为一般情况 xff0c 题目给你的边数都是正常的 xff0c Kruskal算法的时间复杂度为O El
  • 13. 罗马数字转整数

    题目 罗马数字包含以下七种字符 xff1a I xff0c V xff0c X xff0c L xff
  • 【转载】重新安装Anaconda卡在Loading applications无法进入

    我出现这个问题的原因是 xff1a 之前安装Anaconda没在系统添加路径 xff0c 虽然可以正常使用Pycharm xff0c 但Visual Studio Code 不能调用python 因此在胡老师帮助下 xff0c 决定卸载原来
  • C++语法(三)string字符串的输入、拼接、删除、查找、截取、比较、遍历

    1 字符串的输入 1 输入不含空格的字符串 string str cin gt gt str 2 输入包含空格的字符串 string str 如果前面有了cin输入 xff0c 则还需添加如下一句 getchar getline cin s
  • Python的坑(4) -- 【if x:】的含义

    原文链接 xff1a http www liaoxuefeng com wiki 0014316089557264a6b348958f449949df42a6d3a2e542c000 001431675624710bb20e9734ef34
  • 交叉编译 acl

    交叉编译 acl 概述 访问控制列表 xff08 Access Control Lists xff0c ACL xff09 是应用在路由器接口的指令列表 在 Linux 系统中 xff0c ACL 用于设定用户针对文件的权限 xff0c 而
  • 使用xrdp实现windows 远程桌面连接linux

    之前一直用mstsc连接windows主机 xff0c 今天想用此来连接linux主机时 xff0c 发现 连接不了 xff01 xff01 与度娘亲热好久之后 xff0c 分享一篇博客给大家 xff1a 传送门 一般情况下我们用ssh客户
  • 【51单片机】定时器的简单应用——计时器

    一 定时器 stc89c52 具有三个定时器 xff08 T0 T1 T2 xff09 xff08 1 xff09 T0 T1均有四种模式 最常用模式1 xff08 2 xff09 定时器模式1工作框图 SYSclk xff08 系统时钟
  • 【51单片机】直流电机的驱动和PWM调速

    51单片机驱动直流电机与 PWM 调速是通过使用 51 单片机来控制直流电机的转速和方向 51 单片机通过控制电机的电流来实现驱动 xff0c 并通过生成 PWM 信号来调节电机的转速 使用 PWM 调速可以使得直流电机的转速精确可控 xf
  • vscode中安装 gotests gomodifytags impl goplay dlv staticcheck gopls时一直失败问题记录

    在VScode中配置golang环境时 xff0c 在我电脑设置了代理的情况下 xff0c 安装上面几个go的工具时 xff0c 一直提示失败 xff1a Installing golang org x tools gopls 64 lat

随机推荐