エディットコントロールから入力文字を取得しチェックボックスコントロールの表示文字に設定する
処理フロー:
・CheckBoxコントロールとEditコントロールをダイアログに貼り付ける
・
入力文字をエディットボックスで入力確定して、文字列が書き変わらないようにできるか?
問題:ボタンクリックイベントハンドラがボタンクリックしても呼ばれない。
→ 対応中。
分からないので質問をした。
ja.stackoverflow.com
質問した後にタブコントロールならではのメッセージ処理の作り方があるのではないかと思い
検索したら、それらしきものがあった。
→ MSDNの「タブ コントロールの通知メッセージの処理」というドキュメント。
docs.microsoft.com
これを読解して、
ボタンクリックイベントハンドラがボタンクリックして呼ばれるように処理を作れるか試してみる。
読解内容:
ユーザーがタブまたはボタンをクリックすると、タブコントロール (CTabCtrl) によって通知メッセージが親ウィンドウに送信されます。
→ ということは、親であるダイアログにクリックメッセージが送信されるということ?
ビューまたはダイアログクラスのタブコントロールから、WM_NOTIFY メッセージを処理します。
→ 親ダイアログがWM_NOTIFY メッセージをOn~NOTIFYで受けるからそれを処理するイベントハンドラを作って、
SendMessegeマクロで子ダイアログにメッセージを送ってみればよい??
クラスウィザードを使用して、処理されている通知メッセージに基づいた switch ステートメントを含むOnChildNotify handler 関数を作成します。
→ ああ、親ダイアログでswitch ステートメントを含むOnChildNotify handler 関数を作成するのかな?
→ うーんでもタブコントロールが親ウィンドウに送信できる通知の一覧見たけど、
ボタンコントロールのクリックを通知するメッセージがなさそうなんだよなぁ....
そのとき、「子ダイアログ ボタン クリック」ともっと細かい検索なら参考になりそうな記事が出てくるかなと思い、
mfc タブコントロール 子ダイアログ ボタン クリック
で検索した。
→
qa.itmedia.co.jp
子ダイアログのウィンドゥプロシージャーを呼ばないと、小ダイアログはメッセージキューに入れられたメッセージを処理できません。
→ これだ!ウィンドウプロシージャを呼べば、メッセージ処理ができそうだ!!
ウィンドウプロシージャの呼び方は?:
・他に、
OnBnClickedAddButtonがprivateになっていたからクラスの中の処理でしか使えず、
クラスの外からくるメッセージを受け取れないのでは?と考えて、publicにしたが、上手くいかないことを確認した。
!!もしかして、tabコントロールの上に作ったインスタンスじゃないからメッセージが受信できない???
【解決】
ja.stackoverflow.com
学んだこと:
作成したクラスを他のクラスで使うときは、includeで作成したクラスを使うクラスに書く。
ポインタで直接クラスのメモリ領域を指してnewしないとイベントハンドラが呼ばれない。
※なぜ↑なのかわからない。
本日意識すること:
検索キーワードを上手く作れるようにする。
具体的には、検索して読解しているサイトから、
よりよい検索キーワードを探して検索してみる。
staticコントロールで表示文字列を変更する基本処理:
void CSampleEditControlDlg::OnBnClickedButton1() { // TODO: ここにコントロール通知ハンドラー コードを追加します。 // エディットコントロールから入力された文字列をm_csMessageに設定 UpdateData(TRUE); // 設定した文字をスタティックテキストコントロールに設定する GetDlgItem(IDC_STATIC)->SetWindowTextW(m_csMessage); }