わかりましたので...フォントサイズに基づいて実際にグリフのサイズを変更するカスタムチェックボックスを作成しようとしています(これを実装しないためにMSにアクセスしてください)。これを適切に行うには、コントロールの OnPaint イベントを完全にオーバーライドする必要があります。ただし、コントロールが透明に設定されていると問題が発生します。
親コントロール(私は今のところ透明度のレイヤーを1つだけ実行しています)に境界線がない場合(具体的にはFormBorderStyle = Noneに設定されているWindowsフォーム)完全に機能します。ただし、それを何かに設定している場合、座標はオフですビットマップの間違ったセクションをつかむ. 違いを示すために、コードの下にスクリーンショットへのリンクを投稿しました. 境界線で正しく配置されない理由がわかりません. クライアントのサイズに関係していると思いますが、できますまた、「drawtobitmap」関数を使用すると、OnPaint は自分自身を ALOT 再帰し、コントロールの描画が遅くなりますが、これを止める方法はありますか?
ここに関連するコードがあります
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
OnPaintBackground(e)
If MyBase.Appearance = Appearance.Button Then
MyBase.OnPaint(e)
Else
End If
End Sub
Protected Overrides Sub OnPaintBackground(ByVal e As System.Windows.Forms.PaintEventArgs)
If BackColor = Color.Transparent Then
Dim ctl As Control = Parent
Dim bmp As New Bitmap(ctl.ClientSize.Width, ctl.ClientSize.Height)
ctl.DrawToBitmap(bmp, New Rectangle(0, 0, ctl.ClientSize.Width, ctl.ClientSize.Height))
Dim rect As New Rectangle((ctl.Size.Width - ctl.ClientSize.Width) + Left, (ctl.Size.Height - ctl.ClientSize.Height) + Top, ClientSize.Width, ClientSize.Height)
e.Graphics.FillRectangle(New TextureBrush(CropImage(bmp, rect)), ClientRectangle)
ctl.Text = ((ctl.Size.Width - ctl.ClientSize.Width) + Left).ToString + " " + ((ctl.Size.Height - ctl.ClientSize.Height) + Top).ToString + " " + ClientSize.Width.ToString + " " + ClientSize.Height.ToString
bmp.Dispose()
Else
e.Graphics.FillRectangle(New SolidBrush(MyBase.BackColor), ClientRectangle)
End If
End Sub
Private Function CropImage(ByVal source As Image, ByVal crop As Rectangle) As Bitmap
Dim bmp = New Bitmap(crop.Width, crop.Height)
Using gr = Graphics.FromImage(bmp)
gr.DrawImage(source, New Rectangle(0, 0, bmp.Width, bmp.Height), crop, GraphicsUnit.Pixel)
End Using
Return bmp
End Function