使.Net表格变暗

时间:2012-10-12 06:35:08

标签: vb.net forms modal-dialog touchscreen

我有一个1080p触摸屏应用程序。弹出模态时,我想通过使主窗体变暗来强调它。

现在我使用第二种形式,主要形式的大小,即黑色,具有50%的不透明度。每当需要出现模态时,我打开不透明的形状,然后打开所需的模态。

我觉得这对我的目的有点狡猾。它也不能防止混蛋,当用户使用alt选项卡时,表单将不按顺序出现故障。

是否有更好的方法来达到变暗效果。也许是通过使主要形式从内部变暗来变暗?

3 个答案:

答案 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