none
CFileDialogのOnOK,OnCancel関数 RRS feed

  • 質問

  • お世話になります。

    VC++2010、Windows7環境

    CFileDialogクラス(VISTA以降スタイル)から派生したクラスを実装して
    OnCancel関数実装したのですが、

    キャンセルボタンで、メッセージを表示しているのですが、表示されません。
    ブレークポイントをはってみたのですが、とまりません。

    実際にしたいことは、ファイルダイアログにボタンを追加して、ボタン処理が終了したと同時に、
    ファイルダイアログを閉じたいのです。

    可能なんでしょうか。

    2017年10月18日 6:02

回答

  • GetIFileOpenDialog() で、IFileOpenDialog という IFileDialog の派生インターフェースを取得するメソッドがあります。

    こちらを使えば、わざわざ QueryInterface することなく Close() を呼び出せます。

    それと、OnCancel/OnOK については、確かにリファレンスにはXPではだめだがVista以降はOKとあります。

    が、戦後の文章をちゃんと読めばわかりますが、該当箇所は従来のカスタマイズに言及している個所です。

    メモの囲いにあるように Vista 以降はIDを振りなおしているというところにもあるように、OK/Cancel のボタンのIDが、IDOK/IDCANCEL になったのだと思います(古いファイルダイアログの各IDを調べていないので詳細はわかりません)。


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    • 回答としてマーク Brillia 2017年10月18日 8:22
    2017年10月18日 7:51
  • ご返事ありがとうございます。

    ■ボタンの追加、追加したボタンでファイルダイアログを閉じる処理のまとめ

    ・TRUE:VISTA以降(IFileDialogCustomize::AddPushButtonでボタン追加)

    void CMyFileDialog::OnButtonClicked(DWORD dwIDCtl){
    	IFileDialog* pfdc = GetIFileOpenDialog();
    	pfdc->Close(S_OK);
    	pfdc->Release();
    }
    ・FALSE:XP(テンプレートを使用してボタンを追加)※下記のやり方は保証されていないとか。。。
    void CMyFileOpenDlg::OnBnClickedButton1()
    {
    	 //CDialog へのハンドルを取得する
           CDialog* pDialog =(CDialog *)GetParent();
    	 if(pDialog != NULL){
    		pDialog->EndDialog(IDCANCEL);
    	 }
    }


    • 回答としてマーク Brillia 2017年10月18日 8:22
    2017年10月18日 8:22

すべての返信

  • Vista以降のファイルダイアログ(IFileDialog)でウィンドウをプログラム的に閉じる場合は、IFileDialog::Close( HRESULT ); を使います。

    詳しくは、リファレンスを見てください(別件のカスタマイズで提示したリンク先からたどれます)。


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    2017年10月18日 6:36
  • ご返事ありがとうございます。

    下記のプログラムでダイアログを閉じることができました。

    ただ、MFCのCFileDialogの、OnButtonClickedなど、インターフェイスの使用を隠して実装してくれているので、
    CFileDialogのメンバ関数などで可能なのかと思っていました。

    IFileDialogCustomize* pfdc = GetIFileDialogCustomize();
    
    IFileDialog *pfd;
     if (SUCCEEDED(pfdc->QueryInterface(&pfd)))
     {
    	pfd->Close(S_OK);
            pfd->Release();
    }
    
    pfdc->Release();

    また、リファレンスには、VISTA以降なら、OnOK、OnCancelが使用できることを記述していたのに、
    これはまちがいなのだろうか。

    また、XPスタイルの時の、プログラムからのCloseは可能なんでしょうか?
    • 編集済み Brillia 2017年10月18日 7:31 追加質問
    2017年10月18日 7:19
  • GetIFileOpenDialog() で、IFileOpenDialog という IFileDialog の派生インターフェースを取得するメソッドがあります。

    こちらを使えば、わざわざ QueryInterface することなく Close() を呼び出せます。

    それと、OnCancel/OnOK については、確かにリファレンスにはXPではだめだがVista以降はOKとあります。

    が、戦後の文章をちゃんと読めばわかりますが、該当箇所は従来のカスタマイズに言及している個所です。

    メモの囲いにあるように Vista 以降はIDを振りなおしているというところにもあるように、OK/Cancel のボタンのIDが、IDOK/IDCANCEL になったのだと思います(古いファイルダイアログの各IDを調べていないので詳細はわかりません)。


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    • 回答としてマーク Brillia 2017年10月18日 8:22
    2017年10月18日 7:51
  • ご返事ありがとうございます。

    ■ボタンの追加、追加したボタンでファイルダイアログを閉じる処理のまとめ

    ・TRUE:VISTA以降(IFileDialogCustomize::AddPushButtonでボタン追加)

    void CMyFileDialog::OnButtonClicked(DWORD dwIDCtl){
    	IFileDialog* pfdc = GetIFileOpenDialog();
    	pfdc->Close(S_OK);
    	pfdc->Release();
    }
    ・FALSE:XP(テンプレートを使用してボタンを追加)※下記のやり方は保証されていないとか。。。
    void CMyFileOpenDlg::OnBnClickedButton1()
    {
    	 //CDialog へのハンドルを取得する
           CDialog* pDialog =(CDialog *)GetParent();
    	 if(pDialog != NULL){
    		pDialog->EndDialog(IDCANCEL);
    	 }
    }


    • 回答としてマーク Brillia 2017年10月18日 8:22
    2017年10月18日 8:22