});連載目次Windowsフォーム画面の最上部に表示される「タイトル・バー(別名:キャプション・バー)」には、小さなアイコン(例えば次の画面の(1))が左端に表示され、それに続いてタイトル文字列があり、右端には[最小化]ボタン(3)、[最大化/元に戻す]ボタン(4)、[閉じる]ボタン(5)がある。Windowsフォームのタイトル・バータイトル・バーを右クリックすると、(6)のメニューが表示される。(1)小さなアイコン。ここを左クリックすると、(6)のメニューが表示される。(2)タイトル文字列。(3)[最小化]ボタン。(4)[最大化]ボタン。最大化されている場合は、[元に戻す]ボタンが表示される。(5)[閉じる]ボタン。(6)コントロールボックス。システム・メニューとも呼ばれる。(7)[閉じる]メニュー項目。このうち、右側の[最小化]ボタンを無効にするにはフォームのMinimizeBoxプロパティを、[最大化]ボタンを無効にするにはMaximizeBoxプロパティを、それぞれfalseに設定すればよい。右端の[閉じる]ボタンを無効にするためのプロパティは用意されていない。この[閉じる]ボタンを無効にするにはどうすればよいのだろうか。ControlBoxプロパティによる[閉じる]ボタンの無効化1つの解決策としては、フォームのControlBoxプロパティをfalseにすればよい。ControlBoxプロパティは、コントロールボックス(別名:システム・メニュー)を有効(true)/無効(false)にするためのプロパティである。このControlBoxプロパティをfalseにすれば、コントロールボックスだけでなく、左端のアイコン、[閉じる]ボタン、[最小化]ボタン、[最大化/元に戻す]ボタンなど、すべてのボタンとアイコンが非表示になってしまう。このとき、タイトル・バーを右クリックしてもコントロールボックス(システム・メニュー)は表示されない。コントロールボックスを無効に設定したWindowsフォームタイトル・バーにはタイトル文字列が表示されているだけで、小さなアイコン、[最小化]ボタン、[最大化/元に戻す]ボタン、[閉じる]ボタンが非表示になっている。タイトル・バーを右クリックしてもコントロールボックス(システム・メニュー)は表示されない。このようにすべてのボタンを非表示にするのではなく、無効化するのは[閉じる]ボタンだけで、そのほかの小さなアイコン、[最大化/元に戻す]ボタン、[最小化]ボタンはそのまま残しておきたい場合もあるだろう。APIを使う必要がある。APIで[閉じる]ボタンの無効化を実装するには、フォームのコントロールボックス(システム・メニュー)を取得して、その中の[閉じる]メニュー項目(先ほどの画面「Windowsフォームのタイトル・バー」の(7))を削除すればよい。すれば、タイトル・バーの[閉じる]ボタンも自動的に無効化されるようになっている。APIのGetSystemMenu関数を呼び出してシステム・メニューのハンドルを取得し、RemoveMenu関数を呼び出してシステム・メニューから[閉じる]メニュー項目を削除する。これらの関数の構文について簡単に説明する。これらの関数のより詳しい説明は、MSDNの「プラットフォームSDK」を参照していただきたい。bRevert)GetSystemMenu関数の構文GetSystemMenu関数の第1パラメータには、ウィンドウ・ハンドル(ウィンドウを識別するためにシステムによって割り当てられる番号)を指定する。このウィンドウ・ハンドルは、フォームのHandleプロパティに格納されている。第2パラメータには、コントロールボックスをデフォルトに戻す(初期化する)かどうかを指定する。本稿のようにコントロールボックスを取得する場合には「0」を指定する。削除した[閉じる]ボタンを復活させるには、このパラメータに「1」を指定してコントロールボックスを初期化すればよい。関数の戻り値には、システム・メニューのハンドル(識別番号)が返される。wFlags)RemoveMenu関数の構文RemoveMenu関数の第1パラメータにはメニューのハンドルを指定する。第2パラメータにはメニュー項目のIDを指定する。[閉じる]ボタンのIDは「SC_CLOSE(0x0000F060)」である。第3パラメータには「MF_BYCOMMAND(0x00000000)」を指定する。このMF_BYCOMMANDは、第2パラメータが「ID指定」であることを意味する。API関数を使えば[閉じる]ボタンだけを無効化できるが、これだけではまだ完璧ではない。Windowsシステムには、アプリケーションを閉じるためのショートカット・キー「Altキー+F4キー」というものが存在する。このショートカット・キーを使えば、[閉じる]ボタンが無効であっても、右端にあった[閉じる]ボタンを押したのと同じようにWindowsフォームが閉じられてしまう。よって、ショートカット・キーによりフォームが閉じられるのを阻止しなければ、[閉じる]ボタンを無効にした意味がない。次にその方法を解説しよう。ちなみに、ControlBoxプロパティをfalseにした場合も、アプリケーションを閉じるためのショートカット・キーは有効である。このため、その場合にも同じように次の処理が必要になるので注意していただきたい。ショートカット・キーによってWindowsフォームが閉じられるのを防止するには、フォームが閉じられる直前に発生するClosingイベントのハンドラ・メソッドをまず追加する。Closingイベント・ハンドラの第2パラメータであるCancelEventArgsクラス(System.ComponentModel名前空間)のオブジェクトのCancelプロパティにtrueを設定するだけでよい。[閉じる]ボタンのみを無効化したサンプル・プログラム以上の内容を実装したサンプル・プログラムを次に示す。このプログラムでは、フォーム上に配置した[終了]ボタンがクリックされた場合にのみフォームを閉じるようにするため、フラグによりClosingイベント・ハンドラでの処理を制御している。true;}}}}[閉じる]ボタンのみを無効化したサンプル・プログラムサンプル・プログラム(C#:closebtn.cs、VB.NET:closebtn.vb)のダウンロードこれを実行すると、表示されるフォームは次のような画面になる。[閉じる]ボタンだけが無効化されているWindowsフォームタイトル・バーは[閉じる]ボタンのみが無効化され、コントロールボックス、アイコン、[最小化]ボタン、[最大化/元に戻す]ボタンはそのまま残されている。Windowsシステムのシュートカット「Altキー+F4キー」を使ってもWindowsフォームが閉じられないようになっている。Windowsフォームを閉じるには、必ず[終了]ボタンを押さなければならない。APIやDLL関数を呼び出すには?」を参照していただきたい。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。