- 題名: 「DateTimePicker」の背景色が変更できない
- 日時: 2009/01/06 9:02:57
- ID: 23730
- この記事の返信元:
- (なし)
- この記事への返信:
- [23771] Re[1]: 「DateTimePicker」の背景色が変更できない2009/01/11 4:09:33
- ツリーを表示
私のPC(XPHome)の場合、Application.EnableVisualStyles()の有無に関わらず、 hana さんのコードでうまくいきました。 しかし、hana さんのPCで動作しないとのことなので、代替案を考えてみました。 非常に苦しいコードですが、とりあえず以下のコードで試してみてください。 (私のPCでは動作しました) # 2009/01/12コードを修正 Public Class DateTimePickerEx_ver2 Inherits DateTimePicker Private ReadOnly WM_PAINT As Integer = &HF Private WithEvents Timer1 As New Timer Public Sub New() Me.Timer1.Interval = 100 ' ← 適宜修正してください Me.Timer1.Start() End Sub Protected Overrides Sub Dispose(ByVal disposing As Boolean) Try If disposing = True Then Me.Timer1.Stop() Me.Timer1.Dispose() End If Finally MyBase.Dispose(disposing) End Try End Sub Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) ' ↓先に、既定の描画処理をさせる MyBase.WndProc(m) If m.Msg = Me.WM_PAINT Then Me.Redraw() End If End Sub Public Function GetControlImage() As Bitmap ' 自分自身の画像をBitmapにコピー Dim bmp As New Bitmap(Me.Width, Me.Height) Me.DrawToBitmap(bmp, New Rectangle(0, 0, Me.Width, Me.Height)) ' Bitmapの背景色をMe.BackColorに変更する Using g As Graphics = Graphics.FromImage(bmp) Dim cm As Imaging.ColorMap() = {New Imaging.ColorMap} cm(0).OldColor = SystemColors.Window cm(0).NewColor = Me.BackColor Dim ia As New Imaging.ImageAttributes() ia.SetRemapTable(cm) Dim r As New Rectangle(0, 0, bmp.Width, bmp.Height) g.DrawImage(bmp, New Rectangle(0, 0, bmp.Width, bmp.Height), _ 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, ia) End Using Return bmp End Function Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick ' ↓をコメントアウトしても、背景色が変更されますか?(Yesなら、タイマー不要) Me.Redraw() End Sub Private Sub Redraw() ' Bitmapを自分の上に描画する Dim bsz As Size = SystemInformation.Border3DSize Using g As Graphics = Me.CreateGraphics, bmp As Bitmap = Me.GetControlImage g.DrawImage(bmp, -bsz.Width, -bsz.Height) End Using End Sub End Class
分類:[.NET]
いつも参考にさせて頂いております。
「DateTimePicker」の背景色が変更出来ない件についてネットに載っていた
下記内容を組み込みました。
「DateTimePicker」を継承したコントロールを作成し、
Private Const WM_ERASEBKGND As Integer = &H14
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
If m.Msg = WM_ERASEBKGND Then
Dim g As Graphics = Graphics.FromHdc(m.WParam)
Dim backBrush As New SolidBrush(Me.BackColor)
g.FillRectangle(backBrush, MyBase.ClientRectangle)
backBrush.Dispose()
g.Dispose()
Return
End If
MyBase.WndProc(m)
End Sub
↑上記処理を追加しました。
テスト時は問題なく変更出来るのを確認できましたが、本番環境に組み込みと
変更されなくなりました。
何が違うのかいろいろためしてみましたが、本番環境に組み込まれている
「Application.EnableVisualStyles()」が原因のようです。
「Application.EnableVisualStyles()」を止めてしまうと画面がまったく
違ったものになってしまうので出来れば避けたいと考えています。
何か他の解決策はないでしょうか?