使用

时间:2018-01-25 04:44:30

标签: vb.net label panel picturebox scrollbars

我在1个面板中有1个PictureBox,当图片很大时,获得自动滚动条,1个标签带有照片标题。 如果我将标签放在PictureBox上,那么"透明" backcolor显示正确但标签仍然在图片的顶部,如果我向上或向下滚动面板的滚动条,它就会离开屏幕! 相反,如果我将标签放在面板外面(在表单上),标签在屏幕顶部保持静止,如我所愿,但透明背景颜色不正确显示为不透明。然后,如果我设置与PictureBox关联的label1 .parent参数,透明背色再次正常工作,但标签的静态位置不再受到尊重,并再次加入PictureBox!

使用面板的滚动条时,如何在PictureBox上获得带透明背景色的静态标签?

1 个答案:

答案 0 :(得分:1)

我测试过覆盖表格。它似乎在你的背景下工作得很好。
PasteBin中的源代码 在OneDrive上载了修改后的项目 (我没有FW 4.5.2,用FW 4.5.1和FW 4.7.1测试)
Overlay可能是一个有趣的功能,但是,正如我已经说过的,这也可以使用TextRender.DrawText()Graphics.DrawString()完成,由图像容器滚动时偏移绘制文本所需的简单数学作为后盾点。

enter image description here

<小时/> 在您的项目中,我已经删除了Label1及其所有引用 然后,我设置了这个类字段:

Private OverlayShown As Boolean = False

frmPho_Load()

Overlay.Size = New Size(200, 50)
Overlay.OverlayPosition = Overlay.Alignment.Center
Overlay.Reposition(Me.Location, Me.Size)
OverlayShown = True
Overlay.Visible = False
Overlay.Show(Me)

frmPho_Deactivate()

If OverlayShown = False Then
    antip.Width = Me.Width
    antip.Height = Me.Height
    antip.Visible = True
End If
OverlayShown = False


这些是对托管表单(Form4)所做的所有更改,即使用叠加的表单。

Public Class frmPho

    Private Overlay As New OverlayForm

    Private Sub frmPho_Load(sender As Object, e As EventArgs) Handles Me.Load
        Overlay.Size = New Size(200, 50)
        Overlay.OverlayPosition = Overlay.Alignment.Center
        Overlay.Reposition(Me.Location, Me.Size)
        OverlayShown = True
        Overlay.Visible = False
        Overlay.Show(Me)
        '(...)
        Overlay.Text = IO.Path.GetFileNameWithoutExtension(_ImageFileNames(_CurrentImage))
    End Sub

    Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
        If CheckBox1.CheckState = False Then
            Overlay.Visible = False
        Else
            OverlayShown = True
            Overlay.Visible = True
        End If
    End Sub

    Private Sub ShowPrevImage()
        '(...)
        OverlayShown = True
        Overlay.Text = IO.Path.GetFileNameWithoutExtension(_ImageFileNames(_CurrentImage))
    End Sub

    Private Sub ShowNextImage()
        '(...)
        OverlayShown = True
        Overlay.Text = IO.Path.GetFileNameWithoutExtension(_ImageFileNames(_CurrentImage))
    End Sub

    Private Sub frmPho_Deactivate(sender As Object, e As EventArgs) Handles Me.Deactivate
        If OverlayShown = False Then
            antip.Width = Me.Width
            antip.Height = Me.Height
            antip.Visible = True
        End If
        OverlayShown = False
    End Sub

    Private Sub frmPho_Move(sender As Object, e As EventArgs) Handles Me.Move
        Overlay.Reposition(Me.Location, Me.Size)
    End Sub

    Private Sub frmPho_Resize(sender As Object, e As EventArgs) Handles Me.Resize
        Overlay.Reposition(Me.Location, Me.Size)
    End Sub

    Private Sub frmPho_Shown(sender As Object, e As EventArgs) Handles Me.Shown
        ShowOverlay(300)
    End Sub

    Private Async Sub ShowOverlay(Delay As Integer)
        Await Task.Delay(Delay)
        Overlay.Visible = True
        Me.Focus()
    End Sub

这是完整的OverlayForm:

  

所有边框/控制框为无(它是无边界形式)
  .StartPosition =手动
  .TransparncyKey = WhiteSmoke&lt; = 取决于字体颜色(mod。需要时)
  .BackColor = WhiteSmoke&lt; = 取决于字体颜色(需要时修改)
  .ShowInTaskbar = False

Public Class OverlayForm

    Private _Text As String
    Private TextPosition As Point
    Private _Brush As SolidBrush = New SolidBrush(Color.White)
    Private _Flags As StringFormatFlags = StringFormatFlags.NoWrap

    Public Enum Alignment
        Left = 0
        Right = 1
        Center = 2
    End Enum

    Public Sub New()
        InitializeComponent()
    End Sub

    Public Overrides Property Text() As String
        Get
            Return Me._Text
        End Get
        Set(ByVal value As String)
            _Text = value
            Me.Invalidate()
        End Set
    End Property

    Public Property OverlayPosition As Alignment

    Private Sub OverlayForm_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint

        e.Graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit
        e.Graphics.TextContrast = 12
        Dim _Size As SizeF = e.Graphics.MeasureString(Me._Text, Me.Font,
                                                      New SizeF(Me.Width, Me.Height),
                                                      New StringFormat(Me._Flags))

        e.Graphics.DrawString(Me._Text, Me.Font, Me._Brush, New RectangleF(TextAlign(_Size.Width), _Size))

    End Sub

    Private Sub OverlayForm_ForeColorChanged(sender As Object, e As EventArgs) Handles Me.ForeColorChanged
        Me._Brush = New SolidBrush(Me.ForeColor)
        Me.Invalidate()
    End Sub

    Public Sub Reposition(ParentPosition As Point, ParentSize As Size)
        Select OverlayPosition
            Case Alignment.Left
                Me.Location = New Point(ParentPosition.X + 20, ParentPosition.Y + 40)
            Case Alignment.Right
                Me.Location = New Point(ParentSize.Width - Me.Width - 20, ParentPosition.Y + 40)
            Case Alignment.Center
                 Me.Location = New Point(ParentPosition.X + 20 + (ParentSize.Width \ 2) - (Me.Width \ 2), ParentPosition.Y + 40)
        End Select
    End Sub

    Private Function TextAlign(TextWidth As Single) As PointF
        Select Case OverlayPosition
            Case Alignment.Left
                Return New PointF(1, 1)
            Case Alignment.Right
                Return New PointF((Me.Width - TextWidth) - 1, 1)
            Case Alignment.Center
                If TextWidth > Me.Width Then TextWidth = Me.Width - 2
                Return New PointF(CSng((Me.Width - TextWidth) / 4) - 1, 1)
        End Select
    End Function

End Class