Dim cr = Me.ClientRectangle Dim r = Me.RectangleToScreen(cr) Using bmp As New Bitmap(cr.Width, cr.Height) Using g = Graphics.FromImage(bmp) g.CopyFromScreen(r.Location, New Point(0, 0), r.Size) Dim alpha As Integer = 255 * 80 \ 100 '不透明度 80% Using b As New SolidBrush(Color.FromArgb(alpha, SystemColors.AppWorkspace)) g.FillRectangle(b, cr) End Using End Using Using pnl As New Panel() pnl.Parent = Me pnl.BackgroundImage = bmp pnl.BringToFront() pnl.SetBounds(cr.X, cr.Y, cr.Width, cr.Height) pnl.Visible = True
'Using child As New Form4() With {.StartPosition = FormStartPosition.CenterParent} ' child.ShowDialog(Me) 'End Using Form4.ShowDialog(Me)
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click Dim cr = Me.ClientRectangle Dim r = Me.RectangleToScreen(cr) Dim bmp As New Bitmap(cr.Width, cr.Height) Using g = Graphics.FromImage(bmp) '画面キャプチャ g.CopyFromScreen(r.Location, New Point(0, 0), r.Size) '半透明のスモークをかける Using b As New SolidBrush(Color.FromArgb(180, Color.DarkGray)) g.FillRectangle(b, cr) End Using End Using
Dim Pnl As New Panel Pnl.Parent = Me
'Panel1を重ねて表示 Dim oldBmp = Pnl.BackgroundImage Pnl.BackgroundImage = bmp If oldBmp IsNot Nothing Then oldBmp.Dispose() Pnl.BringToFront() Pnl.SetBounds(cr.X, cr.Y, cr.Width, cr.Height) Pnl.Visible = True Form4.ShowDialog(Me) Pnl.Visible = False Pnl.Dispose() End Sub
■No35113に返信(よっし〜さんの記事)
> 現在も親の上に半透明シート(?)を表示させ、その上にLabelを配置したフォームを表示させております。
半透明シートを被せて、下の親フォームを操作不能にしたいという意図でしょうか。
であれば、親フォームにフォームサイズの Panel を全体表示しておき、
その Panel の背景に、親フォームの内容を描画してはどうでしょう。
(1) 親フォームに Panel1 を配置。これが半透明モドキになる。
Panel1 は普段、Visible = False にしておく。
(2) その Panel1 内に、子コントロールとして黄色の Panel2 を置き、
Panel2 内に Label1 や Button1 を置く。
Button1_Click のイベントにて「Panel1.Hide()」を記述。
(3) 半透明表示のために、以下を実行。
'Panel1 は Visible = False な状態で開始する事
Panel1.Visible = False
Dim cr = Me.ClientRectangle
Dim r = Me.RectangleToScreen(cr)
Dim bmp As New Bitmap(cr.Width, cr.Height)
Using g = Graphics.FromImage(bmp)
'画面キャプチャ
g.CopyFromScreen(r.Location, New Point(0, 0), r.Size)
'半透明のスモークをかける
Using b As New SolidBrush(Color.FromArgb(180, Color.DarkSlateGray))
g.FillRectangle(b, cr)
End Using
End Using
'Panel1を重ねて表示
Dim oldBmp = Panel1.BackgroundImage
Panel1.BackgroundImage = bmp
If oldBmp IsNot Nothing Then
oldBmp.Dispose()
End If
Panel1.BringToFront()
Panel1.SetBounds(cr.X, cr.Y, cr.Width, cr.Height)
Panel1.Visible = True