線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1378
推到 Plurk!
推到 Facebook!

System Menu

答題得分者是:RaynorPao
jessechan
版主


發表:109
回覆:394
積分:254
註冊:2002-04-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-24 16:20:13 IP:203.75.xxx.xxx 未訂閱
請問如何以程式去 triggle System Menu. Jesse Chan
------
Jesse Chan
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-24 16:33:20 IP:61.218.xxx.xxx 未訂閱
引言: 請問如何以程式去 triggle System Menu. Jesse Chan
試試這個GetSystemMenu(int hwnd, int bRevert); 然後用SendMessage來做您想要做的事! 或者像這樣:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  HMENU hMenu = GetSystemMenu(Handle, FALSE);
  DeleteMenu(hMenu, SC_RESTORE, MF_BYCOMMAND);
} 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  HMENU hMenu = GetSystemMenu(Handle, FALSE);
  DeleteMenu(hMenu, SC_MOVE, MF_BYCOMMAND);
} 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  HMENU hMenu = GetSystemMenu(Handle, FALSE);
  DeleteMenu(hMenu, SC_SIZE, MF_BYCOMMAND);
} 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  HMENU hMenu = GetSystemMenu(Handle, FALSE);
  DeleteMenu(hMenu, SC_MINIMIZE, MF_BYCOMMAND);
} 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  HMENU hMenu = GetSystemMenu(Handle, FALSE);
  DeleteMenu(hMenu, SC_MAXIMIZE, MF_BYCOMMAND);
} 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  HMENU hMenu = GetSystemMenu(Handle, FALSE);
  DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND);
} 
聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]--- 發表人 - axsoft 於 2003/03/24 16:39:22
jessechan
版主


發表:109
回覆:394
積分:254
註冊:2002-04-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-25 02:42:15 IP:61.228.xxx.xxx 未訂閱
對不起, 我把問題說的太簡單了, 我希望做到的是能在其它地方把 SystemMenu show 出來, 因為我的 Form 沒有 title, 而且在點選時又能真的做該做的事情, 如 close, move, size... Jesse Chan
------
Jesse Chan
jessechan
版主


發表:109
回覆:394
積分:254
註冊:2002-04-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-25 02:46:17 IP:61.228.xxx.xxx 未訂閱
小弟不才, 看不太懂,
引言: 試試這個GetSystemMenu(int hwnd, int bRevert); 然後用SendMessage來做您想要做的事! 這要怎麼做? 或者像這樣:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  HMENU hMenu = GetSystemMenu(Handle, FALSE);
  DeleteMenu(hMenu, SC_RESTORE, MF_BYCOMMAND);
} 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  HMENU hMenu = GetSystemMenu(Handle, FALSE);
  DeleteMenu(hMenu, SC_MOVE, MF_BYCOMMAND);
} 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  HMENU hMenu = GetSystemMenu(Handle, FALSE);
  DeleteMenu(hMenu, SC_SIZE, MF_BYCOMMAND);
} 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  HMENU hMenu = GetSystemMenu(Handle, FALSE);
  DeleteMenu(hMenu, SC_MINIMIZE, MF_BYCOMMAND);
} 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  HMENU hMenu = GetSystemMenu(Handle, FALSE);
  DeleteMenu(hMenu, SC_MAXIMIZE, MF_BYCOMMAND);
} 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  HMENU hMenu = GetSystemMenu(Handle, FALSE);
  DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND);
}     這樣可以做到什麼? 好像不能達到我的需求.
聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]--- 發表人 - axsoft 於 2003/03/24 16:39:22
Jesse Chan
------
Jesse Chan
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-25 09:40:19 IP:61.218.xxx.xxx 未訂閱
這有一篇文章您參考看看!    攔截Windows消息    http://members.lycos.co.uk/happybcb/article/tips/cbc_13.htm    浙江省溫州市統計局 倪建春 ----Borland C++ Builder的API後門    ------ 引子 C++ Builder不愧為Borland公司的優秀產品,用它來開發Windows程序非常快捷高效,但在編程過程中你也會發現它的一些限制性,讓你無法實現自己的想法。比如你無法在修改表單的系統菜單;比如使用跟蹤欄時,你找不到StartTrack和EndTrack事件,而偏偏你的程序需要這兩個事件。Windows API編程中,你就不會有這些麻煩,只需處理一下WM_SYSCOMMAND和WM_HSCROLL(或WM_VSCROLL)消息,就能實現上述功能。Windows API的缺點是編程十分麻煩,太多的時間要耗在細節上面,但它的功能卻是最強大的。C++ Builder的VCL在功能上只是它的一個子集,因為VCL是在API的基礎上封裝的,封裝時捨棄了一些不常用到的功能。但是程序員的想像力沒有被封裝,他們總懷著更大的熱情去實現別出心裁的想法,修改系統菜單和給跟蹤欄增加StartTrack和EndTrack事件只是其中的小把戲而已。可是VCL並沒有這些功能,怎麼辦? 幸好,Borland公司沒有把路堵死,而是留了個後門——允許程序員自己攔截並處理Windows消息,就像API編程一樣。於是,辦法有了...     ------ 方法 攔截Windows消息需要以下幾步:  在表單頭文件內(如Unit1.h)  1. 在類聲明中建立消息映射表,把某條消息的處理權交給自定義的消息處理函數。     BEGIN_MESSAGE_MAP  MESSAGE_HANDLER(Windows消息名,TMessage,消息處理函數名)  MESSAGE_HANDLER(...)  END_MESSAGE_MAP(TForm)         2. 在類聲明的private區內聲明消息處理函數。    private: // User declarations  void __fastcall 消息處理函數名(TMessage &Message);  在表單文件內(如Unit1.cpp)         3. 寫出消息處理函數,在這裡實現你需要的功能。比如     void __fastcall MainForm::OnWMHScroll (TMessage &Message)  {  ... // 在此加入你自己的代碼  TForm::Dispatch(&Message);  }     ------ 解釋 1. 關於TMessage TMessage是VCL預定義的結構,定義如下:  struct TMessage  {  unsigned int Msg; //消息  int WParam; //字參數  int LParam; //長字參數  int Result; //消息結果  };     2. 關於TForm::Dispatch(&Message) 自定義的消息處理函數末尾最好加一句TForm::Dispatch(&Message),這一句的作用是讓消息繼續傳遞下去。如果沒有這一句,消息將被完全攔截,VCL類可能由於得不到消息而無法實現正常功能。     ------ 實例一:修改系統菜單  有一些程序,主窗口很小,菜單也沒有,如果想加入關於或設置對話框,最好的辦法是拿系統菜單開刀。Windows API編程中,修改系統菜單與實現其他功能一樣,不太容易,也不會太難。但在C++ Builder中,表單類(TForm)沒有提供有關係統菜單的任何屬性與方法,實現其他功能易如反掌,而修改系統菜單似乎難於上青天。  還好,Borland公司允許程序員自已處理Window消息,於是機會來了!     一、用Window API函數修改系統菜單 假定表單名為MainForm,設置MainForm::OnCreate()函數:    用GetSystemMenu(MainForm->Handle,false)取得系統菜單句柄;  用AppendMenu,DeleteMenu,ModifyMenu函數修改系統菜單,把新的ID號賦於自定義的菜單項。  這時運行程序,可以看到系統菜單也被修改,但自定義的菜單項卻不能被響應。    二、攔截WM_SYSCOMMAND消息以響應自定義的菜單項  在表單頭文件內(如Unit1.h)    在表單類定義末尾加入消息響應表,取得WM_SYSCOMMAND消息的處理權  BEGIN_MESSAGE_MAP  MESSAGE_HANDLER(WM_SYSCOMMAND,TMessage,OnWMSysCommand)  END_MESSAGE_MAP(TForm)  在表單類定義的private區內加入消息處理函數聲明  private: // User declarations  void __fastcall OnWMSysCommand(TMessage& Message);  在表單文件內(如Unit1.h)  寫出消息響應函數  void __fastcall TForm1::OnWMSysCommand(TMessage& Message)  {  if(Message.WParam==ID_SysMenu_MyItem)  {  // Your Code Here, Do Something  }  TForm::Dispatch(&Message);  }  三、完整程序示例     實例二:給跟蹤欄增加OnStartTrack和OnEndTrack事件      當跟蹤欄用於進度控制時,OnStartTrack和OnEndTrack很可能是你需要的事件。比如在控制多媒體播放進度的場合,當用戶移動滑塊時,你需要OnStartTrack事件讓播放停止,需要OnEndTrack事件定位新的播放位置。但Borland公司沒有提供這兩個事件,我等編程愛好者只好自力更生,打攔截Windows消息的主意了。     一、攔截WM_HSCROLL消息,給跟蹤欄增加OnStartTrack和OnEndTrack事件     在表單頭文件內(如Unit.h)     在表單類定義末尾加入消息響應表,把WM_HSCROLL消息處理權交給OnWMHScroll函數。  BEGIN_MESSAGE_MAP  MESSAGE_HANDLER(WM_HSCROLL,TMessage,OnWMHScroll)  END_MESSAGE_MAP(TForm)  在表單類定義的private區內加入OnWMHScroll函數聲明。     private: // User declarations  void __fastcall OnWMHScroll(TMessage &Message);     在表單類定義的private區內加入StartTrack和EndTrack函數聲明。     private: // User declarations  void __fastcall TrackBar1StartTrack(TObject *Sender);  void __fastcall TrackBar1EndTrack(TObject *Sender);     在表單文件內(如Unit.cpp)  寫出OnWMHScroll函數,使它能根據消息參數調用StartTrack和EndTrack函數,在實際意義上產生OnStartTrack和OnEndTrack事件。  寫出StartTrack和EndTrack函數。  如果是垂直跟蹤欄,把上面的WM_HSCROLL改為WM_VSCROLL即可。     二、完整程序示例     尾聲 Borland C++ Builder編程中,攔截Windows消息是一項高級編程技術,能讓你盡量挖掘Windows的潛力,尤其讓曾用API編程的程序員感到心慰。攔截Windows消息是API盡情發揮的舞台,當VCL不能為你做什麼時,請想起底層的API。    聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]---
jessechan
版主


發表:109
回覆:394
積分:254
註冊:2002-04-05

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-25 10:10:23 IP:203.75.xxx.xxx 未訂閱
謝謝 axsoft 版主熱心提供訊息, 但是以上所說的是修改 SystemMenu 的方法, 而不是在沒有 Title 的 Form 上面叫出 SystemMenu 的方法, 請再幫一下忙. Jesse Chan
------
Jesse Chan
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-25 12:38:01 IP:203.73.xxx.xxx 未訂閱
引言: 在沒有 Title 的 Form 上面叫出 SystemMenu 的方法, 請再幫一下忙. Jesse Chan
jessechan 你好:
請參考以下的做法< >
(>>>>>>>    備註:
參數請再依個人的需求自行調整< >    -- 
        
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
jessechan
版主


發表:109
回覆:394
積分:254
註冊:2002-04-05

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-03-25 15:02:37 IP:203.75.xxx.xxx 未訂閱
了解, 多謝. Jesse Chan
------
Jesse Chan
builder78
初階會員


發表:36
回覆:100
積分:47
註冊:2003-02-03

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-03-28 20:42:56 IP:211.76.xxx.xxx 未訂閱
真是佩服 RaynorPao 版主 看到這文章 剛好也解決了我的問題~~~ 自己產生 自己要的訊息 給某一個訊息處理函數~~ 訊息中含有 PopupMenu選項的id 藉以判斷~~ 呵呵..^^
系統時間:2024-04-25 3:32:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!