从资源管理器托拽文件到CListCtrl

转载地址: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上。以后可以根据具体需要再完善。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值