VC++实现程序Drag


很早以前我提供了该资源下载,但是有很多人说没有看懂.所以我今天特别讲解下.


在.cpp文件头声明该消息引用作用的控件ID.


 ON_NOTIFY(LVN_BEGINDRAG, IDC_LIST4, OnHdnBegindragList4)


然后实现Drag的具体事件响应:


void CMusicDragAidDlg::OnHdnBegindragList4(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMHEADER phdr = reinterpret_cast<LPNMHEADER>(pNMHDR);
    // TODO: 在此添加控件通知处理程序代码
    COleDataSource datasrc;
    HGLOBAL        hgDrop;
    DROPFILES     *pDrop;
    CStringList    lsDraggedFiles;
    POSITION       pos;
    int            nSelItem;
    CString        sFile;
    UINT           uBuffSize = 0;
    TCHAR         *pszBuff;
    FORMATETC      etc = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };


    *pResult = 0;

    pos = m_list.GetFirstSelectedItemPosition();

    while ( NULL != pos )
    {
        nSelItem = m_list.GetNextSelectedItem ( pos );
        sFile = saveroute + "/tmp"+HexToDem(sel_tmpDir)+"/" + m_list.GetItemText(nSelItem, 10);
       

    CFileFind   find;
    if(!find.FindFile(sFile))
    {
      return;
	}else{

        lsDraggedFiles.AddTail ( sFile );

        uBuffSize += lstrlen ( sFile ) + 1;
	}

    }

    uBuffSize = sizeof(DROPFILES) + sizeof(TCHAR) * (uBuffSize + 1);

    hgDrop = GlobalAlloc ( GHND | GMEM_SHARE, uBuffSize );

    if ( NULL == hgDrop )
        return;

    pDrop = (DROPFILES *) GlobalLock ( hgDrop );

    if ( NULL == pDrop )
    {
        GlobalFree ( hgDrop );
        return;
    }

    pDrop->pFiles = sizeof(DROPFILES);

#ifdef _UNICODE
    pDrop->fWide = TRUE;
#endif;

    // Copy all the filenames into memory after the end of the DROPFILES struct.

    pos = lsDraggedFiles.GetHeadPosition();
    pszBuff = (TCHAR *) (LPBYTE(pDrop) + sizeof(DROPFILES));

    while ( NULL != pos )
    {
        lstrcpy ( pszBuff, (LPCTSTR) lsDraggedFiles.GetNext ( pos ) );
        pszBuff = 1 + _tcschr ( pszBuff, '\0' );
    }

    GlobalUnlock ( hgDrop );

    // Put the data in the data source.

    datasrc.CacheGlobalData ( CF_HDROP, hgDrop, &etc );

    HGLOBAL hgBool;

    hgBool = GlobalAlloc ( GHND | GMEM_SHARE, sizeof(bool) );

    if ( NULL == hgBool )
    {
        GlobalFree ( hgDrop );
        return;
    }


    etc.cfFormat = g_uCustomClipbrdFormat;

    datasrc.CacheGlobalData ( g_uCustomClipbrdFormat, hgBool, &etc );



    DROPEFFECT dwEffect = datasrc.DoDragDrop ( DROPEFFECT_COPY/* | DROPEFFECT_MOVE*/ );

    // list.

    switch ( dwEffect )
    {
    case DROPEFFECT_COPY:
    {

        // 记录一次拖拽记录
        move_drag_log(m_list.GetItemText(nSelItem, 11), "");

        break;
    }
    }   // end switch
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值