- 締切済み
名前を付けて保存パネル等でESC/ENTER無効にする方法
MFCにて自分でつくったダイアログに対してESC/ENTERを無効にする方法はわかりましたが、名前を付けて保存や印刷パネルなど元からあるパネルのESC/ENTERを無効にする方法はありますでしょうか?
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- machongola
- ベストアンサー率60% (434/720)
こんばんは。以下参考に。 >>名前を付けて保存や印刷パネル コモンダイアログの事でしょうか? >>ESC/ENTER [開く・キャンセル]等のボタンの事でしょうか? 上記の2項が[YES]であるなら答えは可能です。 以下に纏めさせて頂きます。 VC++6.0にて確認しています。 (1)ボタンのIDはどこで判るか? VCの[Include]フォルダの中にコモンダイアログのダイアログリソースがあります。 それらをVCで開けて見れば、それぞれのダイアログ上に搭載されたボタンなどのIDを確認できます。 【<コモンダイアログ種類><MFCにおけるクラス名><リソールファイル名>】 【<カラー><CColorDialog><COLOR.DLG>】 【<フォント><CFontDialog><FONT.DLG>】 【<ファイルを開く><CFileDialog><FILEOPEN.DLG>】 【<検索と置換><CFindReplaceDialog><FINDTEXT.DLG>】 【<印刷><CPrintDialog><PRNSETUP.DLG>】※ 【<ページ設定><CPrintDialog><PRNSETUP.DLG>】※ ※の部分はチョッと曖昧です。 (2)どうするか (1)に示したMFCクラスを継承して、メッセージをマップします。 以下は[CFileDialog]を継承して[CFileDialogCustom]を作り[開く・キャンセル]のボタン二つを無効化します。 +----------------------------------------------------------------------------------------+ #define ARRAYCOUNT(a) (sizeof(a) / sizeof(a[0])) //マップするメッセージ BOOL CFileDialogCustom::OnInitDialog() { CFileDialog::OnInitDialog(); // TODO: この位置に初期化の補足処理を追加してください //無効化したいボタンIDの配列 const UINT arrID[] = {IDOK, IDCANCEL}; for(int i = 0; i < ARRAYCOUNT(arrID); ++i) { //ダイアログハンドルを取る HWND hDlg = ::GetParent(this->GetSafeHwnd()); //ボタンハンドルを取る HWND hButton = ::GetDlgItem(hDlg, arrID[i]); //無効化する ::EnableWindow(hButton, FALSE); } return TRUE; // コントロールにフォーカスを設定しないとき、戻り値は TRUE となります // 例外: OCX プロパティ ページの戻り値は FALSE となります } +----------------------------------------------------------------------------------------+ ・ファイルダイアログの場合は親ウィンドウを取らないといけないようです。ヘルプにそうしろと記載されていたからです。 他種類のダイアログは不明です(それぞれ要確認) ・ダイアログ上のボタンなどのコントロールは[CWnd]クラスとして作成されていないので、原始的なHWND型とAPIで扱う必要があります。
お礼
ありがとうございます。 試してみます。