확인란을 "선택됨"표시기로 이미지를 사용할 수 있습니까?VB.NET : 이미지를 확인란 상자 상태 상자로
나는 배경 이미지를 사용할 수 있지만 레이블 뒤에도 들어가고 또한 (내가 아는 한) 정렬 할 수 없다는 것을 알고있다.
사각형 대신 이미지를 사용하고 레이블과 다른 모든 사용자 지정을 그대로 둘 수 있습니까?
미리 감사드립니다.
확인란을 "선택됨"표시기로 이미지를 사용할 수 있습니까?VB.NET : 이미지를 확인란 상자 상태 상자로
나는 배경 이미지를 사용할 수 있지만 레이블 뒤에도 들어가고 또한 (내가 아는 한) 정렬 할 수 없다는 것을 알고있다.
사각형 대신 이미지를 사용하고 레이블과 다른 모든 사용자 지정을 그대로 둘 수 있습니까?
미리 감사드립니다.
UPDATE # 1 : 사실, @brahm 솔루션은 아래의 나보다 훨씬 낫다!
업데이트 # 2 : 사실, 그렇지 않습니다. 이제 그는 그가 어떻게했는지 보았습니다. 그는 눈에 보이는 상자 Form
의 영역을 벗어나서 체크 박스를 보이지 않게 이동 시켰습니다. 안 좋은 해결책은 ...
이상적인 솔루션은 CheckBox
컨트롤을 서브 클래 싱과 OnPaint
방법을 재정 의하여 자신의 렌더링을 수행하는 것입니다.
더 쉽지만 더 복잡한 솔루션은 PictureBox를 확인란 위에 놓고 의 이미지를 CheckBox
의 CheckedChange
이벤트를 통해 제어하는 것입니다.
다른 옵션 : 제시 한대로 CheckBox
단추 모드 (Appearance = Button
)를 계속 사용할 수 있지만 그 옆에 레이블을 추가 할 수 있습니다. CheckBox
의 선택 상태를 토글하려면 레이블에서 Click
이벤트를 처리하십시오. 최종 결과는 당신이 찾고있는 것을 정확히 제공해야합니다.
이렇게 하시겠습니까?
Dim frm As New Form
frm.Size = New Size(320, 200)
Dim iList As New ImageList
iList.Images.Add(Image.FromFile("check.png"), Color.White)
iList.Images.Add(Image.FromFile("uncheck.png"), Color.White)
Dim chk As New CheckBox
chk.Text = "Check Box With Image"
chk.AutoSize = False
chk.Size = New Size(350, 20)
chk.ImageList = iList
chk.ImageIndex = 1
chk.CheckAlign = ContentAlignment.MiddleRight
chk.ImageAlign = ContentAlignment.MiddleLeft
chk.TextImageRelation = TextImageRelation.ImageBeforeText
chk.Location = New Point(32, 32)
frm.Controls.Add(chk)
AddHandler chk.CheckStateChanged,
Sub(sender1 As Object, e1 As EventArgs)
chk.ImageIndex = IIf(chk.Checked, 0, 1)
End Sub
frm.ShowDialog()
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Windows.Forms.VisualStyles
Public Class ImageCheckBox
Public State As CheckBoxState = CheckBoxState.UncheckedNormal
Public Hot As Boolean = False
Public Pressed As Boolean = False
Public ImageDictionary As Dictionary(Of CheckBoxState, Image) = New Dictionary(Of CheckBoxState, Image)
Private Const PaddingModifier As Integer = 2
Sub New()
Me.New(New Dictionary(Of CheckBoxState, Image) From {
{CheckBoxState.CheckedDisabled, My.Resources.form_checkbox_checked},
{CheckBoxState.CheckedHot, My.Resources.form_checkbox_checked},
{CheckBoxState.CheckedNormal, My.Resources.form_checkbox_checked},
{CheckBoxState.CheckedPressed, My.Resources.form_checkbox_checked},
{CheckBoxState.UncheckedDisabled, My.Resources.form_checkbox_unchecked},
{CheckBoxState.UncheckedHot, My.Resources.form_checkbox_unchecked},
{CheckBoxState.UncheckedNormal, My.Resources.form_checkbox_unchecked},
{CheckBoxState.UncheckedPressed, My.Resources.form_checkbox_unchecked}})
End Sub
Sub New(imageDictionary As Dictionary(Of CheckBoxState, Image))
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
Me.ImageDictionary = imageDictionary
End Sub
Sub CheckBox_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
'Return if the specific Image is not found
If Not ImageDictionary.ContainsKey(State) Then Return
'Get the Size of the CheckBox
Dim glyphSize As Size = CheckBoxRenderer.GetGlyphSize(e.Graphics, State)
'Get the Location of the CheckBox in relation to the Alignment of it
Dim glyphLocation As Point
Select Case Me.CheckAlign
Case Drawing.ContentAlignment.TopLeft
glyphLocation = New Point(Me.Padding.Left, Me.Padding.Top)
Exit Select
Case Drawing.ContentAlignment.TopCenter
glyphLocation = New Point(Me.Padding.Left + (Me.Width - glyphSize.Width)/2, Me.Padding.Top)
Exit Select
Case Drawing.ContentAlignment.TopRight
glyphLocation = New Point(Me.Padding.Left + Me.Width - glyphSize.Width, Me.Padding.Top)
Exit Select
Case Drawing.ContentAlignment.MiddleLeft
glyphLocation = New Point(Me.Padding.Left, Me.Padding.Top + (Me.Height - glyphSize.Height)/2)
Exit Select
Case Drawing.ContentAlignment.MiddleCenter
glyphLocation = New Point(Me.Padding.Left + (Me.Width - glyphSize.Width)/2, Me.Padding.Top + (Me.Height - glyphSize.Height)/2)
Exit Select
Case Drawing.ContentAlignment.MiddleRight
glyphLocation = New Point(Me.Padding.Left + Me.Width - glyphSize.Width, Me.Padding.Top + (Me.Height - glyphSize.Height)/2)
Exit Select
Case Drawing.ContentAlignment.BottomLeft
glyphLocation = New Point(Me.Padding.Left, Me.Padding.Top + Me.Height - glyphSize.Height)
Exit Select
Case Drawing.ContentAlignment.BottomCenter
glyphLocation = New Point(Me.Padding.Left + (Me.Width - glyphSize.Width)/2, Me.Padding.Top + Me.Height - glyphSize.Height)
Exit Select
Case Drawing.ContentAlignment.BottomRight
glyphLocation = New Point(Me.Padding.Left + Me.Width - glyphSize.Width, Me.Padding.Top + Me.Height - glyphSize.Height)
Exit Select
End Select
'Set the drawing Area
Dim glyphRectangle As Rectangle = New Rectangle(glyphLocation, glyphSize)
'Enlarge the Rectangle to completely hide default symbol
Dim clearRectangle As Rectangle = New Rectangle(glyphLocation.X - PaddingModifier,
glyphLocation.Y - PaddingModifier,
glyphSize.Width + 2 * PaddingModifier,
glyphSize.Height + 2 * PaddingModifier)
'Draw the Parent Background over the default CheckBox to clear it
CheckBoxRenderer.DrawParentBackground(e.Graphics, clearRectangle, Me)
Debug.WriteLine(State)
'Finally draw the custom CheckBox image on the position of the default one
e.Graphics.DrawImage(ImageDictionary(State), glyphRectangle)
End Sub
Sub CheckBox_MouseClick(sender As Object, e As EventArgs) Handles Me.MouseClick
Me.Checked = Not Me.Checked
End Sub
Sub CheckBox_MouseDown(sender As Object, e As MouseEventArgs) Handles Me.MouseDown
Me.Pressed = True
End Sub
Sub CheckBox_MouseUp(sender As Object, e As MouseEventArgs) Handles Me.MouseUp
Me.Pressed = False
End Sub
Sub CheckBox_MouseEnter(sender As Object, e As EventArgs) Handles Me.MouseEnter
Me.Hot = True
End Sub
Sub CheckBox_MouseLeave(sender As Object, e As EventArgs) Handles Me.MouseLeave
Me.Hot = False
End Sub
Public Sub updateState() Handles Me.MouseClick, Me.MouseDown, Me.MouseUp, Me.MouseEnter, Me.MouseLeave, Me.EnabledChanged
Debug.WriteLine(Me.Checked & " " & Me.Enabled & " " & Me.Hot & " " & Me.Pressed)
Me.State = CurrentState()
Me.Refresh()
Debug.WriteLine(State)
End Sub
Public Function CurrentState() As CheckBoxState
If (Me.Checked) Then
If (Not Me.Enabled) Then Return CheckBoxState.CheckedDisabled
If (Me.Pressed) Then Return CheckBoxState.CheckedPressed
If (Me.Hot) Then Return CheckBoxState.CheckedHot
Return CheckBoxState.CheckedNormal
Else
If (Not Me.Enabled) Then Return CheckBoxState.UncheckedDisabled
If (Me.Pressed) Then Return CheckBoxState.UncheckedPressed
If (Me.Hot) Then Return CheckBoxState.UncheckedHot
Return CheckBoxState.UncheckedNormal
End If
End Function
End Class
이상적인 해결책은'CheckBox' 컨트롤을 서브 클래스 화하고'OnPaint' 메소드를 오버라이드하여 렌더링을하는 것입니다. 더 쉬운 방법 일지는 모르겠지만, 체크 박스 위에'PictureBox'를 놓고'CheckBox'의'CheckedChange' 이벤트를 통해'PictureBox'에서 이미지를 제어하는 것이 더 쉽습니다. – xfx
그냥 생각했듯이, 코스 일을위한 것이기에, 나는 아무 것도하지 않고 배경 이미지를 스위치와 레이블없이 사용합니다. 답장으로 의견을 게시하면 받아 들일 수 있습니다. –
당신은 당신이 필요로하는 논리로 당신 스스로 체크 박스를 그릴 수 있습니다. 예를 들어 실제로이 확인란을 다른 모양으로 표시하는이 [toggle switch] (http://stackoverflow.com/a/38432140/3110834) 예제를 살펴보십시오. –