読者です 読者をやめる 読者になる 読者になる

エディットボックスのクラス化(WindowsAPI)

エディットボックスに入力されたテキストを取得、またはエディットボックスにテキストをセット、といった部分をクラス化・・・。

基底クラスとなるCEditの定義は、

tstringをdefineしてstd::wstringとstd::stringのUNICODE切り替えに対応・・・。

そのtstringのm_tstrTextがエディットボックスのテキスト・・・。

実際には、

テキストをセットするSetWindowTextとテキストを取得するGetWindowTextで操作・・・。

SetWindowTextは、WindowsAPIのSetWindowTextでセット・・・。

GetWindowTextも、WindowsAPIのGetWindowTextで取得・・・。

今回はコピーコストを考えず、そのまま引数や戻り値をコピー・・・。
この辺の課題については、いずれ修正する・・・。

CEditの派生で、実際に置くIDC_EDIT1と紐づけるCEdit1は、

これだけ・・・。事実上、何も実装していないようなもの・・・。

さて、これを生成する仕組みだが、

子ウィンドウが親のオブジェクトを持てないので、CWindowのメンバにCWindowとCDialogの親ポインタを用意・・・。
ウィンドウとダイアログが処理の流れ上、別クラスになってるので、これらの統合も今後の課題・・・。

ウィンドウを作成したら、ウィンドウマップやダイアログマップから親を探してポインタにセット・・・。
Createの場合はこれでいいが、ダイアログの場合はリソースに定義しているのもあるので、

EnumWindowsProcでCreateWindowObjectした後に親ダイアログポインタを覚えておく・・・。
そして、

GetWindowObjectFromIDは、子ウィンドウのリソースIDから子ウィンドウオブジェクトを引く関数・・・。

これで子ウィンドウから親ダイアログを経由して、別の子ウィンドウを呼び出す仕組みはできたので、

CButton2やCEdit1も生成できるように・・・。

UpdateCheckButtonが押されたら、m_pParentDlg->GetWindowObjectFromIDでオブジェクトを取得し、pEdit1->GetWindowTextでテキストを取得、MessageBoxで表示・・・。

Button2が押されたら、m_pParentDlg->GetWindowObjectFromIDでオブジェクトを取得し、pEdit1->SetWindowTextで"ABCDE"をセット・・・。

f:id:BG1:20160607172033p:plain

一応、ウィンドウにエディットボックスをCreateでも作るようにはしてる・・・。

f:id:BG1:20160607172134p:plain

"あいうえお"とセットして"アップデートの確認"ボタンを押す・・・。

f:id:BG1:20160607172202p:plain

テキストの取得出来てる・・・。
Button2を押すと、

f:id:BG1:20160607172228p:plain

"ABCDE"に変わったので、テキストのセットもできてる・・・。

Test/edit/class_edit/winapi/src/CEdit/CEdit at master · bg1bgst333/Test · GitHub