- 題名: 「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()」を止めてしまうと画面がまったく
違ったものになってしまうので出来れば避けたいと考えています。
何か他の解決策はないでしょうか?