質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

Q&A

解決済

2回答

2119閲覧

MFCで何かボタンが押された時という実装方法が昔と違うので今はどのように実装するのかの調査方法をお伺いしたい

akptaro

総合スコア29

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

0グッド

0クリップ

投稿2023/10/19 08:54

実現したいこと

MFCで(VisualStudio2022>MFC>ダイアログ)で作成したフレームに
F7ぐらいを押下したら動作させるプログラムを書きたいのですが
MFCでF7を押下したら動作をいう 押下したらというのがMFCではどのよう記述するのか分からないので調査方法をお伺いしたい。

前提

MFCで(VisualStudio2022>MFC>ダイアログ)で作成したフレーム
の後半は以下の通りなのですが何かボタンを押された時に動作というのをどのように記述して良いのか不明なのです。

// 唯一の CMFCApplication1App オブジェクト CMFCApplication1App theApp; // CMFCApplication1App の初期化 BOOL CMFCApplication1App::InitInstance() { // アプリケーション マニフェストが visual スタイルを有効にするために、 // ComCtl32.dll Version 6 以降の使用を指定する場合は、 // Windows XP に InitCommonControlsEx() が必要です。さもなければ、ウィンドウ作成はすべて失敗します。 INITCOMMONCONTROLSEX InitCtrls; InitCtrls.dwSize = sizeof(InitCtrls); // アプリケーションで使用するすべてのコモン コントロール クラスを含めるには、 // これを設定します。 InitCtrls.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx(&InitCtrls); CWinApp::InitInstance(); AfxEnableControlContainer(); // ダイアログにシェル ツリー ビューまたはシェル リスト ビュー コントロールが // 含まれている場合にシェル マネージャーを作成します。 CShellManager *pShellManager = new CShellManager; // MFC コントロールでテーマを有効にするために、"Windows ネイティブ" のビジュアル マネージャーをアクティブ化 CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows)); // 標準初期化 // これらの機能を使わずに最終的な実行可能ファイルの // サイズを縮小したい場合は、以下から不要な初期化 // ルーチンを削除してください。 // 設定が格納されているレジストリ キーを変更します。 // TODO: 会社名または組織名などの適切な文字列に // この文字列を変更してください。 SetRegistryKey(_T("アプリケーション ウィザードで生成されたローカル アプリケーション")); CMFCApplication1Dlg dlg; m_pMainWnd = &dlg; INT_PTR nResponse = dlg.DoModal(); if (nResponse == IDOK) { // TODO: ダイアログが <OK> で消された時のコードを // 記述してください。 } else if (nResponse == IDCANCEL) { // TODO: ダイアログが <キャンセル> で消された時のコードを // 記述してください。 } else if (nResponse == -1) { TRACE(traceAppMsg, 0, "警告: ダイアログの作成に失敗しました。アプリケーションは予期せずに終了します。\n"); TRACE(traceAppMsg, 0, "警告: ダイアログで MFC コントロールを使用している場合、#define _AFX_NO_MFC_CONTROLS_IN_DIALOGS を指定できません。\n"); } // 上で作成されたシェル マネージャーを削除します。 if (pShellManager != nullptr) { delete pShellManager; } #if !defined(_AFXDLL) && !defined(_AFX_NO_MFC_CONTROLS_IN_DIALOGS) ControlBarCleanUp(); #endif // ダイアログは閉じられました。アプリケーションのメッセージ ポンプを開始しないで // アプリケーションを終了するために FALSE を返してください。 return FALSE; }

昔のMFCだとWindowプロシージャで

LRESULT CALLBACK WinProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd,msg,wp,lp); }

みたいな感じで取得できたと勝手に思っているのです……

該当のソースコード

上記の通りです。

試したこと

MFC キー操作 ググってみた
http://bingobingobingo.blog49.fc2.com/blog-entry-245.html

LRESULT CALLBACK WinProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd,msg,wp,lp); }

を埋め込もうと四苦八苦しておりました……
もしくはMFCは諦めてWinMainで作成しようかと迷っております……
https://bituse.info/winapi/4 を見ながら……)

補足情報(FW/ツールのバージョンなど)

VisualStudio2022 MFC C++で開発しております。

どなたかMFCでキー入力の取得方法の調べ方を教えて頂けないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2023/10/19 09:32

> もしくはMFCは諦めてWinMainで作成しようかと迷っております…… どのような背景で、その2択となっているのでしょうか?
akptaro

2023/10/19 10:07

maisumakun様 コメントありがとうございます。 メンテナンス性に優れている方が追々保守作業が出来ると思っていましたので MFCか空のプロジェクトからWinMainでやろうかと思っておりました。
guest

回答2

0

ベストアンサー

どなたかMFCでキー入力の取得方法の調べ方を教えて頂けないでしょうか?

ChatGPT 先生(GPT-4)に聞いたら教えてくれるようです。

https://chat.openai.com/share/4974363c-b5f7-4244-a514-c794763f921f

■ プロンプト
Visual C++でMFCを用いてダイアログアプリケーションを開発しています。
F7キーを押したときのイベントを実装するにはどうしたら良いでしょうか?

■ 回答内容
Visual C++ で MFC を使用してダイアログベースのアプリケーションを開発していて、F7 キーの押下に応じたイベントを取得したい場合、PreTranslateMessage 関数をオーバーライドして、その中で F7 キーの押下を処理できます。以下に、その実装方法の一例を示します。

1.ダイアログクラスのヘッダファイル(.hファイル)で、PreTranslateMessage 関数をオーバーライドする宣言を追加します。

c++

1class CYourDialog : public CDialogEx 2{ 3 // 省略... 4 5public: 6 virtual BOOL PreTranslateMessage(MSG* pMsg); 7 8 // 省略... 9};

2.ソースファイル(.cppファイル)で、PreTranslateMessage 関数をオーバーライドして F7 キーの押下を処理します。

c++

1BOOL CYourDialog::PreTranslateMessage(MSG* pMsg) 2{ 3 // WM_KEYDOWNメッセージとF7キーの押下をチェック 4 if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_F7) 5 { 6 // F7キーが押された場合の処理をここに書く 7 AfxMessageBox(_T("F7 key pressed!")); 8 return TRUE; // メッセージは処理されました 9 } 10 11 // それ以外のメッセージはデフォルトの処理を行う 12 return CDialogEx::PreTranslateMessage(pMsg); 13}

■ VS2022での実行結果
実行結果

久しぶりにいじってみると別にMFCを追加インストールしてみたりしないと駄目なので困惑しておりました。

確かに最近はMFCとかは追加でインストールしないと入らないかも、ですね。。

投稿2023/10/19 12:51

cx20

総合スコア4646

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akptaro

2023/10/20 06:02 編集

ありがとうございます。 以下の方法で出来ました。 久しぶりにMFC見てみて全然覚えていなくて困っていたので助かりました。 ``` BOOL CMFCApplication1Dlg::PreTranslateMessage(MSG* pMsg) { // WM_KEYDOWNメッセージとF7キーの押下をチェック if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_F7) { // F7キーが押された場合の処理をここに書く AfxMessageBox(_T("F7 key pressed!")); return TRUE; // メッセージは処理されました } // それ以外のメッセージはデフォルトの処理を行う return CDialogEx::PreTranslateMessage(pMsg); } ``` 以上ご連絡いたします。 本当にありがとうございました。 ChatGPTに聞くという方法は斬新ですねっ 今度から使ってみようかと思いますm(_ _)m
guest

0

ダイアログで直接 WM_KEYDOWN をハンドルして処理しようとしても,ダイアログ上でフォーカス持ってるコントロールにメッセージが持っていかれるんだか何だったかで上手く行かないハズです.

なので, PreTranslateMessage() をオーバーライドして,そこで「メッセージが WM_KEYDOWN ならば…」みたいな処理を書けばいけるハズです.


手元に VS2022 は無いので,ひょっとしたら変わっているかもしれませんが…
VS2019だと操作的には多分以下の感じになります.

  • クラスビューを表示して,そこでダイアログのクラスを選ぶ.
  • その状態でプロパティウィンドウに行くと,上の方に並んでいる小さいボタン群の中に「オーバーライド」というのがあるのでそこから PreTranslateMessage() のオーバーライドコードを追加できる.

(プロパティウィンドウじゃなくて,クラスビューで右クリックして選べる「クラスウィザード」とかいうやつからも多分やれると思う.けど,使ったことない)

そこに書くコード記述としては,例えば以下のような感じでしょうか.

C++

1BOOL CMFCApplication1Dlg::PreTranslateMessage(MSG* pMsg) 2{ 3 // TODO: ここに特定なコードを追加するか、もしくは基底クラスを呼び出してください。 4 if( pMsg->message == WM_KEYDOWN ) 5 { 6 if( pMsg->wParam == VK_F7 ) 7 { 8 MessageBox( _T("F7押された") ); 9 } 10 } 11 12 //↓これは元から書かれていたやつ 13 return CDialogEx::PreTranslateMessage(pMsg); 14}

投稿2023/10/19 09:34

編集2023/10/19 09:37
fana

総合スコア11954

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2023/10/19 09:42 編集

ん? > 調査方法をお伺いしたい という質問だったか.これは失礼. であれば, 【「MFC ダイアログ キー」とか何とかでググる.メッセージの名前が分かってるなら WM_KEYDOWN とかも含めて検索してみる】 みたいな回答になるべきかな.
fana

2023/10/19 09:44

↑みたいな話であれば, 「質問への回答になってない」だかいう指摘を投じておいてください.
fana

2023/10/19 09:46

それはそれとして,確かに,昔はもっと簡単な操作手順でやれてたような気がする.
akptaro

2023/10/19 10:04

fana様 いえいえご返信ありがとうございます。 以前はもっと簡単でしたよね…… 久しぶりにいじってみると別にMFCを追加インストールしてみたりしないと駄目なので困惑しておりました。 「MFC ダイアログ キー」などでググってみたのですが見つからなかったのですが もう少し探してみます。 例えばF11が押下された場合取得したいとの場合は WM_KEYDOWN ==VK_F11 でやろうかと思っています。 が良いサンプルもう少し探してみます。 コメントありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問