我有一个1080p触摸屏应用程序。弹出模态时,我想通过使主窗体变暗来强调它。
现在我使用第二种形式,主要形式的大小,即黑色,具有50%的不透明度。每当需要出现模态时,我打开不透明的形状,然后打开所需的模态。
我觉得这对我的目的有点狡猾。它也不能防止混蛋,当用户使用alt选项卡时,表单将不按顺序出现故障。
是否有更好的方法来达到变暗效果。也许是通过使主要形式从内部变暗来变暗?
答案 0 :(得分:0)
通过以下方式自行解决:
当模态被解雇时
答案 1 :(得分:0)
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来使其无法取消。
答案 2 :(得分:-1)
这是一些代码,与Thomas的答案中的方法非常相似。请注意在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