2014-09-26 2 views
1

PictureBox 컨트롤의 맨 위에 사용자 지정 사용자 정의 컨트롤을 배치하려고하지만 사용자 컨트롤의 투명도를 설정하는 방법과 달리 생각할 수 없습니다. PictureBox 이미지를 잘라냅니다.PictureBox를 통해 투명 컨트롤을 투명하게 만들 수 없습니다.

내 사용자 정의 컨트롤은 중간에 텍스트가있는 사각형 모양으로 구성되어 이미지 위에 '배지'아이콘을 만듭니다 (아래 그림 참조). PictureBox와 User Control은 모두 Panel 컨트롤 안에 있으며, PictureBox.SendToBack() 속성과 UserControl.BringToFront() 속성을 설정했습니다. 내가 왼쪽하고 무엇

은 이것이다 :

enter image description here enter image description here

내 코드는 다음과 같습니다 : 다음

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을 사용하여 카운터 값을 업데이트하십시오.

배경 이미지를 잘라내는 사각형 사각형을 제거하려면 어떻게해야합니까? 아니면 완전히 다른 방식으로 설정해야합니까? 나는 사용자 컨트롤에 조금 익숙하다.

도움을 주시면 감사하겠습니다. 감사합니다

+2

투명한 배경이 아니라는 생각은 당신이 생각하는 바를 의미하지 않습니다. 투명 BG의 경우 Net/Windows는 부모 배경색을 사용합니다. 당신의 UC의 부모가 패널이기 때문에 무엇이 칠할 것입니까. 다른 것들이있는 폼에서 Label을 드래그하면 변경되는 것을 볼 수 있습니다. 스태킹 컨트롤 대신 수정하려는 이미지 위에 배지/오버레이를 그릴 수 있습니다. – Plutonix

+0

@Plutonix Ah okay ... 나는 필자에게 필자가 요구 한 결과를주는 패널에 이미지를 직접 그리는 것으로 놀았지만, 이미지 (예 : 툴팁 및 클릭 이벤트)에 어떤 이벤트 핸들러도 붙일 수 없었다. 그래서 저는 그림 상자를 가지고갔습니다. 그럼이 문제에 대해서는 어쨌든 거기에 있습니까? – Riples

+0

이미지 위에 오버레이를 그리고 패널 또는 픽스 박스에 이미지를 게시하고 클릭을 위해 컨트롤의 이벤트를 사용합니다. – Plutonix

답변

0

페인트 이벤트를 사용하면 그림 상자 자체를 그릴 수 있습니다.

Private Sub pb__Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles pb.Paint 
Dim bgRect As New Rectangle({x,y,width,height}) 
Dim textRect As New Rectangle(bgRect.X - {?}, bgRect.Y = {?}, width, height) 
e.Graphics.FillEllipse(New SolidBrush(Color.Red), bgRect) 
e.Graphics.DrawEllipse(New Pen(Color.White, 10), bgRect) 
Using sf As New StringFormat 
    sf.LineAlignment = StringAlignment.Center 
    sf.Alignment = StringAlignment.Center 
e.Graphics.DrawString("1", {your font}, {your brush}, textRect, sf) 
End Using 
End Sub 
+0

예를 통해 작업하고 이와 같이 보일 수 있습니다. 어쨌든 나는 타원을 둥근 사각형으로 변경할 수 있습니까? 더 많은 텍스트를 배지에 넣을수록 타원처럼 보이기 시작합니다 (피하려고했던 것입니다)? – Riples

+0

타원의 모양이 높이와 너비에 달려 있습니다. 둘레가 같고 타원이 아닌 경우 – OneFineDay

+0

죄송합니다. 그러나 타원이 높이가 아닌 너비 방향으로 만 자르길 원합니다. 텍스트의 너비에 따라 타원의 너비가 커지도록 예제를 조정했지만 3 자리가되면 타원형을 얻습니다. – Riples