Blog~2016-06-06ボタンのクラス化(WindowsAPI)ボタンのクラス化は結構大変・・・。ボタンが押された時、WM_COMMANDは親ダイアログに通知されるので、親ダイアログのハンドラにそれに対する処理を書けばいい・・・。それだと親ダイアログが肥大化しそうなので、各ボタンクラスオブジェクトにそのボタンのイベントハンドラを用意し、そこで処理させてみる・・・。基底クラスCButtonは、Button.hが、Button.cppが、としている・・・。CWindowの派生クラスで定義されていて、CButton::Createは、子ウィンドウとなるボタン用のメンバ関数なので引数がいくつか省略されている・・・。呼び出しているCWindow::Createも新たな引数を追加・・・。bProcChangeはデフォルトがFALSEだが、子ウィンドウの場合はTRUEを指定・・・。すると、OnCreateの実行と、プロシージャの差し替え、が行われる・・・。"Button"ウィンドウクラスのまま、プロシージャを差し替えてカスタマイズしたいのだが、そうするとOnCreateが呼ばれないのでこのタイミングで・・・。ウィンドウオブジェクトはm_mapWindowMapで管理・・・。"Button"元々のウィンドウプロシージャをCallWindowProcで呼ぶ必要があるので、そのプロシージャはm_mapBaseWindowProcMapを用意し、これに登録・・・。StaticWindowProcもこれに合わせて、このように変更・・・。DynamicWindowProcも、とする・・・。あ、オリジナルのウィンドウクラスの場合は、RegisterClassの時にDefWindowProcを登録する・・・。CDialogのOnInitDialogで、EnumChildWindowsで子ウィンドウを列挙する・・・。CreateWindowObjectという関数で、子ウィンドウのウィンドウハンドルやウィンドウクラス名から、子ウィンドウオブジェクトを取得・・・。それをm_mapChildWindowsMap、m_mapBaseWindowProcMap、m_mapWindowMapに登録・・・。子ウィンドウマップは、親であるダイアログが破棄される前に、子ウィンドウを一斉に破棄するために使う・・・。引数でもらったハンドルなどのウィンドウ情報からオブジェクト(この場合はCButton)を作成し返してるだけ・・・。子ウィンドウのリソースIDごとに子ウィンドウオブジェクトを振り分けられる・・・。DialogBoxParamでダイアログを表示した時、すでに子ウィンドウは生成されていて、ウィンドウハンドルとウィンドウオブジェクトを紐づけるOnCreateみたいな部分がないので、こうやってOnInitDialogで子ウィンドウを列挙して、子ウィンドウごとにウィンドウオブジェクトを作成し紐づけている・・・。ボタンを押すと、親ダイアログCAboutDialogのOnCommandに来るので、該当する子ウィンドウオブジェクトのChildCommandProcを呼ぶ・・・。CButtonのChildCommandProcで、HIWORD(wParam)の通知コードがBN_CLICKEDなら、ボタンクリックなので、OnBnClickedを処理・・・。CUpdateCheckButtonなら、メッセージボックス・・・。COKButtonなら、SendMessageでWM_CLOSEを送って、ダイアログを閉じる・・・。Createでウィンドウ上にボタンを置くこともできる・・・。(この辺はMainWindow参照・・・。)でも、今回はダイアログ上のボタンをどうクラス化するかという問題だったので・・・。エディットパネルにエディットコントロールの設置エディットパネルにエディットボックスを設置する・・・。子ウィンドウを作成し、追加する・・・。一気にウィンドウのクラス化を進める・・・。(27)はてなブログをはじめよう!BG1さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。