现在想做一个再窗口之间拖拉对象(图片、位图还是dialog未定)类似visio中流程定制中的那种功能,不清楚如何实现,请达人指点

解决方案 »

  1.   

    可以自己在wm_mousemove中写拖拉
    也可以借助于COleDrag来实现
      

  2.   

    如果要为窗口增加接受Drag&Drop的功能,请按照以下步骤:
    1、在OnCreate(...)中调用AcceptDrag(TRUE)。
    2、增加消息映射
    BEGIN_MESSAGE_MAP(……)
        //{{AFX_MSG_MAP(CDropEdit)
        ON_WM_CREATE()
        ON_WM_DROPFILES() // 关于Drag&Drop的消息
        //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    3、处理消息
    void CXXXXX::OnDropFiles(HDROP dropInfo)
    {
        // 得到Drag&Drop的文件个数
        WORD wNumFilesDropped = DragQueryFile(dropInfo, -1, NULL, 0);
        CString firstFile="";
        //
        for (WORD x = 0 ; x         // 得到PathName的长度,由于第三个参数为NULL,所以调用会失败并返回所需长度
            WORD wPathnameSize = DragQueryFile(dropInfo, x, NULL, 0);
            // 分配memory
            char * npszFile = (char *) LocalAlloc(LPTR, wPathnameSize += 1);
            // 分配错
            if (npszFile == NULL) continue;
            // 再次得到文件名
            DragQueryFile(dropInfo, x, npszFile, wPathnameSize);
            firstFile=npszFile;
                 // 如果是shortCut则进行转换得到正确的文件名,expandedFile为最后的文件名
                 CString expandedFile = ExpandShortcut(firstFile);
            // 释放memory
            LocalFree(npszFile);
        }
        //完成
        DragFinish(dropInfo);
    }
    4、关于ExpandShortcut(...)
    CString CXXXXX::ExpandShortcut(CString &inFile)
    {
        CString outFile = "";
    // Make sure we have a path
    ASSERT(inFile != _T(""));
    IShellLink* psl;
    HRESULT hres;
    LPTSTR lpsz = inFile.GetBuffer(MAX_PATH);
    // Create instance for shell link
    hres = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
    IID_IShellLink, (LPVOID*) &psl);
    if (SUCCEEDED(hres))
    {
    // Get a pointer to the persist file interface
    IPersistFile* ppf;
    hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*) &ppf);
    if (SUCCEEDED(hres))
    {
    // Make sure it's ANSI
    WORD wsz[MAX_PATH];
    ::MultiByteToWideChar(CP_ACP, 0, lpsz, -1, wsz, MAX_PATH);
    // Load shortcut
    hres = ppf->Load(wsz, STGM_READ);
    if (SUCCEEDED(hres)) {
                    WIN32_FIND_DATA wfd;
                    // find the path from that
                    HRESULT hres = psl->GetPath(outFile.GetBuffer(MAX_PATH),
                                    MAX_PATH,
                                    &wfd,
                                    SLGP_UNCPRIORITY);
                    outFile.ReleaseBuffer();
    }
    ppf->Release();
    }
    psl->Release();
    }
        inFile.ReleaseBuffer();
        // if this fails, outFile == ""
    return outFile;
    }
      

  3.   

    楼上兄弟,你写的这段代码是支持文件拖放的,跟我的问题关系不大,不过还是谢谢你,我现在已经找到方法了,在vc++技术内幕中有一个例子,使用OLE拖放,实现了这个功能。谢谢上面各位