【VC++】ドラッグ&ドロップでファイルパスをセットする

0

    <機能>
    (1)ダイアログに配置された2つのエディットボックスがドラッグ&ドロップ通知を受け取ります
    (2)複数ファイルがドラッグ&ドロップされたときリストボックスにすべてのパスを表示します
    (3)ドラッグ&ドロップクラス(CDropFile)により2つのエディットボックスは同じ動作をします

    <動作検証&開発環境>
    Visual Studio Community 2015

    <イメージ>
    2つのエディットボックスにそれぞれドラッグ&ドロップするとエディットボックスには最後にドロップされたパス、リストボックスにはドロップされたすべてのパスが表示されます
    実行結果イメージ、ドラッグアンドドロップ、VC、サンプル

    <使い方>
    ドラッグ&ドロップサンプルアプリを作成する手順を記載します。
    Visual Studio 2015での手順ですが他でもそんなに変わらないと思います。

    (1)MFCアプリケーションでプロジェクトを作成(名前はDropSampleとします)
    プロジェクトを作成、ドラッグアンドドロップ、VC、サンプル

    (2)アプリケーションの種類でダイアログベースを選択
    ダイアログベースアプリ、ドラッグアンドドロップ、VC、サンプル
    その他の設定はデフォルトで問題ないので[完了]を押下してください。

    (3)ダイアログにエディットボックス、リストボックスを配置
    GUIの名前、ドラッグアンドドロップ、VC、サンプル
    IDC_EDIT1、IDC_EDIT2のプロパティ変更
    ・Right Align Text : True
    ・Right To Left Reading Order : True
     ドロップしたパスを右寄せで表示します(ファイル名が表示されるようにする)
    ・Accept Files : True
     ドラッグ&ドロップ通知を受け取るためにAcceptFilesをTrueに変更します

    IDC_LIST1、IDC_LIST2
    ・Right Align : Text True
     右寄せで表示します(ファイル名が表示されるようにする)

    (4)クラスを追加します
    クラス ウィザード→[クラスの追加]押下しクラスを追加します。
    本サンプルアプリはエディットボックスにドロップするため基底クラスにCEditを指定します。
    クラス名 : CDropFile
    基底クラス : CEdit
    クラスの追加、ドラッグアンドドロップ、VC、サンプル

    (5)追加したCDropFileクラスにイベントWM_DROPFILESを追加します
    ・クラス ウィザード画面にてクラス名からCDropFileを選択
    ・メッセージよりWM_DROPFILESを選択
    ・[ハンドラーの追加]押下
    メッセージの追加、ドラッグアンドドロップ、VC、サンプル

    (6)エディットボックス、リストボックスにメンバ変数をセットします
    IDC_EDIT1、IDC_EDIT2にメンバ変数追加
    ・変数の種類(型) : CDropFile型
    ・変数名 : m_dpEdit1(m_dpEdit2) 
    ・コントロール変数 : チェックOn
    ・カテゴリ : コントロール

    IDC_LIST1、IDC_LIST2にメンバ変数追加
    ・変数の種類(型) : CListBox
    ・変数名 : m_List1(m_List2) 
    ・コントロール変数 : チェックOn
    ・カテゴリ : コントロール

    変数が追加されると以下のようになります。
    ダイアログのメンバ変数、ドラッグアンドドロップ、VC、サンプル

    (7)エディットボックスにEN_CHANGEメッセージを追加します
    ・クラス ウィザード画面にてクラス名からCDropSampleDlgを選択
    ・コマンドタブからIDC_EDIT1(IDC_EDIT2)を選択
    ・メッセージの一覧よりEN_CHANGEを選択
    ・[ハンドラーの追加]押下
    EDITCHANGEメッセージ追加、ドラッグアンドドロップ、VC、サンプル

    (8)ソースの追加

     

    //DropFile.h

    //複数ファイル(フォルダ)がドロップされた時のためにパスを格納する配列(csdrop)を用意

    class CDropFile :
        public CEdit
    {
        //〜省略〜
    public:
        //複数ファイル(フォルダ)がドロップされたときにパスを格納する
        CStringArray csdrop;
    };

     

    //DropFile.cpp

    //ドロップされた時の動作を記載

    /***********************************************************
    ファイル(フォルダ)がドロップされた時のイベント
    ***********************************************************/

    void CDropFile::OnDropFiles(HDROP hDropInfo)
    {
        //ドロップされたファイルの個数を取得
        //DragQueryFile の詳細についてはmsdn参照
        //第2引数に -1 を指定すると、DragQueryFile はドロップされたファイルの総数を返します
        //unsigned int型の 0 を反転させると -1(0xFFFFFFFF) です
        UINT iCnt = DragQueryFile(hDropInfo, ~0u, NULL, 0);
        //複数ファイル(フォルダ)格納された時のバッファを初期化
        csdrop.RemoveAll();
        for (UINT i = 0; i<iCnt; i++)
        {
            //ファイル名の長さを取得
            //第3引数にNULLを指定すると、DragQueryFile は必要なバッファのサイズを文字単位で返します
            UINT iLen = DragQueryFile(hDropInfo, i, NULL, 0);
            //ファイル名を取得
            //第2引数に0〜ドロップされたファイルの総数未満のいずれかの値を指定すると、その値に対応するファイル(フォルダ)名を格納します
            CString csfile;
            DragQueryFile(hDropInfo, i, csfile.GetBuffer(iLen + 1), iLen + 1);
            csfile.ReleaseBuffer();
            //ファイル(フォルダ)名を保持
            csdrop.Add(csfile);
            //エディットボックスにパスを表示
            //複数ファイルドロップした場合は結果として最後に処理したパスが表示される)
            this->SetWindowText(csfile);
        }
        CEdit::OnDropFiles(hDropInfo);
    }

     

    //DropSampleDlg.cpp

    //エディットボックス、リストボックスをドロップされたパスで更新する

    /***********************************************************
    IDC_EDIT1のイベント
    ***********************************************************/

    void CDropSampleDlg::OnChangeEdit1()
    {
        int idx;
        UpdateData(TRUE);
        m_List1.ResetContent();
        for (idx = 0; idx < m_dpEdit1.csdrop.GetSize(); idx++)
        {
            m_List1.AddString(m_dpEdit1.csdrop.GetAt(idx));
        }
    }
    /***********************************************************
    IDC_EDIT2のイベント
    ***********************************************************/

    void CDropSampleDlg::OnChangeEdit2()
    {
        int idx;
        UpdateData(TRUE);
        m_List2.ResetContent();
        for (idx = 0; idx < m_dpEdit2.csdrop.GetSize(); idx++)
        {
            m_List2.AddString(m_dpEdit2.csdrop.GetAt(idx));
        }
    }

     

    よろしければポチッと押してください


    プログラマー ブログランキングへ



    selected entries

    categories

    calendar

    S M T W T F S
        123
    45678910
    11121314151617
    18192021222324
    252627282930 
    << November 2018 >>

    profile

    others

    archives