システムメニューに項目を追加/削除したい
|
海外製のコンポーネントですがこういうのがあるそうです(ソース付だそうだ)
http://www.torry.ru/vcl/menus/ksysmenu.zip
実際にやってみましょう。まず削除です。
デファウルトでシステムメニューはこのようになっています
+−−−−−−−−−+
|元のサイズに戻す |
|移動 |
|サイズ変更 |
|最小化 |
|最大化 |
|−−−−−−−−−|
|終了 |
+−−−−−−−−−+
// 上の例から移動と、終了だけ残します。
procedure TForm1.Button1Click(Sender: TObject);
var
hSysMenu:integer;
begin
hSysMenu := GetSystemMenu(Handle,False);
DeleteMenu(hSysMenu, 0, MF_BYPOSITION);
DeleteMenu(hSysMenu, 1, MF_BYPOSITION);
DeleteMenu(hSysMenu, 1, MF_BYPOSITION);
DeleteMenu(hSysMenu, 1, MF_BYPOSITION);
end;
MF_BYPOSITION を指定した時は、第二パラメータで位置を0..で指定します。
削除ごとに位置が変わることに注意して下さい。
MF_BYCOMMAND を指定した時は SC_SIZE、SC_MOVE、SC_MINIMIZE、SC_MAXIMIZE、SC_CLOSE などでメニューを特定します。
次に追加です。
const
NewMenu1_Command = 10; // この値は重複しないように任意
NewMenu2_Command = 11;
procedure TForm2.Button1Click(Sender: TObject);
var
hSysMenu:integer;
begin
hSysMenu := GetSystemMenu(Handle,False);
// 底に(最後に)追加する
// セパレータを追加
AppendMenu(hSysMenu, MF_SEPARATOR,0,nil);
// 'NewMenu_1'を追加
AppendMenu(hSysMenu, MF_STRING, NewMenu1_Command, 'NewMenu_1');
// セパレータ(位置=1)の上の挿入
InsertMenu(hSysMenu, 1, MF_BYPOSITION or MF_STRING, NewMenu2_Command, 'NewMenu_2');
end;
Const で定義した値が、TMenuItemで、Commandプロパティにあたるものです。
でも、これだけでは、表示されるだけです。追加した項目をクリックしたらイベントハンドラを呼び出さねばなりません。
(ここでは、イベントハンドラではなく、メッセージボックスで代用)それには、WM_COMMANDメッセージを捕まえます。
procedure WMCOMMAND(var msg: TWMSysCommand);message WM_COMMAND;
を、フォームのPrivateに定義して、
procedure TForm1.WMCOMMAND(var msg: TWMSysCommand);
begin
case Msg.CmdType of
NewMenu1_Command: ShowMessage('NewMenu_1が押されました');
NewMenu2_Command: ShowMessage('NewMenu_2が押されました');
end;
inherited;
end;
ですね。
たくさん作るときは、TPopupMenuを貼り付け、TMenuItemを作成してこのCaption、Command、OnClickなどのプロパティを利用した方が簡単です。 |
|