クラスにしようと思ったのだがね

| コメント(0) | トラックバック(0)

よくある話。

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って無かったか?と思いだす罠。

トラックバック(0)

トラックバックURL: https://blog.fne.jp/mt/mt-tb.cgi/47

コメントしちゃいなよ

    

サイトカウンタ

Total: 211,632 Hits, (Recent24Hours: 0 Hits)
~ Since 2010/01 ~

埋め込みツイッター

取得失敗;;
Now: 2024/11/21 18:15:43 JST

このブログ記事について

このページは、ふぅみんが2009年12月25日 21:54に書いたブログ記事です。

ひとつ前のブログ記事は「#007FFF」です。

次のブログ記事は「70-562 リベンジ」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

2024年5月

 日   月   火   水   木   金   土 
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

埋め込みQRコード