2006年05月19日

VB.NETではForm1(最初に起動させるフォーム)を非表示で起動できない?

タスクトレイに常駐させるプログラムの場合、VB6ではForm_Loadイベント内で、Me.Visible = False と記述するだけで、フォームを全く表示することなく起動することができた。
ところが、VB.NETではMe.Visible = False とやっているにも関わらずなぜか表示してしまう。
Me.RefreshやApplication.DoEventsを付けても全くだめ。Activatedイベント内で非表示にさせようとしても駄目だった。
一度フォームが表示した後でなら、いくらでも非表示にさせられるのに、起動時に非表示にできないのである。
仕方が無いのでTimerコントロールを使いTimerイベント内でMe.Visible=Falseを実行させたところ、一瞬表示された後フォームは消えた。
スマートではないがとりあえず非表示にはなった。だが、やはり納得がいかずもう少し調べてみた。

いろいろ試すうちにフォームデザイン時にShowInTaskbarをFalseにして、WindowStateをMinimized(最小化)にすると表示しないことが判明
大事なのは実行時に指定しても無駄で、必ずデザイン時にこうしておかないと表示してしまうことである。

これで万事OKかと思いきや問題はまだあった。
タスクトレイに常駐させるプログラムは、フォームを表示してまた閉じる、この繰り返しが必要なのだが、2回目にフォームを表示させたとき、フォームが元のサイズに復元されない。ちょうど子フォームのようにタイトルバーだけのサイズになって左下に表示されるのである。
この原因はよくわからないのだが、WindowStateプロパティを最小化状態から標準(Normal)状態に変更する前にVisibleをTrueにしておくことで解決した。本当は後にもってきて最小化している状態を見せないようにしたかったのだが。

以下にこのサンプル画面デザインとソースを紹介する。
なお、この問題で調べた中でDOBON.NET「フォームを表示させずにトレイアイコンを表示する」に同じ問題について論じられている。ここで紹介されている「フォームのCreateParamsプロパティをオーバーライドする」では非表示に起動できても、その後2度と表示することができないものなので採用しなかった。

20060519.gif

'--- 起動 ---
Private Sub Form1_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles MyBase.Load
'NotifyIconの初期化
With NotifyIcon1
.Text = Me.Text
.Icon = Me.Icon
.ContextMenu = ContextMenu1
.Visible = True
End With
End Sub
 
'--- ContextMenu(表示) ---
Private Sub MenuItem1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles MenuItem1.Click
Me.Visible = True
Me.WindowState = FormWindowState.Normal

End Sub
 
'--- アイコンをダブルクリックは表示 ---
Private Sub NotifyIcon1_DoubleClick( _
ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles NotifyIcon1.DoubleClick
Me.Visible = True
Me.WindowState = FormWindowState.Normal

End Sub
 
'--- ContextMenu(終了) ---
Private Sub MenuItem3_Click( _
ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles MenuItem3.Click
NotifyIcon1.Visible = False 'トレイからアイコンを削除
Application.Exit() 'プログラムの終了
End Sub
 
'--- 「画面を閉じる」ボタン ---
Private Sub Button1_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click
Me.Visible = False
Me.WindowState = FormWindowState.Minimized

End Sub
 
'--- 「最小化」ボタンを押したときの処理 ---
Private Sub Form1_Resize(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles MyBase.Resize
Select Case Me.WindowState
Case FormWindowState.Minimized
If Me.Visible = True Then Me.Visible = False

End Select
End Sub
 
'--- Context(終了)以外からは終了しない ---
Private Sub Form1_Closing(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs) _
Handles MyBase.Closing
Select Case e.CloseReason
Case CloseReason.UserClosing
e.Cancel = True '終了をキャンセル
Me.WindowState = FormWindowState.Minimized
End Select
End Sub

2012年になってVB2010で開発した際、このTipsを使ったのだがどうしたことかフォームが小さく残ってしまうことが判明、そこで新たな方法を編み出した。
http://natchan-develop.seesaa.net/article/290752211.html
posted by なっちゃん at 15:47| 静岡 ☔| Comment(0) | TrackBack(1) | VB.NET Tips | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/18029500
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック

ICON
Excerpt: ICONIconは、米国アリゾナ大学のGriswoldにより開発されたプログラミング言語である。Iconはテキスト処理を目的として作られ、Griswoldが以前に作成したSNOBOLの後継として作られ..
Weblog: プログラミング言語
Tracked: 2006-06-09 04:11
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。