0

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

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

我觉得这对我的目的有点偏离。当用户 alt 选项卡时,表单也会出现乱序,这也不是万无一失的。

有没有更好的方法来实现变暗的效果。也许通过从内部使主要形式变暗?

4

3 回答 3

0

通过执行以下操作自己解决了这个问题:

  • 在主窗体上放置一个带有停靠栏的隐藏图片框:填写,
  • 截取当前屏幕并使其变暗
  • 将图像分配给图片框并使其可见
  • 在新的胜利中打开模式

当模态被解雇时

  • 隐藏图片框
于 2012-10-12T07:25:24.910 回答
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 来使其不可点击

于 2017-07-28T00:26:24.373 回答
-1

这是一些代码,与托马斯答案中的方法非常相似。请注意在块中使用该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
于 2012-10-12T19:38:54.477 回答