2017-03-13 41 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

マークランズーム// csvファイル(C:\ – user5949771

答えて

0

アプリケーションが管理者として実行される場合、DragAcceptFiles()の前にこの2行を含める必要があります。

たとえば、

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メッセージを処理してドラッグアンドドロップを受け入れるすべてのウィンドウオブジェクトに対して、DragAcceptFilesを呼び出す必要があります。 オブジェクトがウィンドウにアタッチされているときに呼び出す必要があります(有効なm_hWnd)

+0

'' OnInitDialog'を見ると、 'DragAcceptFiles'の呼び出しを見つけることができます。 –

+0

DragAcceptFilesは、Visual Studioによって生成されたコードには含まれていません。これは、SDI/MDI生成コードのappクラスのコメント付きコメントに過ぎません。 – JohnCz

+0

user5949771で示されたコードを意味する場合は、申し訳ありませんが何らかの理由でそれを見逃しました。 – JohnCz

関連する問題