よくある話。
VC++のWin32(非MFC)のウィンドウアプリケーションプロジェクトのひな型では、クラス化されてないコードでだらだら書かれているので、クラス化したいなぁと思うわけだ。
思うことは自由なんだけど、WndProcコールバックがクラスメンバだからということで、いろいろ困難が付きまとう。
よくある話ってのはここから先。
staticメンバにするのはいいけれど、それだけじゃ、継承できない。
非staticメンバを呼び出す必要があるってことに気付くと、今度はCreateWindowの戻り(HWND)とクラスポインタを結びつけるとかして、ごにょごにょすることを考える。
HWNDからクラスポインタを引っ張って、メンバを呼び出すとこまでをstaticにしてコールバック指定すればいいわけだ。
いや、よくない。
実は、CreateWindowから戻ってくる前に、WndProcは何度かコールバックされるわけだよ。
WM_CREATEとかをとりこぼすわけだ。
そう考えると、MFCってすげぇ楽できるのはいいなぁってことなんだけど。
・・・
というところまでがよくある話でござった。
で、終わりじゃない。
要は、CreateWindowを実行する前に、何らかの方法で保存し、コールバック側で取り出せればいいわけだけど、言うのは簡単。
CreateWindowは恐らく返却値を判断するため、WndProcコールバックするのを同期処理で行っているので、わざわざ別スレッドで起動されることはない。
ということはスレッドローカルな記憶領域に自クラスポインタを一時保存しておけば、なんとかなりそうということは分かる。
TLSを使うことは思い付くけど、TLSにはいろいろと制限が付きまとうので、できれば別の方法で。
で、今のところなんとかなっているのは、スレッドIDとペアにしたSTLのmapクラスを利用した一時記憶を利用する方法。
って、文章で書いていても分からんから、まだ途中だけど、コード載せておこうと思う。
Form.h
Form.cpp
WM_CREATEを通過できるところまで確認したところ。
ちゃんとできたら1ページ用意する。
ここまで書いて、CreateWindowExって無かったか?と思いだす罠。
コメントしちゃいなよ