2013-01-14 2 views
1

확인란을 "선택됨"표시기로 이미지를 사용할 수 있습니까?VB.NET : 이미지를 확인란 상자 상태 상자로

나는 배경 이미지를 사용할 수 있지만 레이블 뒤에도 들어가고 또한 (내가 아는 한) 정렬 할 수 없다는 것을 알고있다.

사각형 대신 이미지를 사용하고 레이블과 다른 모든 사용자 지정을 그대로 둘 수 있습니까?

미리 감사드립니다.

+0

이상적인 해결책은'CheckBox' 컨트롤을 서브 클래스 화하고'OnPaint' 메소드를 오버라이드하여 렌더링을하는 것입니다. 더 쉬운 방법 일지는 모르겠지만, 체크 박스 위에'PictureBox'를 놓고'CheckBox'의'CheckedChange' 이벤트를 통해'PictureBox'에서 이미지를 제어하는 ​​것이 더 쉽습니다. – xfx

+0

그냥 생각했듯이, 코스 일을위한 것이기에, 나는 아무 것도하지 않고 배경 이미지를 스위치와 레이블없이 사용합니다. 답장으로 의견을 게시하면 받아 들일 수 있습니다. –

+0

당신은 당신이 필요로하는 논리로 당신 스스로 체크 박스를 그릴 수 있습니다. 예를 들어 실제로이 확인란을 다른 모양으로 표시하는이 [toggle switch] (http://stackoverflow.com/a/38432140/3110834) 예제를 살펴보십시오. –

답변

1

UPDATE # 1 : 사실, @brahm 솔루션은 아래의 나보다 훨씬 낫다!

업데이트 # 2 : 사실, 그렇지 않습니다. 이제 그는 그가 어떻게했는지 보았습니다. 그는 눈에 보이는 상자 Form의 영역을 벗어나서 체크 박스를 보이지 않게 이동 시켰습니다. 안 좋은 해결책은 ...


이상적인 솔루션은 CheckBox 컨트롤을 서브 클래 싱과 OnPaint 방법을 재정 의하여 자신의 렌더링을 수행하는 것입니다.

더 쉽지만 더 복잡한 솔루션은 PictureBox를 확인란 위에 놓고 의 이미지를 CheckBoxCheckedChange 이벤트를 통해 제어하는 ​​것입니다.

다른 옵션 : 제시 한대로 CheckBox 단추 모드 (Appearance = Button)를 계속 사용할 수 있지만 그 옆에 레이블을 추가 할 수 있습니다. CheckBox의 선택 상태를 토글하려면 레이블에서 Click 이벤트를 처리하십시오. 최종 결과는 당신이 찾고있는 것을 정확히 제공해야합니다.

3

이렇게 하시겠습니까?

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() 
0
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 
관련 문제