写个入门教程吧,因为我自己也算是个新手,从这个过程摸索过来知道新人是多么的不容易!
一.建立工程
设置如上面图片所述,到这一步,可以点击Finish,进入到工程。(VisualStudio2010基础上修改)
二. 进入工程
在Toolbox界面给对话框拖动MFC ShellList Control和MFC ShelTree Control,至此可以看到类似于资源管理器一样的界面出来了
此时运行工程,没有任何错误,即拖动该两个控件,不需要添加任何代码,会保留基本功能。
三. 添加关联代码
利用类向导给控件添加变量,会在该位置自动生成以下代码。
也可以手动添加代码
CMFCShellTreeCtrl m_mfcshelltree;
CMFCShellListCtrl m_mfcshelllist;
DDX_Control(pDX, IDC_MFCSHELLLIST1, m_mfcshelllist);
DDX_Control(pDX, IDC_MFCSHELLTREE1, m_mfcshelltree);
m_mfcshelltree.Expand(m_mfcshelltree.GetRootItem(), TVE_EXPAND);
m_mfcshelltree.SetRelatedList(&m_mfcshelllist);
至此,运行工程,Tree和List已经建立起关联
进行到这一步,会发现,在List这个对话框中针对文件右键没有任何针对文件的选项
m_mfcshelllist.EnableShellContextMenu(TRUE);
增加该功能会发现右键菜单多了很多东西
m_mfcshelltree.SetFlags((SHCONTF)(SHCONTF_FOLDERS | SHCONTF_NONFOLDERS));
四 . 文件拖动
文件拖动这一块,我搜索了很多资料,但是能实现功能的不是很多,或者是有很多代码,但是拉过来以后发现了各式各样的错误。
我的想法是想做一个从外部拖一个文件到Edit Control控件中显示其路径的操作,但是目前来说实现的不是那么回事。
目前实现的是拖到MFC这个Dialog中,然后在指定的文本框中显示路径。
直接上代码吧
afx_msg void OnRclickMfcshelllist1(NMHDR *pNMHDR, LRESULT *pResult);
BEGIN_MESSAGE_MAP(CTestMFCShellListandTreeDlg, CDialogEx)
ON_NOTIFY(NM_RCLICK, IDC_MFCSHELLLIST1,&CTestMFCShellListandTreeDlg::OnRclickMfcshelllist1)
END_MESSAGE_MAP()
void CTestMFCShellListandTreeDlg::OnRclickMfcshelllist1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
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);
}
}
*pResult = 0;
}
效果如下,点击右键可以显示文件路径,当然,也可以换成左键什么的?
测试从外部拖入文件到对话框显示路径操作,添加以下代码
afx_msg void OnDropFiles(HDROP hDropInfo);
BEGIN_MESSAGE_MAP(CTestMFCShellListandTreeDlg, CDialogEx)
ON_WM_DROPFILES()
END_MESSAGE_MAP()
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
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnDropFiles(HDROP hDropInfo);
int CDragEdit::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CEdit::OnCreate(lpCreateStruct) == -1)
return -1;
DragAcceptFiles(TRUE);
return 0;
}
void CDragEdit::OnDropFiles(HDROP hDropInfo)
{
int DropCount=DragQueryFile(hDropInfo,-1,NULL,0);
TCHAR filePath[MAX_PATH];
for(int i=0;i<DropCount;i++)
{
DragQueryFile(hDropInfo,i,filePath,MAX_PATH);
}
DragFinish(hDropInfo);
SetWindowText(filePath);
UpdateData(FALSE);
CEdit::OnDropFiles(hDropInfo);
}
至此,对于CEDIT类的重载基本上已经完成
想要在对话框中展现效果
比如说我有一个IDD_EDITDlg的对话框,那么只需要用类向导对Edit Control控件添加关联变量即可
在该位置添加变量,选择Type时候只能选CEDIT,先添加,然后去代码里面将该类型换成我们重载后的类型即可,别忘记添加重载时候的头文件,否则识别不到该类型.
#pragma once
#include "DragEdit.h"
class CEditDlg : public CDialogEx
{
DECLARE_DYNAMIC(CEditDlg)
public:
CEditDlg(CWnd* pParent = NULL);
virtual ~CEditDlg();
enum { IDD = IDD_EDITDlg };
protected:
virtual void DoDataExchange(CDataExchange* pDX);
DECLARE_MESSAGE_MAP()
public:
CDragEdit m_DragEdit;
};
void CEditDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT1, m_DragEdit);
}
现在可以运行你的工程,将文件拖动进来试试了!!!
文章每个字每个图都是自己写好的,代码很多借鉴了不能用,然后自己又改了改跑起来后写下了这篇文章,希望可以帮助很多新入手的朋友,互相学习。 [Damogu]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)