Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 使.Net窗体变暗_Vb.net_Forms_Modal Dialog_Touchscreen - Fatal编程技术网

Vb.net 使.Net窗体变暗

Vb.net 使.Net窗体变暗,vb.net,forms,modal-dialog,touchscreen,Vb.net,Forms,Modal Dialog,Touchscreen,我有一个1080p触摸屏应用程序。当一个模态弹出时,我想通过使主窗体变暗来强调这一点 现在我使用第二种形式,主形式的大小,黑色,不透明度为50%。无论何时需要出现模态,我都会打开不透明表单,然后打开所需的模态 我觉得这对我来说有点离谱。这也不能证明当用户alt标签时,表单会出现顺序错误 是否有更好的方法来实现变暗效果。也许是通过从内部将主窗体变暗?自己通过以下操作解决了此问题: 在主窗体上放置一个隐藏的带dock:fill的图片框 拍摄当前屏幕的截图并将其变暗 将图像指定给picturebox

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

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

我觉得这对我来说有点离谱。这也不能证明当用户alt标签时,表单会出现顺序错误


是否有更好的方法来实现变暗效果。也许是通过从内部将主窗体变暗?

自己通过以下操作解决了此问题:

  • 在主窗体上放置一个隐藏的带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