全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1745
推到 Plurk!
推到 Facebook!

彈出式功能表與表單的關聯

 
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-06-05 22:40:06 IP:61.64.xxx.xxx 未訂閱
彈出式功能表與表單的關聯 http://www.cstc.net.cn/docs/docs.php?id=123 彈出式功能表(PopupMenu)是我們經常使用的,很多初學者製作好功能表後都在想如何與相關的表單關聯。在這裏我就告訴大家兩種方法。 第一種方法非常簡單,新建一個表單,在表單上放置一個PopupMenu,設置好它的選項;然後在表單的PopupMenu屬性中選擇你剛才放置在表單上的PopupMenu,Delphi自動將表單和功能表關聯;運行程式,在表單上點擊滑鼠右鍵,功能表是不是彈出了? 第二種方法就是純手工的方法。準備工作和第一種方法一樣,只是不把功能表和表單關聯。然後我們想想,當我們做一件什麼事情時,功能表才會彈出呢?應該是滑鼠右鍵彈起的時候,所以我們在視窗的OnMouseUp事件中添加控制代碼。 procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var MousePos: TPoint;//聲明一個TPoint類型的變數,存放游標在螢幕上的座標 begin if(Button=mbRight) then//判斷按下的是滑鼠左鍵還是右鍵 begin GetCursorPos(MousePos);//獲得游標的座標 PopupMenu1.Popup(MousePos.X,MousePos.Y);//彈出功能表,括弧中的參數指定功能表彈出的位置 end; end; 在BCB中使用方法是相同的,但是我想不少新手在把上面的Delphi代碼轉換成C 時會出錯,為什麼?那你自己寫一下就知道了,我給出了兩段正確的BCB代碼作為參考: 第一段代碼: void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { TPoint *MousePos=new TPoint(); if(Button==mbRight) { GetCursorPos(MousePos); PopupMenu1->Popup(MousePos->x,MousePos->y); } } 第二段代碼: void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { TPoint MousePos; if(Button==mbRight) { GetCursorPos(&MousePos); PopupMenu1->Popup(MousePos->x,MousePos->y); } } 看出他們的不同了嗎?個中原因留給讀者自己分析,不過放心,機制並不複雜,認真想想C 的語法是怎麼說的? 細心的讀者也許已經發現,過程TForm1.FormMouseUp接受的參數中有這麼兩個:X, Y: Integer,他們是做什麼用的呢?其實他們也是游標的座標,把x,y放到PopupMenu1.Popup()中,運行,在表單上按下滑鼠右鍵,我們發現功能表彈出的位置並不在游標所在的位置;我們把PopupMenu1.Popup()函數中的參數更改為x Form1.Left,y Form1.Top,再次運行,菜單的位置是不是被校正了,可惜還有點小小的誤差,這是由於視窗的標題欄的那段座標沒有被算入造成的,你可以手工加上這個誤差。 在這裏我們談兩個概念:相對座標和絕對座標。絕對座標是相對整個螢幕來說的,螢幕的左上角為(0,0)右下角為螢幕解析度的最大值,我們通過GetCursorPos()函數獲得的是絕對座標,所以無論表單的位置如何,功能表中能在正確的位置顯示。相對座標則是針對當前活動視窗來說的,它以視窗的左上角為(0,0)起始座標(不包括視窗標題欄),表單的右下角為終止座標,座標值為(Form.Width,Form.Height);x,y正是這樣的相對座標,於是上面的問題就徹底分析清楚了。如果你還不是很明白,我將給你一個示例。 新建一個表單,放置兩個Label,將Label拉長一點,把AutoSize設置為false,在表單的OnMouseMove事件中添加如下代碼: rocedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var MousePos: TPoint; begin Label1.Caption:='相對座標' IntToStr(x) ',' IntToStr(y); GetCursorPos(MousePos); Label2.Caption:='絕對座標' IntToStr(MousePos.X) ',' IntToStr(MousePos.Y); end; 運行程式,在表單上移動滑鼠,你看到了什麼?把滑鼠放到表單的左上角(標題欄的左下角),什麼都明白了吧!
系統時間:2024-05-06 4:50:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!