ホーム
|
アプリケーション | Tips | ダウンロード | プログラム
| コラム

CBアプリ工房


Tips >   

DeleteMenu でタスクバーメニュー削除 

更新 : 2011/01/02

 


解説:
アプリケーションを作っていると、ユーザーにクリックされたくない、などでウィンドウメニュー(システムメニューまたはコントロールメニュー)を制御したい場面があります。
ここでは、[元のサイズに戻す] メニューをクリックされたくない(削除しておく)、例をみてみます。

ウィンドウメニューに変更を加えるには、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);
}
//-------------------------------------------------------------------



[ ホーム | ページトップ | ブック | リンク | サイトマップ ]
Copyright(c) 2003 Shibu All rights reserved.