實現Windows拖曳功能表的技巧 |
|
ddy
站務副站長 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
Windows拖曳功能表揭密 本文簡述程式設計制作Windows拖動選擇表的基本方法,並用Delphi 5.0給出示例代碼。 其實在Windows程式設計中制作拖動選擇表的基本方法比許多人想象的要簡單的多(這是本人在Microsort網站上查閱了大量資料程式設計測試後得出的結論),前段時間本人在網上看到一些另類實現方法,甚覺不妥。 拖動選擇表制作主要使用的訊息和函數是一個在Win98以後版本才有的Windows訊息WM_MENUDRAG和一個選擇表型式常數MIM_ MNS_DRAGDROP;一個數據型式TMenuInfo和一個API函數SetMenuInfo()。其它則是一些大家都熟悉的Windows訊息和API選擇表函數。 以下按Delphi程式設計方式給出具體的步驟和代碼。 第一步,建立一個項目,不用多說。 第二步,定義如下二個Windows訊息響應過程:
procedure WMContextMenu(var Msg: TMessage); message WM_CONTEXTMENU; procedure WMMenuDrag(var Msg: TMessage); message WM_MENUDRAG;第三步,編寫上面二個Windows訊息響應過程的實現部份,作為一個示例如下: procedure TForm1.WMContextMenu(var Msg: TMessage); var MenuInfo: TMenuInfo; Menu: HMenu; pt: TPoint; cmd: Cardinal; begin pt := Point(LOWORD(Msg.lParam), HIWORD(Msg.lParam)); Menu := CreatePopupMenu; try InsertMenu(Menu, 0, MF_BYPOSITION, MF_STRING, 'AAAAA'); //示例新增幾個任意的選擇表項 InsertMenu(Menu, 1, MF_BYPOSITION, MF_STRING, 'BBBBB'); InsertMenu(Menu, 2, MF_BYPOSITION, MF_STRING, 'CCCCC'); InsertMenu(Menu, 3, MF_BYPOSITION, MF_STRING, 'DDDDD'); MenuInfo.cbSize := sizeof(TMenuInfo); MenuInfo.fMask := MIM_STYLE; MenuInfo.dwStyle := MNS_DRAGDROP; //關鍵,指定Menu是拖動選擇表,否則將不響應WM_MENUDRAG訊息 SetMenuInfo(Menu, MenuInfo); cmd := Cardinal(TrackPopupMenuEx(Menu, TPM_RETURNCMD or TPM_LEFTBUTTON or TPM_LEFTALIGN, pt.X, pt.Y, Handle, nil)); //com=0 時,出錯 if cmd > 0 then begin //執行你指定的命令 end; finally DestroyMenu(Menu); end; //try end; procedure TForm1.WMMenuDrag(var Msg: TMessage); var buffer: array[0..255] of Char; begin //響應用戶動,制作拖動選擇表並不難,難的是這一部份,當拖動發生時,程式員要在此如何完成拖動 GetMenuString(Msg.LParam, Msg.wParam, @buffer, sizeof(buffer), MF_BYPOSITION); Caption := Format('你拖動的選擇表項: ID=%d ; 標題是: %s', [Msg.wParam, buffer]); //必須返加回 MND_ENDMENU或MND_CONTINUE //當用MND_ENDMENU時每拖動一下,選擇表都將消失,如果你不想它消失,可使用MND_CONTINUE Msg.Result := MND_ENDMENU; end;第四步,執行程式,按一下滑鼠右鍵,拖動其彈出選擇表,主視窗的標題列將指示出你所進行的拖動。 到此為此一個基本的拖動選擇表已經完成,雖然在拖動時你看不到如同Windows開始選擇表一樣的拖動效果,但它的的確確是一個非常正宗的拖動選擇表,只要程式設計者在WMMenuDrag(var Msg: TMessage)過程中充分發揮其想象,任何拖動樣式都可能被制作出來。不過本人用Delphi的TMainMenu或TPopupMenu類雖經不懈努力均未能實現其選擇表項的拖動。 --【KTop SNG新聞現場】--記者:ddy----------------------------------------- 請各位市民做好資源回收與垃圾分類,讓不良標題與不當發言在KTop 市消失 ------------------------------------------------------------------------- |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |