用BCB改窗體系統菜單

兩年前的文章,拿出來充充門面。

——————————————————————

用BCB改窗體系統菜單

( 作者:mikespook | 發佈日期:2002-12-8 | 瀏覽次數:133 )

關鍵字:BCB,系統菜單,消息映射表
  我們在用一些軟件時會發現,這些軟件的系統菜單並不是標準的,可能少幾項,可能多幾項,也可能默認的系統菜單已經變得面目全非。  圖1是一個標準的系統菜單。圖2是經過修改的系統菜單。下面我就用這個例子給大家簡單介紹一下系統菜單的修改方法。
圖1 圖2
2002-12-8change.gif2002-12-8nochange.gif
新建一個工程(New Application)。將主窗體命名爲“frm_main”。在Tfrm_main::FormCreate()函數中添加以下代碼:

void __fastcall Tfrm_main::FormCreate(TObject *Sender)
{
  HMENU system_menu = GetSystemMenu(Handle, false); //取得窗體系統菜單的句柄
  DeleteMenu(system_menu, 4, MF_BYPOSITION);//刪掉系統菜單的第一項
  AppendMenu(system_menu, MF_STRING, ID_About_Menu, "關於(&A)");//添加一個“關於”菜單項
  ModifyMenu(system_menu, 0, MF_STRING, ID_NULL_Menu, "NULL");//修改菜單項,將分隔符號改爲“NULL”
}

以上用到了GetSystemMenu()、DeleteMenu()、AppendMenu()、ModifyMenu()這四個API函數,具體用法請查閱MSDN或win32sdk.hlp幫助文件(BCB安裝盤中有)。
好了,現在讓我們運行一下看看。按F9運行程序,呼出系統菜單。正如我們所預期的那樣,系統菜單已經修改成功。這樣就完了麼?你點擊我們新添加的菜單項試試,什麼也沒有發生。這是因爲我們沒有對單擊該菜單項這個消息進行處理。幸好功能強大的BCB給我們留了一個後門,允許我們攔截windows消息。
下面繼續我們的手術。在主窗體頭文件frmmain.h中Tfrm_main類定義的末尾加入消息映射表:

BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_SYSCOMMAND, TMessage, sysmenuOnClick)
END_MESSAGE_MAP(TForm)

其中WM_SYSCOMMAND就是我們要攔截處理的消息。當我們攔截到WM_SYSCOMMAND消息時就交由sysmenuOnClick()函數處理。

在Tfrm_main類定義中添加

private:
  void __fastcall sysmenuOnClick(TMessage &Message);

在主窗體文件frmmain.cpp中添加消息處理函數的內容,比如這裏我們讓點擊菜單項後彈出“關於”對話框:

void __fastcall Tfrm_main::sysmenuOnClick(TMessage &Message)
{
//這裏判斷WM_SYSCOMMAND消息是點擊哪個菜單項發出的
  switch(Message.WParam){
    case ID_About_Menu:
      Application->MessageBoxA("作者:mikespook 2002.5.24", "關於", MB_OK);
      break;
    case ID_NULL_Menu:
      Application->MessageBoxA("你點擊了名爲“NULL”的菜單", "注意", MB_OK);
      break;
    default:
      break;
  }
// 下面這句是讓消息繼續傳遞下去。沒有這句的話,消息將被完全攔截,而造成程序出錯。
  TForm::Dispatch(&Message);
}

好了,現在大家再運行程序試試。是不是一切OK了?相信你已經對修改系統菜單有了一個大概的瞭解。那麼就充分發揮你的想象力,充分利用系統菜單吧。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章