AsuYuHomepage
トップページ サイトの説明 子供の成長記録 JM BAR Delphi リンク集
Home>>プログラミング>>Tips&Tricks>>システムメニューに項目を追加する
Delphi Tips
Delphi Win32API
ダウンロード

Delphi Tips & Tricks

フォームのシステムメニューに項目を追加する

 上のサンプルと同じくシステムメニューを操作します。自分の好きな項目を追加することもできます。
 追加するだけでは仕方がないので、追加メニューからのメッセージ処理方法も加えて書いておきます。
private
procedure WMSysCommand(var Msg:TWMSYSCOMMAND);message WM_SYSCOMMAND;
--------------------------------------------------------------------
const //各メニューでつかう異なった値の定数を用意しておく
  UserMenu1 =201;
  UserMenu2 =202; //数字は適当
                              
procedure TForm1.FormCreate(Sender: TObject);
var
  hSysmenu :hMenu;
begin
  //フォームのシステムメニューのハンドルを取得

   hSysmenu :=GetSystemMenu(Handle, false);
  //現在のメニューの1番下に追加

   AppendMenu(hSysmenu, MF_STRING,UserMenu1, 'UserMenu1');
   AppendMenu(hSysmenu, MF_STRING,UserMenu2, 'UserMenu2');
  //セパレーター(区切り線)を今追加したメニューの上に追加

   InsertMenu(hSysmenu, 6, MF_SEPARATOR or MF_BYPOSITION, 0, 0);
end;
                              
//WM_SYSCOMMAND処理手続き
procedure TForm1.WMSYSCOMMAND(var msg :TWMSYSCOMMAND);
begin
  //メッセージの内容で処理をわける
   case msg.CmdType of
     UserMenu1:showmessage('今押したのはUserMenu1です');
     UserMenu2:showmessage('今押したのはUserMenu2です');
   end;
                              
  inherited;//継承元の処理をおこなう
end;

  まずはじめにメニューを識別する定数を、constで定義しておきます。次にシステムメニューのハンドルを取得し、AppendMenu関数でメニューを追加(1番下に)します。
 AppendMenu関数の第一引数はGetSystemMenuで得たシステムメニューのハンドルです。第二引数は追加するメニューの表示形式の定数を or で結合し指定する。(↓下表参照 ※はデフォルト)
文字列で表示 MF_STRING 項目が有効 ※ MF_ENABLED
ビットマップで表示 MF_BITMAP 項目を淡形表示 MF_GRAYED
オーナードローで表示 MF_OWNERDRAW 項目が無効 MF_DISABLED
ポップアップメニュー MF_POPUPMF_CHECKED チェックマークつき MF_CHECKED
改行して下に表示 MF_MENUBARBREAK チェックマークなし ※ MF_UNCHECKED
改行して右側に表示 MF_MENUBREAK ハイライトする MF_HILITE
セパレータをつくる MF_SEPARATOR ハイライトなし ※ MF_UNHILITE
通常のメニュー項目の場合サンプルのようにMF_STRINGだけを指定すればいいでしょう。
第三引数は先程constで定義した識別子を指定、第四引数は表示される文字列を指定します。
第二引数で指定した定数により、3,4引数で指定する値が変わってくるので注意が必要です。
 任意の位置に項目を追加するにはInsertMenu関数を使います。AppendMenuに場所を指定する第二引数とMF_POSITION定数を加えてたもので、後ろの2つの引数はセパレータの場合は0を指定します。今回の場合上から8番目に横線が追加されます。

 メニューイベントの取得は、WM_SYSCOMMAND通知をMessage指令により手続き化することで処理します。
まずPrivart部に
 procedure WMSYSCommand(var Msg:TWMSYSCOMMAND);message WM_SYSCOMMAND;
と宣言します。
 実際の処理はTWMSYSCOMMAND型の中の CmdTypeがメッセージを送ったものを識別する値を保持しているので、case文でわけCmdTypeがconstで定義したUserMenu1、UserMenu2のだったときに処理をおこないます。
 最後の inheritedは必ず加えてください。こうしないとメッセージ処理の連鎖がここで途切れてしまい予期しない動作を起こす可能性があります。