MFC拖拽檔案

2021-09-19 16:37:44 字數 1420 閱讀 3221

實現mfc拖拽檔案步驟:

m_pmainwnd->dragacceptfiles(true);
2.響應主框架類cmainframe的wm_dropfiles訊息,新增如下**:

void cmainframe::ondropfiles(hdrop hdropinfo) 

::dragfinish(hdropinfo); 

}

注意事項:

當在win7、win10中以管理員許可權執行程式時,預設情況下拖拽檔案的訊息會失效。具體原因可以檢視

這裡

修改方法:

changewindowmessagefilter (wm_dropfiles, msgflt_add);

changewindowmessagefilter (wm_copydata, msgflt_add);

changewindowmessagefilter (0x0049, msgflt_add);

更新

新增上面的三個函式到工程中,在win7和win10中倒是解決了問題,但是在xp系統中,在程式結束後會報錯。

原因是:winxp 及 win2003 系統使用者庫 user32.dll 沒有 changewindowmessagefilter、changewindowmessagefilterex 這兩個介面,而 windows 7 系統下,則新增之。由於 winxp、win2003 系統安全機制不會攔截訊息,因此也就沒有必要執行上述新增的**了。但若想該測試程式在 winxp、win2003 系統下執行正常,且要在 win7 系統下能正常接收上述訊息,可直接從 win7 之 user32.dll 庫中獲取上述 api 函式入口位址,在 win7 系統下肯定是可以獲取到入口位址的;而在 xp 系統下就肯定獲取不到其入口位址,但沒關係,不會影響程式執行,亦不會報錯。

解決方法:

changewindowmessagefilterokfn pfnchangewindowmessagefilter = (changewindowmessagefilterokfn)getprocaddress(hmoduser32, "changewindowmessagefilter");

if (pfnchangewindowmessagefilter == null)

freelibrary(hmoduser32);

return pfnchangewindowmessagefilter(nmessage, ballow ? msgflt_add : msgflt_remove);}

定義changewndmessagefilterok(uint nmessage, bool ballow)函式代替changewindowmessagefilter即可

MFC 檔案拖拽的實現OnDropFiles

接著上篇的講 這篇實現檔案的拖拽功能。實現的訊息是wm dropfiles ondropfiles 依舊先新增wm dropfiles訊息 思路是 用dragqueryfile函式返回拖拽的檔案個數 然後返回每個檔案檔名 void c控制項隨拖動改變大小dlg ondropfiles hdrop h...

MFC 往對話方塊編輯控制項上拖拽檔案

過載cedit類 新增編輯框控制項 首先,過載cedit類,定義乙個派生類cdragedit類,並過載它的wm create方法,在其中新增dragacceptfile true 方法。cdragedit.h pragma once class cdragedit public cedit 然後,利...

MFC實現對話方塊編輯控制項上拖拽檔案

步驟 1 過載cedit類 2 新增編輯框控制項 首先,過載cedit類,定義乙個派生類cdragedit類,並過載它的wm create方法,在其中新增dragacceptfile true 方法。cdragedit.h pragma once class cdragedit public ced...