2012-11-26 5 views
0

CDialogImpl 클래스를 상속 한 WTL을 사용하여 대화 상자를 만들었습니다. 기본 대화 상자에서 다른 대화 상자를 만들고이 두 번째 자식 대화 상자 안에 목록 컨트롤을 만들었습니다. 목록 컨트롤에 드래그 & 드롭 기능을 추가하고 싶었습니다. 웹에서 WM_DROPFILES 메서드에 대해 읽었으며 Ole Drop 대상에 대해서는 나중에 선택했습니다. this에 따라 IDropTarget 인터페이스 메서드를 구현했습니다. 다음과 같이Ole 끌어서 놓기 문제 해결

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

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

lpDropTarget 인스턴스화 : 나는 내 모든 대화에서 TRUE로 파일 옵션을 받아 설정 한 , 나는 자식 대화 클래스의 IDropTarget을 인스턴스화하고 WM_INITDIALOGUE 처리기에서 다음과 같은 방법을 불렀다

LPDROPTARGET lpDropTarget; 

그게 전부입니다.

  1. 나는 목록 제어 HWND에 대한 RegisterDragDrop에 등록하고 그것이 내가 보내는 알림 WM_OLEDROP WM_USER + 1를받을 부모 대화의 설정 : 그래서 행운의 검색에 다음과 같은 시나리오를 시도하기 전에 정말 올레를 사용하지 않았습니다. 커서를 드래그 & 드롭으로 보이지만 IDataTarget의 기능 구현에 대한 호출이 없습니다.

  2. RegisterDragDrop for child 대화 & 알림.

  3. RegisterDragDrop 기본 대화 상자 & 알림도 있습니다. 나중에 경우 (2 & 3) 드래그 & 강하 커서에서

도 등장하지 않았다, 그것은 나에게 하나를 허용 노 드래그 & 드롭을 보여 주었다. 이제 모든 대화 및 목록 컨트롤이 Visual Studio 디자이너의 파일을 수락하도록 설정되었습니다. MFC없이 ATL/WTL/WINAPI 만 사용하도록 제한됩니다. 내가 뭘 잘못하고 있니?

+0

파일을 받아 들일 수 있기를 원하십니까? 아니면 좀 더 복잡한 것을 받아 들일 수 있습니까? –

+0

파일/폴더/드라이브/나는 끌어서 놓기 만하고 이름 만 얻을 수 있기를 원합니다. –

+0

이렇게하려면 'WM_DROPFILES'를 다루는 것이 더 쉽습니다. –

답변

2

WM_DROPFILES은 처리해야 할 유일한 것입니다. IDropTarget 등으로 도비 할 필요가 없습니다.

응용 프로그램을 관리자 모드로 실행할 필요가없는 경우 관리자 모드로 실행하지 마십시오. 동일하게 링커 설정을 비활성화하십시오 (UAC Execution Level = asInvoker). 또한 비 관리자 모드에서 VS를 실행하면 응용 프로그램도 비 관리자 프로세스로 시작할 수 있습니다. 이렇게하면 Explorer.exe가 응용 프로그램에 WM_DROPFILES 메시지를 보낼 수 있습니다.

응용 프로그램을 관리 모드로 실행해야하는 경우 다른 응용 프로그램이 몇 가지 메시지 집합을 응용 프로그램 (창)으로 보내도록 허용해야합니다. ChangeWindowMessageFilterEx :

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

는 또한 새로운 기능을 사용할 수 있습니다 : 다음을 수행.

응용 프로그램이 Admin으로 실행되어야하고이 기능을 사용할 수없는 OS (예 : Windows XP)에서 응용 프로그램을 실행할 수 있도록 GetProcAddress을 사용하여 이러한 기능 중 하나를 동적으로 찾아야하는 경우

+0

완벽한 답변. –