Vb.net 使.Net窗体变暗
我有一个1080p触摸屏应用程序。当一个模态弹出时,我想通过使主窗体变暗来强调这一点 现在我使用第二种形式,主形式的大小,黑色,不透明度为50%。无论何时需要出现模态,我都会打开不透明表单,然后打开所需的模态 我觉得这对我来说有点离谱。这也不能证明当用户alt标签时,表单会出现顺序错误Vb.net 使.Net窗体变暗,vb.net,forms,modal-dialog,touchscreen,Vb.net,Forms,Modal Dialog,Touchscreen,我有一个1080p触摸屏应用程序。当一个模态弹出时,我想通过使主窗体变暗来强调这一点 现在我使用第二种形式,主形式的大小,黑色,不透明度为50%。无论何时需要出现模态,我都会打开不透明表单,然后打开所需的模态 我觉得这对我来说有点离谱。这也不能证明当用户alt标签时,表单会出现顺序错误 是否有更好的方法来实现变暗效果。也许是通过从内部将主窗体变暗?自己通过以下操作解决了此问题: 在主窗体上放置一个隐藏的带dock:fill的图片框 拍摄当前屏幕的截图并将其变暗 将图像指定给picturebox
是否有更好的方法来实现变暗效果。也许是通过从内部将主窗体变暗?自己通过以下操作解决了此问题:
- 在主窗体上放置一个隐藏的带dock:fill的图片框
- 拍摄当前屏幕的截图并将其变暗
- 将图像指定给picturebox并使其可见
- 在新的胜利中打开modal
- 隐藏图片盒
- 这里有一些代码,与托马斯回答中的方法非常相似。注意在
Try…Finally
块中使用dark
属性,以确保表单永远不会处于黑暗状态
Public Class Form1
Private _PB As PictureBox
Public WriteOnly Property Darkness
Set(value)
If value Then
Dim Bmp = New Bitmap(Bounds.Size.Width, Bounds.Size.Height)
Me.DrawToBitmap(Bmp, New Rectangle(Point.Empty, Bounds.Size))
Using g = Graphics.FromImage(Bmp)
Dim Brush As New SolidBrush(Color.FromArgb(125, Color.Black))
g.FillRectangle(Brush, New Rectangle(Point.Empty, Bmp.Size))
End Using
_PB = New PictureBox
Me.Controls.Add(_PB)
_PB.Size = Bounds.Size
_PB.Location = Bounds.Location - PointToScreen(Point.Empty)
_PB.Image = Bmp
_PB.BringToFront()
Else
If _PB IsNot Nothing Then
Me.Controls.Remove(_PB)
_PB.Dispose()
End If
End If
End Set
End Property
Private Sub btnDialog_Click(sender As Object, e As EventArgs) Handles btnDialog.Click
Try
Darkness = True
MsgBox("Modal dialog")
Finally
Darkness = False
End Try
End Sub
End Class
VB.net没有内置此函数,这真是太愚蠢了。以下是你要做的事情: 制作一个新的表单,并将其命名为Shade。我假设您的主窗体名为frmMain。为了清楚起见,假设您要启动的表单名为dlgX 在dlgX的加载事件中添加以下行(即带有dlgX.Load或Me.Load或MyBase.Load的子对象): 在关闭dlgX表单的所有事件(OK.click、Cancel.click等)下,添加以下行:
Shade.Close
或者,您甚至可以制作自己的sub来处理关闭表单时的所有事件:
Private Sub DispelShades(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.FormClosed
Shade.Close()
End Sub
这比PictureBox场景简单得多,您不必处理分层问题,也不必确保PictureBox在所有内容之上渲染(例如,选项卡确实不喜欢在其上方渲染内容,它们不允许您在其上方渲染图片框)。在主窗体上方渲染黑色半透明窗体可以解决所有这些难题
如果要对多个窗体进行着色,只需制作一个Shad1、Shade2、Shade3等
这很明显,但值得一提的是:如果要对主窗体进行着色,还需要通过dlgX.ShowDialog而不是dlgX打开dlgX,从而使其不可读取。Show您是否测试过在选项卡上渲染PictureBox?我的经验是,他们抵制一切试图把事物呈现在他们之上的企图。
Private Sub DispelShades(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.FormClosed
Shade.Close()
End Sub