Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 在面板内滚动带静态标签的picturebox_Vb.net_Label_Panel_Picturebox_Scrollbars - Fatal编程技术网

Vb.net 在面板内滚动带静态标签的picturebox

Vb.net 在面板内滚动带静态标签的picturebox,vb.net,label,panel,picturebox,scrollbars,Vb.net,Label,Panel,Picturebox,Scrollbars,我在一个面板内有一个PictureBox,当图片较大时可以自动获得滚动条,还有一个带有照片标题的标签。 如果我将标签放在PictureBox上,“透明”背景色显示正确,但如果我上下滚动或侧边滚动面板的滚动条,标签将保留在图片顶部并脱离屏幕! 相反,如果我将标签放在面板外面(表单上方),标签在屏幕顶部会保持静态,正如我所希望的那样,但透明的背景色无法正确显示,将变为不透明。然后,如果我设置了与PictureBox关联的label1.parent参数,透明的背景色会再次正常工作,但标签的静态位置不再

我在一个面板内有一个PictureBox,当图片较大时可以自动获得滚动条,还有一个带有照片标题的标签。 如果我将标签放在PictureBox上,“透明”背景色显示正确,但如果我上下滚动或侧边滚动面板的滚动条,标签将保留在图片顶部并脱离屏幕! 相反,如果我将标签放在面板外面(表单上方),标签在屏幕顶部会保持静态,正如我所希望的那样,但透明的背景色无法正确显示,将变为不透明。然后,如果我设置了与PictureBox关联的label1.parent参数,透明的背景色会再次正常工作,但标签的静态位置不再受到重视,并再次加入PictureBox


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

我已经测试了覆盖表单。它在您的环境中似乎运行得很好。

已将修改后的项目上载到
(我没有FW 4.5.2,使用FW 4.5.1和FW 4.7.1进行测试)

覆盖可能是一个有趣的功能,但是,正如我已经说过的,这也可以通过
TextRender.DrawText()
Graphics.DrawString()
来实现,并通过滚动图片容器时抵消绘制文本所需的简单数学来支持。


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

Private OverlayShown As Boolean = False
frmPho\u 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\u 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
这是完整的覆盖形式:

将所有边框/控制框设为无边框(这是一种无边框表单)
.StartPosition=手动

.TransparncyKey=WhiteSmoke请添加您的现有代码,以便我们了解发生了什么情况?@Sunil创建1个图片盒,1个面板,1个透明标签。背景色到标签-面板处自动滚动-加载图片并自动调整大小。图片盒内面板。在图片盒上贴标签。添加:
Private Sub Form1\u Load(发送者作为对象,e作为事件参数)处理MyBase。Load
使用滚动条,标签会弹出!现在将标签移出Picturebox更改所有代码
私有子表单1\u Load(发送者作为对象,e作为事件参数)处理MyBase。Load
标签1.Left=45
结束子表单
设置(编程)标签在图片上的位置。现在移动鼠标scrollbars@Sunil看到了吗?如果以编程方式设置标签位置,则标签会松开透明背景色,但如果将图片框设置为父对象,则静态位置会松开!我还尝试添加计时器来重新定位每一秒,或者快速重新生成表单,然后再重新生成PictureBox,但这不起作用!如何获得透明和静态标签?您可以使用一个覆盖层,使用一个透明的双窗体来实现这一点。在另一个控件上绘制控件,将始终导致滚动时闪烁。覆盖层更好。如果你有兴趣,请回击。@Jimi我无法将表单与其他表单散焦,因为我在PictureBox上贴了标签以保护第三个快照软件,在这篇文章中,他们提供了一个解决方案:但我无法适应我的vb.net项目。如果你在复选框1上标记两次,则“未经授权的层”将变为可见…在
复选框1\u CheckedChanged()中
事件,在
Else
部分,只需通知显示覆盖:
(…)Else OverlayShown=True Overlay.Visible=True
。每次必须显示覆盖图时,请执行相同的操作。我将把它添加到代码的更改部分。
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