QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

背景色の変更

はじめて投稿いたします。
shoと申します。

VC#.netで画面の開発を行っているのですが、
動的にDataTimeの背景色を変更しなければなりません。
MSDNにはDataTimeのBackColorプロパティの説明があり
背景色を変更できるようなことが書いてあったのですが
力足らずで背景色の変更ができませんでした。

背景色を変更するにはどのようにすればよいのでしょうか。
よろしくお願いします

質問者:sho

回答

私もやり方を探していましたら、
C#のMLに答えを書いてくれていた人がいらっしゃいました。
ちょっと変えていますが・・・

DateTimePicker を継承したコントロールで・・・

protected override void WndProc(ref Message m)
{
if ( m.Msg == 0x14 ) // WM_ERASEBKGND
{
Graphics g = Graphics.FromHdc( m.WParam );
SolidBrush backBrush = new SolidBrush( this.BackColor );
g.FillRectangle( backBrush, base.ClientRectangle );
backBrush.Dispose();
g.Dispose();
return;
}
base.WndProc( ref m );
}

で、いけました。

投稿者:PAO

編集 履歴 (0)

早速のご回答ありがとうございます。

はぁ、バグなんですねぇ・・・
別な方法考えます。

投稿者:sho

編集 履歴 (0)

たびたびすみません

ちょこっと思い出したんですが、
MFCでDateTimePickerの背景色を変更したいときは
DateTimePickerのサブクラスを作成し、
コントロールの型は、このサブクラスとします。
で、このサブクラス中にOnEraseBkgndのイベントを作成して
FillSolidRectを呼んでやると背景色の変更ができたました。

VC#.netではそこら辺の応用できないでしょうか?
すみませんが、よろしくお願いします。

投稿者:sho

編集 履歴 (0)

確かにOnPaintBackgroundメソッドなどをオーバーライドして、
Graphics.FillRectangle メソッド等を呼び出せばできそうなのですが、
DateTimePickerコントロールのset_BackColor周辺のBUGなので、
OnPaintBackgroundをオーバーライドしても再描画の時には呼び出してもらえません。
従って、DateTimePickerコントロールのWndProcメソッドをオーバーライドして
メッセージを処理すれば、できるかもしれません。
他には、背景色を変更するときなど適当なときにTextBox(ComboBox)と差し替えるということもできそうです。

投稿者:ant

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。