|
||
解説: アプリケーションを作っていると、ユーザーにクリックされたくない、などでウィンドウメニュー(システムメニューまたはコントロールメニュー)を制御したい場面があります。 ここでは、[元のサイズに戻す] メニューをクリックされたくない(削除しておく)、例をみてみます。 ウィンドウメニューに変更を加えるには、Win32API の GetSystemMenu 関数を使います(ウィンドウハンドル取得)。 ウィンドウハンドルを取得した後は、DeleteMenu 関数で [元のサイズに戻す] メニューを削除します。 メニューを削除しても、Windows によって再描画されるまで変化しないので、DrawMenuBar 関数で明示的に再描画しておきます。 ちょっと寄り道: 各 API 関数は以下のように定義されています。 HMENU GetSystemMenu( HWND hWnd, // ウィンドウのハンドル BOOL bRevert // 元へ戻すかどうか ); bRevert に false を指定すると、コピーされたウィンドウメニューが返り変更を加えることができます。 BOOL DeleteMenu( HMENU hMenu, // メニューのハンドル UINT uPosition, // メニュー項目の識別子または位置 UINT uFlags // オプション ); uPosition パラメータは対象メニュー項目の位置を指定します。 uFlags には、メニュー項目の位置を意味する、MF_BYPOSITION を今回は指定します。 BOOL DrawMenuBar( HWND hWnd // ウィンドウのハンドル ); ウィンドウメニューを再描画します。 使用例: アプリケーションを起動して、タスクバーに表示されたアイコンを右クリックします。 [元のサイズに戻す] がメニューの一番上にあります。 Button1 をクリックして、再び見ると [元のサイズに戻す] メニューは消えているはずです。 準備としては Button を適当に置くだけです。 Button1 をクリックすると、GetSystemMenu 関数がウィンドウメニューのハンドルを取得します。 このハンドルを使って、 DeleteMenu 関数で [元のサイズに戻す] メニューを削除します。 削除した後は、属性を反映させる為に再描画しておきます。 他のメニューも同様に操作できますので、試してみてください。 //------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { HMENU hmenu = GetSystemMenu(Application->Handle, false); // [元のサイズに戻す] メニューを削除 DeleteMenu(hmenu, 0, MF_BYPOSITION); // ウィンドウメニューの属性を変えたので反映させる DrawMenuBar(Application->Handle); } //------------------------------------------------------------------- |