2012-11-26 22 views
0

我一直在使用WTL,從CDialogImpl類類繼承,我創建了另一個對話框主對話框內,這第二個孩子對話框的列表控件內創建了一個對話框。我想添加拖放功能到列表控件,我已經閱讀了關於WM_DROPFILES方法和關於Ole Drop Target的網頁,我選擇了後者。 我已經按照this實現了IDropTarget接口方法。 我已經設置了接受我的所有對話文件選項設置爲TRUE,我在孩子的對話類實例化的下降目標,並要求在其WM_INITDIALOGUE處理以下方法:奧萊拖放疑難解答

//drag& drop 
     lpDropTarget = (LPDROPTARGET)new TDropTarget(m_hWnd); 
     CoLockObjectExternal(lpDropTarget, true, true); 

     // register the HWND as a drop target 
     RegisterDragDrop(m_hWnd, lpDropTarget); 

lpDropTarget被實例如下:

LPDROPTARGET lpDropTarget; 

而且僅此而已。還沒有真正使用奧萊之前,所以我曾嘗試下面的場景中搜索運氣:

  1. 我與RegisterDragDrop登記列表控件HWND,並設置它的父對話接收通知WM_OLEDROP WM_USER + 1我送。確定光標拖動&刪除顯示,但沒有調用IDataTarget的功能的實現。

  2. RegisterDragDrop兒童對話&通知還。

  3. RegisterDragDrop主對話框&通知還。

在後來的情況下,(2 & 3)將光標拖動&降幅均未甚至出現了,它向我展示了一個允許無拖&下降。 現在,所有對話框和列表控件都已設置爲接受來自Visual Studio設計器的文件。 我僅限於使用ATL/WTL/WINAPI,沒有MFC。 我在做什麼錯?

+0

你想接受文件還是更復雜的東西? –

+0

文件/文件夾/驅動器/我希望能夠拖放它們並只獲取它們的名稱 –

+0

爲此,處理'WM_DROPFILES'更容易。 –

回答

2

爲您WM_DROPFILES是你需要處理的唯一的事情。無需與IDropTarget

擺弄如果你的應用程序並不需要在管理員模式下運行,不要在管理員模式下運行它。禁用相同的鏈接器設置(UAC Execution Level = asInvoker)。此外,在非管理員模式下運行VS,以便您的應用程序也啓動非管理員進程。這樣,Explorer.exe將能夠發送WM_DROPFILES消息到您的應用程序。

如果您的應用程序需要以管理員模式運行,您需要允許其他應用程序將幾組消息發送到您的應用程序(窗口)。請執行以下操作:

ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD); 
ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD); 
ChangeWindowMessageFilter(0x0049, MSGFLT_ADD); 

您可能還想使用更新的功能:ChangeWindowMessageFilterEx

請注意,如果您的應用程序必須以Admin身份運行,並且您需要使用GetProcAddress動態定位其中某個功能,以便您的應用程序可以在沒有此功能的操作系統(例如Windows XP)上運行。

+0

完美的答案。 –