はじめまして。VC++3ヶ月目の超初心者SEです。
環境はVC++6.0 Win98 です。
CButton,CStatic,CEditの各派生クラスを作成し、
とあるファイルからデータを読み込んで、
そのデータ通りに、任意のダイアログにあるButton,
Static,EditBox等の背景色やフォントサイズを変更して
DialogをModalさせたときに反映させたいのです。
もちろん、ボタンのID等は、そのデータファイルに書いてあります。
(要は,ダイアログと、各コントロールのデザインのデータを
完全に分離して、このクラスを継承することによって、
データを書き換えることによって自由にカスタマイズしたい という意味です)
また、任意のDialogには、何もソースを書き足してはいけない
という制約があることです。
とはいっても全く書かないと不可能なので
各コントロールは、派生クラスのメンバーにしてやることを可としています。
(IDC_EDIT1 の場合なら、CEditXXX m_edit1; というふうに。)
そこで質問なのですが、このような場合に各派生クラス(CEdit,CButton等)で
どんな関数を、どのようにオーバーライドしてやれば,
読み込んだデータを反映させられるのでしょうか。
フォント関係は、SetWindowTextあたりだと思うんですが、
コントロールの背景等の色関係は、さっぱりわかりません。
わかりづらい説明で申し訳ないのですが、
何卒宜しくお願いします。
背景色変更はWM_CTLCOLORをオーバーライドし任意のブラシを返す(ボタンはオーナードローしない
といけないでしょう)。
フォント変更はフォントを作成してSetFontすればいいでしょう。
で、どこでフォントを作り、SetFontすればいいかという話になると思いますが、最初のWM_PAINT
のときにやってやればいいんでしょうかね。
親で操作したらいけないということなので。
CdSさん レスありがとうございます。
数日間ネットにつながらない状態だったので、
返事が遅くなって本当に申し訳ありませんでした。
あれから私なりに、思考錯誤してみたのですが、
EditBoxとStaticに関しては何とか成功しました。
ちなみに、SetWindowTextをオーバーライドして、
OnPaintでほぼ処理しました。
ありがとうございました。
しかし、Buttonだけは どうやってもうまくいきません。
というのも、各派生クラスのOnPaintの部分で処理をすると、
DoModalさせるまでに、クラス派生のほうにWM_CTLCOLORのメッセージが来ないからです。
(BreakPointを置いて,OnPaintを置いた場合と置かない場合をチェックした結果です)
ちなみに、OnPaintだけで処理をしようとすると
ボタンを押した後、再描画メッセージがかからず
他のボタンを押すなり何なりをしないと 再描画されませんでしたし、
そもそもボタンっぽく無い描画になります(^^;
(SetBkColorとSetTextColorとFillSolidRectを使った為)
>背景色変更はWM_CTLCOLORをオーバーライドし任意のブラシを返す(ボタンはオーナードローしない
といけないでしょう)。
もしよろしければ、この場合の具体的な方法を
教えていただけないでしょうか?
きっとボタンっぽい描画になるような直感がするので(^^;
何卒宜しくお願いします。
>ちなみに、SetWindowTextをオーバーライドして、
がよく分からないですけど。
WM_CTLCOLORの間違い?
カラーボタンについてはcodeguruに載っているので参考にしてください。
http://codeguru.earthweb.com/