纯win32的做法, 和duilib没半点关系.
只是被增加文件拖拽功能的工程是 基于duilib的win32工程~
/// 创建能接受文件拖拽的对话框
void CMainDlg::DoTask()
{
CAcceptFilesDlg * pDlg = NULL;
pDlg = new CAcceptFilesDlg(XML_FILE_NAME, WND_CLASS_NAME);
pDlg->SetOwner(this);
/// 创建对话框时, 指定接受文件拖拽的风格
pDlg->Create(
this->GetHWND(),
WND_DISP_NAME,
UI_WNDSTYLE_FRAME,
WS_EX_WINDOWEDGE | WS_EX_ACCEPTFILES);
pDlg->CenterWindow();
HaveSubDlgOnMainDlg(TRUE);
pDlg->ShowModal();
HaveSubDlgOnMainDlg(FALSE);
}
/// ...
LRESULT CAcceptFilesDlg::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DROPFILES:
{
DropFileOnDlg((HDROP)wParam);
}
break;
/// ...
default:
break;
}
return __super::HandleMessage(uMsg, wParam, lParam);
}
void CAcceptFilesDlg::DropFileOnDlg(HDROP hDrop)
{
WORD wNumFilesDropped = DragQueryFile(hDrop, -1, NULL, 0);
WORD wPathnameSize = 0;
WCHAR * pFilePathName = NULL;
std::wstring strFirstFile = L"";
struct _stat64i32 info;
// there may be many, but we'll only use the first
if (wNumFilesDropped > 0)
{
wPathnameSize = DragQueryFile(hDrop, 0, NULL, 0);
wPathnameSize++;
pFilePathName = new WCHAR[wPathnameSize];
if (NULL == pFilePathName)
{
_ASSERT(0);
DragFinish(hDrop);
return;
}
::ZeroMemory(pFilePathName, wPathnameSize);
DragQueryFile(hDrop, 0, pFilePathName, wPathnameSize);
strFirstFile = pFilePathName;
SAFE_DELETE(pFilePathName);
}
DragFinish(hDrop);
if ((strFirstFile.size() > 0)
&& (0 == _wstat(strFirstFile.c_str(), &info))
&& ((info.st_mode & _S_IFREG) > 0)
&& (info.st_size > 0))
{
m_pLabelFilePathName->SetText(strFirstFile.c_str());
}
}