プログラム起動中周りを灰色に・・(例・・ユーザーアカウント制御などのように)

タグの編集
投稿者 ppo  (小学生) 投稿日時 2010/5/8 07:55:58
ユーザーアカウント制御のように、プログラム起動中にプログラム以外の画面を灰色にしたいです。
どうか方法を教えてください
投稿者 葉月  (社会人) 投稿日時 2010/5/8 11:18:13
初めまして。
Form1を背景として利用し、
Form2に主処理を行わせます。
動きは、サンプルのコメントを参考にしてください。
Form1の色は、デザイン画面のBackColorプロパティを変更します。


サンプルを載せますので、以下のことを行ってください。
・Timer1個を貼り付け
・Form2の作成

>>>サンプル
Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles MyBase.Load
        ' フォーム半透明 
        Me.Opacity = 0.83
        ' タイトルバー消す。 
        Me.FormBorderStyle = FormBorderStyle.None
        ' フォーム最大化 
        Me.WindowState = FormWindowState.Maximized

        Using f2 As Form = New Form2()
            f2.ShowDialog(Me)
        End Using

        Timer1.Start()
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Timer1.Tick
        Me.Close()
    End Sub
End Class
投稿者 ppo  (小学生) 投稿日時 2010/5/8 14:03:11
わかりやすい説明ありがとうございました
参考になりました
投稿者 るきお  (社会人) 投稿日時 2010/5/8 19:51:27
こんにちは。
Opacityを使うアイディアいいですね!

このアイディアを使って、もうちょっと使いやすく改造してみました。

Form1だけでOKで、別途Formを用意する必要はありません。
このプログラムを新規プログラムに貼り付けてもそのまま使えます。

ただし、モードを切り替えるためにButton1とButton2の2つのボタンは配置されている前提です。

    
    Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click
        '一人モード 
        MeAloneOn()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button2.Click
        '通常モード 
        MeAloneOff()
    End Sub


    ''' <summary> 
    ''' 自分のフォーム以外を黒くして触れなくする。 
    ''' この状態を解除するにはMeAloneOffを呼び出す。 
    ''' </summary> 
    Private Sub MeAloneOn()

        Dim backForm As New Form

        ' フォームを黒で半透明に。 
        backForm.BackColor = Color.Black
        backForm.Opacity = 0.83
        ' タイトルバー消す。  
        backForm.FormBorderStyle = FormBorderStyle.None
        ' フォーム最大化  
        backForm.WindowState = FormWindowState.Maximized

        Me.Tag = backForm
        backForm.Show()
        Me.TopMost = True
       
    End Sub

    ''' <summary>通常モードに戻す</summary> 
    Private Sub MeAloneOff()

        Dim backForm As Form

        backForm = CType(Me.Tag, Form)
        backForm.Close()
        backForm.Dispose()
        Me.Tag = Nothing
        Me.TopMost = False

    End Sub
投稿者 葉月  (社会人) 投稿日時 2010/5/8 21:55:42
こんばんは。

Formを新規に作る必要がなかったんですね。
Me.TagにDispose予定の透過されたFormを格納しておき、
必要がなくなったらTagを参考に掃除する部分が勉強になりました。
汎用性があり、とても参考になります。
ありがとうございました。
投稿者 るきお  (社会人) 投稿日時 2010/5/9 00:37:19
意味的にはあまりTagプロパティに入れないほうがいいんだと思いますが、
質問者のppoさんが小学生ということと、プログラムにまだあまりなじまれていない雰囲気だったので、
「Form用に変数を1つ用意する」という前提を省いて負担を軽くするために使いました。

と言いつつ、私はTagプロパティが結構好きでちょこちょこ使ってます。
投稿者 葉月  (社会人) 投稿日時 2010/5/9 15:48:38
私が作るのは、趣味の小規模ツールが多いので、Tagを使う機会はありそう
です。
ただ、他人と作る場合やコードが長くなった場合は、流れが読みにくい印
象を受けました。