兩年前的文章,拿出來充充門面。
——————————————————————
用BCB改窗體系統菜單
( 作者:mikespook | 發佈日期:2002-12-8 | 瀏覽次數:133 )
關鍵字:BCB,系統菜單,消息映射表 |
我們在用一些軟件時會發現,這些軟件的系統菜單並不是標準的,可能少幾項,可能多幾項,也可能默認的系統菜單已經變得面目全非。 圖1是一個標準的系統菜單。圖2是經過修改的系統菜單。下面我就用這個例子給大家簡單介紹一下系統菜單的修改方法。 圖1 圖2 新建一個工程(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了?相信你已經對修改系統菜單有了一個大概的瞭解。那麼就充分發揮你的想象力,充分利用系統菜單吧。 |