2017-03-13 1 views
2

대화 상자에서 파일을 드래그하여 파일 경로를 가져 오려고합니다. 그래서 나는 웹을 검색하고 그것을 시도했다.MFC 대화 상자에서 파일 드래그

MyDlg.cpp

KmCdmMakeMultiProjectDlg::KmCdmMakeMultiProjectDlg(CWnd* pParent) 
: CDialog (KmCdmMakeMultiProjectDlg::IDD, pParent) 
{ 
} 

void KmCdmMakeMultiProjectDlg::DoDataExchange(CDataExchange* pDX) 
{ 
    CDialog::DoDataExchange(pDX); 
    DDX_Control(pDX, IDC_LIST_MULTIPART, lst_AddList); 
    DDX_Control(pDX, IDC_BTN_ADD_PROJECT, btn_AddList); 
    DDX_Control(pDX, IDC_BTN_ADDLIST_CSV, btn_AddList_CSV); 
    DDX_Control(pDX, IDC_BTN_DEL_PROJECT, btn_DelList); 
    DDX_Control(pDX, IDC_BTN_TARGET_SELECT, btn_ReferFolder); 
    DDX_Control(pDX, IDC_BTN_FILE_SELECT, btn_ReferCSV); 
    DDX_Control(pDX, IDC_BTN_EXECUTE, btn_Execute); 
    DDX_Control(pDX, IDC_BTN_EDIT_NAME, btn_EditName); 
    DDX_Control(pDX, IDC_BTN_EDIT_DESCRIPTION, btn_EditDescription); 
    DDX_Control(pDX, ID_CLOSE, btn_Close); 
} 

BEGIN_MESSAGE_MAP(KmCdmMakeMultiProjectDlg, CDialog) 
    ON_BN_CLICKED(IDC_BTN_ADD_PROJECT, &KmCdmMakeMultiProjectDlg::AddList) 
    ON_BN_CLICKED(IDC_BTN_ADDLIST_CSV, &KmCdmMakeMultiProjectDlg::AddListCSV) 
    ON_BN_CLICKED(IDC_BTN_DEL_PROJECT, &KmCdmMakeMultiProjectDlg::DelList) 
    ON_BN_CLICKED(IDC_BTN_TARGET_SELECT, &KmCdmMakeMultiProjectDlg::SelectPath) 
    ON_BN_CLICKED(IDC_BTN_FILE_SELECT, &KmCdmMakeMultiProjectDlg::SelectCSV) 
    ON_BN_CLICKED(IDC_BTN_EXECUTE, &KmCdmMakeMultiProjectDlg::MakeExecute) 
    ON_BN_CLICKED(IDC_BTN_EDIT_NAME, &KmCdmMakeMultiProjectDlg::EditName) 
    ON_BN_CLICKED(IDC_BTN_EDIT_DESCRIPTION, &KmCdmMakeMultiProjectDlg::EditDescription) 
    ON_BN_CLICKED(ID_CLOSE, &KmCdmMakeMultiProjectDlg::CloseDialog) 
    ON_WM_DROPFILES() 
END_MESSAGE_MAP() 

BOOL KmCdmMakeMultiProjectDlg::OnInitDialog() 
{ 
    CDialog::OnInitDialog(); 
    CDialog::DragAcceptFiles(); 
} 

void KmCdmMakeMultiProjectDlg::OnDropFiles(HDROP hDropInfo) 
{ 
    CString csfile = "Why don't come this break point!"; 
    CDialog::OnDropFiles(hDropInfo); 
} 

나는 그것을 어렵지 않다 생각했다. 대화 상자에서 "ON_WM_DROPFILES()"메시지를 설정하고 을 설정하고 "CDialog :: DragAcceptFiles();를 설정하십시오. 대화 상자의 OnInitDialog() 메소드에서.

대화 상자에서 파일을 드래그하면 OnDropFiles (HDROP hDropInfo)가 길 것으로 예상됩니다. 디버그 모드로 테스트했으며 OnDropFiles 메서드에서 중단 점을 확인했습니다. 하지만 파일을 떨어 뜨린 경우에도 아무런 문제가 발생하지 않았습니다.

당신은 어떤 생각이 있습니까?, 당신의 가르침을 기다리고 있습니까? 감사합니다.

+0

*에서 *을 (를) 드래그하고 있습니까? –

+0

Mark Ransom // csv 파일 (C : \ – user5949771

답변

0

응용 프로그램을 관리자 권한으로 실행하는 경우 DragAcceptFiles();

예를 들면.

BOOL KmCdmMakeMultiProjectDlg::OnInitDialog() 
{ 
    CDialog::OnInitDialog(); 
    ChangeWindowMessageFilter(0x0049, MSGFLT_ADD); 
    ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD); 
    CDialog::DragAcceptFiles(); 
} 

포인트는 ChangeWindowMessageFilter입니다.

감사합니다.

+0

) * 이유 * Microsoft는 관리자 프로그램이 비 관리자 소스의 입력을 허용하지 않습니다. 이를 우회하면 문제가 발생합니다. 가장 좋은 방법은 앱에 관리자 권한이 필요하지 않도록하는 것입니다. –

0

C++ 및 C의 이름에서 ChangeWindowMessageFilter를 사용하지 마십시오. 권한 분리 (UIPI) 메시지 필터를 다루며 끌어서 놓기 지원과 관련이 없습니다.

WM_DROPFILES 메시지를 처리하여 끌어서 놓기를 허용 할 모든 Windows 개체에 대해 DragAcceptFiles을 호출해야합니다. 개체가 창에 연결될 때 호출해야합니다 (유효한 m_hWnd)

+0

''OnInitDialog'을 보면'DragAcceptFiles'에 대한 호출을 찾을 수 있습니다. –

+0

DragAcceptFiles는 Visual Studio에서 생성 된 코드에 포함되어 있지 않습니다. SDI/MDI 생성 코드에 대한 앱 클래스의 주석 처리 된 제안 일뿐입니다. – JohnCz

+0

user5949771에 표시된 코드를 의미하는 경우, 유감 스럽지만 어떤 이유로 든보고 싶습니다. – JohnCz

관련 문제