關於PopupMenu的問題??? |
|
BOOK
一般會員 發表:19 回覆:18 積分:7 註冊:2002-04-15 發送簡訊給我 |
|
china20
一般會員 發表:1 回覆:19 積分:4 註冊:2002-04-15 發送簡訊給我 |
可以用 message來做 const
WM_TRAYICON = WM_USER 10;
......... procedure WMTrayIcon(var Message: TMessage); message WM_TRAYICON; procedure TfrmMain.WMTrayIcon(var message: TMessage);
var
POINT : TPOINT;
begin
if message.LParam = WM_RBUTTONDOWN then
begin
//右鍵訊息
end; if message.LParam = WM_LBUTTONDOWN then
begin
//左鍵訊息
end;
end;
|
BOOK
一般會員 發表:19 回覆:18 積分:7 註冊:2002-04-15 發送簡訊給我 |
|
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
程式最小化成TrayIcon時,我按滑鼠右鍵會Show出自訂的PopupMenu,若我想在任意地方上按滑鼠左鍵使PopupMenu消失
TForm1=class(TForm) ... procedure FormCreate(Sender: TObject); procedure AppOnMessage(Var Msg:TMsg; var Handled:Boolean); private ... const SC_UDF=$EFF0; //宣告一個System command,不要與原有衝突即可 implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin //於systemMenu中加入自訂項目 appendMenu(GetSystemMenu(Application.Handle,false),MF_STRING,SC_UDF,'new1'); // 將所有message先導向自訂之procedure application.OnMessage:=apponmessage; end; procedure TForm1.AppOnMessage(var Msg: TMsg; var Handled: Boolean); begin if msg.message = WM_SYSCOMMAND then //若message為 system command if msg.wparam = SC_UDF then //command type為自訂型態 showmessage('hi'); //執行你要的程式 end;程式最小化成TrayIcon時按右鍵,送出WM_SYSCOMMAND之message, 故擴充此message如上即可 GetSystemMenu為一API-- 用來取得systemMenu AppendMenu為一API--為指定之menu增加item MF_STRING--增加之menuitem之顯示為一字串 SC_UDF--新增menuitem之commandtype 'new1'--顯示於popupMenu之Caption WM_USER 10是什麼意思阿,我看書上有人寫 WM_APP 0 或WM_USER 1這之間有何差別嗎 當自訂message時, 為使message編號不與原有之message編號衝突,必須有唯一之ID, WM_USER為目前ID之最大值 你要新增 message時,只要大於WM_USER小於65536即可, 故 1或 10均可 發表人 - ccchen 於 2002/06/20 11:43:38 |
BOOK
一般會員 發表:19 回覆:18 積分:7 註冊:2002-04-15 發送簡訊給我 |
|
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
|
wenjung
一般會員 發表:21 回覆:61 積分:21 註冊:2002-04-29 發送簡訊給我 |
|
EC
一般會員 發表:0 回覆:3 積分:0 註冊:2003-12-04 發送簡訊給我 |
引言: procedure TForm1.AppOnMessage(var Msg: TMsg; var Handled: Boolean); begin if msg.message = WM_SYSCOMMAND then //若message為 system command if msg.wparam = SC_UDF then //command type為自訂型態 showmessage('hi'); //執行你要的程式 end;我個人的經驗是 1) 要攔截B001的message 不論呼叫Shell_NotifyIcon時填入的pnid.uCallbackMessage是多少 void __fastcall TForm1::Intercept(TMsg& Msg, Boolean& Handled) { if ( 0xB001==Msg.message ) { SetActiveWindow(Handle); TPoint MousePos; GetCursorPos(&MousePos); PopupMenu1->Popup(MousePos.x, MousePos.y); Handled=true; } else Handled=false; }include file中沒有任何macro被定義為literal B001, 只知道0x8000 through 0xBFFF are Messages reserved for future use by Windows.有誰知道這是什麼message? 2)Application->Intercept; Intercept必須是某個class的member, 不能是獨立的function, 否則不論怎麼cast都過不了 |
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |