質問: ダイアログボックスについて。 ダイアログボックスについての質問です。 開発環境はvisual c++ 2005.netでありsdkを利用しています。 ダイアログボックスにpicture controlを貼り付け、combo boxの内容が変わるたびにそのpicture controlに画像を表示するようなプログラムを作りたいと考えています。 自分が考える手順としてはまずpicture controlについてサブクラス化を行い、親のダイアログボックスが表示されると同時にpicture controlのプロシージャでwm_createメッセージを受け取り描画を行う。 そして親のダイアログボックスに貼り付けたcombo boxの内容が変更された場合に、picture controlのウィンドウハンドルにむけてwm_paintメッセージを送信する。 こんな手順で行いたいのですが、少し不安な部分が出てきました。 combo boxの内容が変更され、picture controlのウィンドウハンドルに向けてwm_paintメッセージを送信し、picture controlプロシージャではwm_paintメッセージがきたとき画像の描画を行う場合、このプロシージャではどの画像を描画してよいか不明です。 そのため何番の画像の表示命令が来たのかを示すために、親のダイアログボックスに貼り付けたcombo boxが変更された場合、picture controlに向けてwm_paintメッセージと表示画像番号をパラメータとして送信したいのです。 もちろんグローバル変数を用意すれば簡単なのですが、できるだけ使用しないように記述をしたいのです。そこで考えたのが、 sendmessage(getdlgitem(hdlgwnd, idc_picture), wm_paint, 0, makelparam(0, number)); このようにnumberをlparamの下位ワードとして送信しようと考えました。 このメッセージ送信を行い、picture controlプロシージャでwm_paintメッセージが到着したとき、loword(lparam)からnumberを取り出す。 実現したい目的のため、このような方法を考えましたが、エラーなく実行できるでしょうか? もしあやしい部分が見つかった場合はアドバイスをお願いします。そしてこの方法よりも簡単に処理できる方法があれば教えていただきたいです。 自分としてはサブクラス化は面倒なので、picture controlをオーナードローとして扱う方法も考えましたが、うまく動きませんでしたtt
回答: >sendmessage(getdlgitem(hdlgwnd, idc_picture), wm_paint, 0, makelparam(0, number)); wm_paintは自分が呼ぶだけではありません。 wm_paintは意図しないタイミングでos側から呼ばれる事もあります。 というか描画の度に呼ばれているウインドウメッセージです。 wm_paintはlparamもwparamも使わないようなのでウインドウメッセージなので実行には問題はないでしょうが どちらにしてもidc_pictureのwm_paint内でそのnumberを保持する必要があるでしょう。 結局、関数内部でstatic変数で持つかグローバル変数なりで持つしかないということです。 もちろんグローバル変数を直に持つのはコード的に綺麗とはいえないため どういうコードが美しいかは人によりますが一つの例として wndprocをラップしたクラスを作り、メンバ変数として持つ等の方法はあります。 やはりint g_number;等のグローバルで持つのが単純ですが、その場合は コンボボックス変更時に g_numberを変更し、 invalidaterect( getdlgitem(hdlgwnd, idc_picture) , bull , false )等で再描画を促します。 >picture controlのプロシージャでwm_createメッセージを受け取り描画を行う。 wm_paintですよね?