文系未経験から一人前のプログラマーになるまでの日記

文系未経験でプログラマーとして採用してもらえたものの、プログラミング業務ができずに伸び悩んでいるプログラマーが会社で役に立てるようになるまでの日記です。

エディットコントロールから入力文字を取得しチェックボックスコントロールの表示文字に設定する

処理フロー:
・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);
}