PictureBox 컨트롤의 맨 위에 사용자 지정 사용자 정의 컨트롤을 배치하려고하지만 사용자 컨트롤의 투명도를 설정하는 방법과 달리 생각할 수 없습니다. PictureBox 이미지를 잘라냅니다.PictureBox를 통해 투명 컨트롤을 투명하게 만들 수 없습니다.
내 사용자 정의 컨트롤은 중간에 텍스트가있는 사각형 모양으로 구성되어 이미지 위에 '배지'아이콘을 만듭니다 (아래 그림 참조). PictureBox와 User Control은 모두 Panel 컨트롤 안에 있으며, PictureBox.SendToBack()
속성과 UserControl.BringToFront()
속성을 설정했습니다. 내가 왼쪽하고 무엇
은 이것이다 :
내 코드는 다음과 같습니다 : 다음
Option Explicit On
Option Strict On
Imports Microsoft.VisualBasic.PowerPacks
Public Class BadgeIcon
Inherits UserControl
Private _value As Integer
Private canvas As New ShapeContainer
Private Badge_Icon As New RectangleShape
Private rect As New Rectangle
Private m_BorderColor As Color = Color.White
Private m_FillColor As Color = Color.Red
Private m_BorderThickness As Integer = 2
Private m_BadgeFont As New Font("Segoe UI", 7, FontStyle.Bold)
Private m_BadgeText As String
Private m_TextColor As New SolidBrush(Color.White)
Private m_TextSize As Size
Private m_TextPadding As Integer = 5
Public Property Value() As Integer
Get
Return _value
End Get
Set(value As Integer)
_value = value
m_BadgeText = CStr(_value)
m_TextSize = TextRenderer.MeasureText(m_BadgeText, m_BadgeFont)
rect.Width = m_TextSize.Width + m_TextPadding
rect.Height = m_TextSize.Height + m_TextPadding
Me.Refresh()
End Set
End Property
Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams
Get
Dim cp As CreateParams = MyBase.CreateParams
cp.ExStyle = &H20
Return cp
End Get
End Property
Sub New()
' This call is required by the designer.
InitializeComponent()
SetStyle(ControlStyles.SupportsTransparentBackColor, True)
SetStyle(ControlStyles.Opaque, False)
SetStyle(ControlStyles.DoubleBuffer, True)
SetStyle(ControlStyles.AllPaintingInWmPaint, True)
SetStyle(ControlStyles.UserPaint, True)
Me.BackColor = Color.FromArgb(0, 0, 0, 0)
UpdateStyles()
' Add any initialization after the InitializeComponent() call.
canvas.Parent = Me
Badge_Icon.Parent = canvas
canvas.BackColor = Color.FromArgb(0, 0, 0, 0)
'Create Badge Icon
With Badge_Icon
.BackColor = Color.FromArgb(0, 0, 0, 0)
.BorderColor = m_BorderColor
.BorderWidth = m_BorderThickness
.BorderStyle = Drawing2D.DashStyle.Solid
.CornerRadius = 11
.FillColor = m_FillColor
.FillStyle = FillStyle.Solid
.SelectionColor = Color.Transparent
End With
AddHandler Badge_Icon.Paint, AddressOf BadgeIcon_Paint
End Sub
Protected Overrides Sub OnPaint(e As PaintEventArgs)
MyBase.OnPaint(e)
DrawBadgeIcon(e)
End Sub
Public Sub DrawBadgeIcon(e As PaintEventArgs)
Try
'Alter the size of the icon to fix the text
With Badge_Icon
.Location = New Point(rect.Left + 1, rect.Top + 1)
.Size = New Size(rect.Width, rect.Height - 1)
End With
Catch ex As Exception
ErrorTrap(ex, "cls_NotificationBadgeIcon: DrawBadgeIcon()")
End Try
End Sub
Private Sub BadgeIcon_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs)
Dim textRect As New Rectangle(2, 2, m_TextSize.Width + m_TextPadding - 1, m_TextSize.Height + m_TextPadding - 2)
'Draw the Text
Dim flags As New StringFormat
flags.Alignment = StringAlignment.Center
flags.LineAlignment = StringAlignment.Center
e.Graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.ClearTypeGridFit
e.Graphics.DrawString(m_BadgeText, m_BadgeFont, m_TextColor, textRect, flags)
End Sub
End Class
내가 다음에 전화 내 주요 양식에 모든 것을 추가하려면 :
Dim pic As New PictureBox
pic.Image = My.Resources.Notifications
pic.SizeMode = PictureBoxSizeMode.StretchImage
pic.Location = New Point(21, 221)
pic.Size = New Size(42, 29)
pnlLeftMenuBar.Controls.Add(pic)
pic.SendToBack()
Dim Counter_Notify As New BadgeIcon
Counter_Notify.Location = New Point(50, 240)
pnlLeftMenuBar.Controls.Add(Counter_Notify)
Counter_Notify.BringToFront()
Counter_Notify.Value = 1
을 사용하여 카운터 값을 업데이트하십시오.
배경 이미지를 잘라내는 사각형 사각형을 제거하려면 어떻게해야합니까? 아니면 완전히 다른 방식으로 설정해야합니까? 나는 사용자 컨트롤에 조금 익숙하다.
도움을 주시면 감사하겠습니다. 감사합니다
투명한 배경이 아니라는 생각은 당신이 생각하는 바를 의미하지 않습니다. 투명 BG의 경우 Net/Windows는 부모 배경색을 사용합니다. 당신의 UC의 부모가 패널이기 때문에 무엇이 칠할 것입니까. 다른 것들이있는 폼에서 Label을 드래그하면 변경되는 것을 볼 수 있습니다. 스태킹 컨트롤 대신 수정하려는 이미지 위에 배지/오버레이를 그릴 수 있습니다. – Plutonix
@Plutonix Ah okay ... 나는 필자에게 필자가 요구 한 결과를주는 패널에 이미지를 직접 그리는 것으로 놀았지만, 이미지 (예 : 툴팁 및 클릭 이벤트)에 어떤 이벤트 핸들러도 붙일 수 없었다. 그래서 저는 그림 상자를 가지고갔습니다. 그럼이 문제에 대해서는 어쨌든 거기에 있습니까? – Riples
이미지 위에 오버레이를 그리고 패널 또는 픽스 박스에 이미지를 게시하고 클릭을 위해 컨트롤의 이벤트를 사용합니다. – Plutonix