Delphi Tips 
-----------------------------

0065  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/02/08 osamu rev 1.4
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 2004/06/20 kakken 編集
システムメニューに項目を追加/削除したい

海外製のコンポーネントですがこういうのがあるそうです(ソース付だそうだ)
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などのプロパティを利用した方が簡単です。
参照: [Delphi-ML:19712] [Delphi-ML:42000] <メニュー>

[新規作成] [最新の情報に更新]

How To
Lounge
KeyWords


Tips
Delphi
Home
Osamu Takeuchi osamu@big.or.jp