窗口之间拖拉图片对象的实现,达人有好的思路么?谢谢 现在想做一个再窗口之间拖拉对象(图片、位图还是dialog未定)类似visio中流程定制中的那种功能,不清楚如何实现,请达人指点 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以自己在wm_mousemove中写拖拉也可以借助于COleDrag来实现 如果要为窗口增加接受Drag&Drop的功能,请按照以下步骤:1、在OnCreate(...)中调用AcceptDrag(TRUE)。2、增加消息映射BEGIN_MESSAGE_MAP(……) //{{AFX_MSG_MAP(CDropEdit) ON_WM_CREATE() ON_WM_DROPFILES() // 关于Drag&Drop的消息 //}}AFX_MSG_MAPEND_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 pathASSERT(inFile != _T(""));IShellLink* psl;HRESULT hres;LPTSTR lpsz = inFile.GetBuffer(MAX_PATH);// Create instance for shell linkhres = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,IID_IShellLink, (LPVOID*) &psl);if (SUCCEEDED(hres)){// Get a pointer to the persist file interfaceIPersistFile* ppf;hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*) &ppf);if (SUCCEEDED(hres)){// Make sure it's ANSIWORD wsz[MAX_PATH];::MultiByteToWideChar(CP_ACP, 0, lpsz, -1, wsz, MAX_PATH);// Load shortcuthres = 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;} 楼上兄弟,你写的这段代码是支持文件拖放的,跟我的问题关系不大,不过还是谢谢你,我现在已经找到方法了,在vc++技术内幕中有一个例子,使用OLE拖放,实现了这个功能。谢谢上面各位 VS 2008 调试问题 求助:如何查找一个父窗口中的倒属第二个子窗口 关于串行化内改称 api FILE* 引出的问题 如何停掉VC运行的控制台程序? ------------>>>一个奇怪的问题? AfxMessageBox 消息框对应的 classname 是什么? 基于oledb ado连接Oracle的方法? 关于画线的问题,进来有分 CDaoRecordSet 不能识别 Access 2002 建的mdb库,怎么解决? 程序员们你们是怎么锻炼的啊 unsigned char 和 char 又什么区别 如何复制对话框
也可以借助于COleDrag来实现
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;
}