从资源管理器托拽文件到CListCtrl
2012-02-14 17:02
387 查看
转载地址:http://blog.csdn.net/wuqiangu/article/details/1644447
测试环境: Window XP / Visual Studio 2005
(一) 建立一个基于对话框的工程MyDropListCtrl。
1. 在CDialog面板中放置一个CListCtrl控件。并设置其AccceptFiles属性为true,View属性为report
(二) 从CListCtrl派生一个类CMyListCtrl,并重写它的OnDropFiles函数。
1. 在类的头文件中加入函数声明
afx_msg void OnDropFiles(HDROP hDropInfo);
2. 在类的实现文件中消息映射表处加入
ON_WM_DROPFILES()
3. 在类的实现文件中进行函数处理
void CMyListCtrl::OnDropFiles(HDROP hDropInfo)
{
char cFilePathName[_MAX_PATH] = {0};
UINT nNumOfFiles = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0); //文件的个数
for ( UINT nIndex=0 ; nIndex< nNumOfFiles; ++nIndex )
{
DragQueryFile(hDropInfo, nIndex, cFilePathName, _MAX_PATH); //得到文件名
// 把得到的文件名传给父窗口
LPARAM lParam = (LPARAM)cFilePathName;
GetParent()->SendMessage(WM_USER_CHANGE_LIST,0,lParam);
}
DragFinish(hDropInfo);
}
为了要在父窗口中处理[文件名,路径插入ListCtrl中]这一操作,这里用到SendMessage函数,后面再详细说明。
这样就实现了一个简单支持拖放文件的CListCtrl类了。
(三) CListCtrl对象设置。
1. 用向导为CListCtrl控件添加变量,类型为CMyListCtrl
CMyListCtrl m_wndListCtrl;
2.在此对话框类实现文件中加入一下代码
BOOL CMyDropListCtrlDlg::OnInitDialog()
{
CDialog::OnInitDialog();
......
m_wndListCtrl.SetExtendedStyle( m_wndListCtrl.GetExtendedStyle() | LVS_EX_FULLROWSELECT );
LVCOLUMN column;
column.mask = LVCF_TEXT;
CRect crect;
m_wndListCtrl.GetWindowRect(&crect);// 得到ListCtrl的矩形大小
// name列
column.pszText = "name";
m_wndListCtrl.InsertColumn(0, &column);
m_wndListCtrl.SetColumnWidth(0,(crect.Width()-5) * 2 / 7);//
设置列宽
// location列
column.pszText = "location";
m_wndListCtrl.InsertColumn(1, &column);
m_wndListCtrl.SetColumnWidth(1,(crect.Width()-5) * 5 / 7);
.......
return TRUE;
}
(四) 用自定义消息处理拖放文件
1.定义消息名称,在CMyListCtrl头文件中加入
enum eMyListCtrl{ WM_USER_CHANGE_LIST = WM_APP + 0x0100 };
用#define 定义也可以(一个VC高手告诉我,在C++中避免用#define)。消息名称可以自己定义,其值要在
WM_APP以上
2. 发送消息。就是上面的SendMessage函数。第一个参数就是,消息名称。后两个参数,可以根据需要为我们传递
数据。这里,就传递所拖放文件的全路经。不用的话,一般设置为零。
3. 声明消息处理函数。在对话框类头文件中加入,函数名自定义。返回值一般为LRESULT。
afx_msg LRESULT OnDropFilesToList(WPARAM wParam, LPARAM lParam);
4. 建立消息映射。在对话框实现文件消息映射表处加入
ON_MESSAGE( CMyListCtrl::WM_USER_CHANGE_LIST, OnDropFilesToList )
如果上面用#define定义消息名称的话,就把CMyListCtrl::去掉。
5. 进行消息处理。这里为在ListCtrl上插入所拖放文件的名字及路径。
LRESULT CMyDropListCtrlDlg::OnDropFilesToList(WPARAM wParam, LPARAM lParam)
{
//m_wndListCtrl.DeleteAllItems();
char * cFilePath = (char *)lParam;//
得到拖放文件的路径
char fileName[_MAX_FNAME];
_splitpath_s(cFilePath, NULL, 0, NULL, 0, fileName, _MAX_FNAME, NULL, 0);//
得到文件名
m_wndListCtrl.InsertItem(0, fileName);// 在第一列插入文件名
m_wndListCtrl.SetItemText(0, 1,cFilePath );// 在第二列插入文件路径
return true;
}
这一步,简单验证了从资源管理器可以拖放文件到自己的ListCtrl上。以后可以根据具体需要再完善。
测试环境: Window XP / Visual Studio 2005
(一) 建立一个基于对话框的工程MyDropListCtrl。
1. 在CDialog面板中放置一个CListCtrl控件。并设置其AccceptFiles属性为true,View属性为report
(二) 从CListCtrl派生一个类CMyListCtrl,并重写它的OnDropFiles函数。
1. 在类的头文件中加入函数声明
afx_msg void OnDropFiles(HDROP hDropInfo);
2. 在类的实现文件中消息映射表处加入
ON_WM_DROPFILES()
3. 在类的实现文件中进行函数处理
void CMyListCtrl::OnDropFiles(HDROP hDropInfo)
{
char cFilePathName[_MAX_PATH] = {0};
UINT nNumOfFiles = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0); //文件的个数
for ( UINT nIndex=0 ; nIndex< nNumOfFiles; ++nIndex )
{
DragQueryFile(hDropInfo, nIndex, cFilePathName, _MAX_PATH); //得到文件名
// 把得到的文件名传给父窗口
LPARAM lParam = (LPARAM)cFilePathName;
GetParent()->SendMessage(WM_USER_CHANGE_LIST,0,lParam);
}
DragFinish(hDropInfo);
}
为了要在父窗口中处理[文件名,路径插入ListCtrl中]这一操作,这里用到SendMessage函数,后面再详细说明。
这样就实现了一个简单支持拖放文件的CListCtrl类了。
(三) CListCtrl对象设置。
1. 用向导为CListCtrl控件添加变量,类型为CMyListCtrl
CMyListCtrl m_wndListCtrl;
2.在此对话框类实现文件中加入一下代码
BOOL CMyDropListCtrlDlg::OnInitDialog()
{
CDialog::OnInitDialog();
......
m_wndListCtrl.SetExtendedStyle( m_wndListCtrl.GetExtendedStyle() | LVS_EX_FULLROWSELECT );
LVCOLUMN column;
column.mask = LVCF_TEXT;
CRect crect;
m_wndListCtrl.GetWindowRect(&crect);// 得到ListCtrl的矩形大小
// name列
column.pszText = "name";
m_wndListCtrl.InsertColumn(0, &column);
m_wndListCtrl.SetColumnWidth(0,(crect.Width()-5) * 2 / 7);//
设置列宽
// location列
column.pszText = "location";
m_wndListCtrl.InsertColumn(1, &column);
m_wndListCtrl.SetColumnWidth(1,(crect.Width()-5) * 5 / 7);
.......
return TRUE;
}
(四) 用自定义消息处理拖放文件
1.定义消息名称,在CMyListCtrl头文件中加入
enum eMyListCtrl{ WM_USER_CHANGE_LIST = WM_APP + 0x0100 };
用#define 定义也可以(一个VC高手告诉我,在C++中避免用#define)。消息名称可以自己定义,其值要在
WM_APP以上
2. 发送消息。就是上面的SendMessage函数。第一个参数就是,消息名称。后两个参数,可以根据需要为我们传递
数据。这里,就传递所拖放文件的全路经。不用的话,一般设置为零。
3. 声明消息处理函数。在对话框类头文件中加入,函数名自定义。返回值一般为LRESULT。
afx_msg LRESULT OnDropFilesToList(WPARAM wParam, LPARAM lParam);
4. 建立消息映射。在对话框实现文件消息映射表处加入
ON_MESSAGE( CMyListCtrl::WM_USER_CHANGE_LIST, OnDropFilesToList )
如果上面用#define定义消息名称的话,就把CMyListCtrl::去掉。
5. 进行消息处理。这里为在ListCtrl上插入所拖放文件的名字及路径。
LRESULT CMyDropListCtrlDlg::OnDropFilesToList(WPARAM wParam, LPARAM lParam)
{
//m_wndListCtrl.DeleteAllItems();
char * cFilePath = (char *)lParam;//
得到拖放文件的路径
char fileName[_MAX_FNAME];
_splitpath_s(cFilePath, NULL, 0, NULL, 0, fileName, _MAX_FNAME, NULL, 0);//
得到文件名
m_wndListCtrl.InsertItem(0, fileName);// 在第一列插入文件名
m_wndListCtrl.SetItemText(0, 1,cFilePath );// 在第二列插入文件路径
return true;
}
这一步,简单验证了从资源管理器可以拖放文件到自己的ListCtrl上。以后可以根据具体需要再完善。
相关文章推荐
- 从资源管理器托拽文件到CListCtrl
- Intellij Idea工具栏添加打开选中文件的资源管理器位置
- java如何实现在系统资源管理器中选中指定文件/文件夹?
- eclipse中文件文件夹高速定位,打开文件所在文件夹,在资源管理器中查看
- 导出EXCEL中的文件到资源管理器
- HOW TO:从资源管理器中拖放文件到控件
- java如何实现在系统资源管理器中选中指定文件/文件夹?
- vs2005中在资源管理器中显示项目文件的结构
- java swing 做桌面应用程序,打包成jar文件,在桌面上点击关闭界面后,在资源管理器中仍可看见线程运行
- 如何用API从应用程序到资源管理器拖放文件??????
- VS2008在资源管理器中按右键添加ASP文件夹时没有App_Code选项,自行新增后放在里面的类文件不能调用!
- Eclipse Explorer插件快速打开项目文件在系统资源管理器
- HOW TO:从资源管理器中拖放文件到控件
- 从资源管理器中,获取被选择的文件的路径(及文件夹)的API
- eclipse中文件目录快速定位,打开文件所在文件夹,在资源管理器中查看
- eclipse在资源管理器中打开文件
- Eclipse实现文件在资源管理器打开并选中
- 删除文件时候显示“文件已在资源管理器中打开”快速解决方法
- Eclipse 中将文件在资源管理器中打开
- 恢复Ico图标文件在资源管理器中的显示