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