我有一个 1080p 触摸屏应用程序。当一个模态弹出时,我想通过使主窗体变暗来强调这一点。
现在我使用第二种形式,主要形式的大小,黑色,不透明度为 50%。每当需要出现模态时,我打开不透明表单,然后打开所需的模态。
我觉得这对我的目的有点偏离。当用户 alt 选项卡时,表单也会出现乱序,这也不是万无一失的。
有没有更好的方法来实现变暗的效果。也许通过从内部使主要形式变暗?
我有一个 1080p 触摸屏应用程序。当一个模态弹出时,我想通过使主窗体变暗来强调这一点。
现在我使用第二种形式,主要形式的大小,黑色,不透明度为 50%。每当需要出现模态时,我打开不透明表单,然后打开所需的模态。
我觉得这对我的目的有点偏离。当用户 alt 选项卡时,表单也会出现乱序,这也不是万无一失的。
有没有更好的方法来实现变暗的效果。也许通过从内部使主要形式变暗?
通过执行以下操作自己解决了这个问题:
当模态被解雇时
VB.net 没有内置这个功能真的很愚蠢。以下是您要解决的问题:
制作一个新表格并将其命名为Shade。我将假设您的主要形式称为frmMain。为了清楚起见,假设您要启动的表单名为dlgX。
在 dlgX 的 Load 事件中添加以下行(即带有 dlgX.Load 或 Me.Load 或 MyBase.Load 的子):
Shade.Opacity = 0.001
Shade.Show()
Shade.Location = frmMain.Location ' Form location will only update if the form is visible.
Shade.Hide()
Shade.FormBorderStyle = Windows.Forms.FormBorderStyle.None 'This gets rid of the windows Titlebar and window border.
Shade.Size = frmMain.Size
Shade.BackColor = Color.Black
Shade.Opacity = 0.5
Shade.Show() ' Form size will only update the next time you show it.
Shade.TopMost = True ' Puts Shade over main form
Me.TopMost = True ' Puts current form over shade
在关闭 dlgX 表单的所有事件(OK.click、Cancel.click 等)下,添加以下行:
Shade.Close
或者您甚至可以制作自己的子程序来处理表单关闭的所有事件:
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.Show 打开 dlgX 来使其不可点击
这是一些代码,与托马斯答案中的方法非常相似。请注意在块中使用该Darkness
属性Try...Finally
,以确保您永远不会让表单处于黑暗状态。
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