Windows拖曳選單揭密 |
|
axsoft
版主 發表:681 回覆:1056 積分:969 註冊:2002-03-13 發送簡訊給我 |
Windows拖曳選單揭密資料來源: 網路技術論壇 本文簡述編程制作Windows拖曳選單的基本方法,並用Delphi 5.0給出示例代碼。 其實在Windows程式設計中製作拖曳選單的基本方法比許多人想像的要簡單的多(這是本人在Microsort網站上查閱了大量資料編程測試後得出的結論),前段時間本人在網上看到一些另類實現方法,甚覺不妥。 拖曳選單製作主要使用的Message和函數是一個在Win98以後版本才有的Windows消息WM_MENUDRAG和一個選單類型常數MIM_ MNS_DRAGDROP;一個數據類型TMenuInfo和一個API函數SetMenuInfo()。其它則是一些大家都熟悉的Windows消息和API菜單函數。 以下按Delphi編程方式給出具體的步驟和代碼。 第一步,建立一個項目,不用多說。 第二步,定義如下二個Windows Message 反應過程:procedure WMContextMenu(var Msg: TMessage); message WM_CONTEXTMENU; procedure WMMenuDrag(var Msg: TMessage); message WM_MENUDRAG;第三步,編寫上面二個WindowsMessage 反應過程的實現部份,作為一個示例如下: 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;第四步,運行程序,Click滑鼠右鍵,拖動其彈出選單,主WindowForm的標題欄將顯示出你所進行的拖曳。 到此為此一個基本的拖曳選單已經完成,雖然在拖動時你看不到如同Windows開始選單一樣的拖曳效果,但它的的確確是一個非常正宗的拖曳選單,只要編程者在WMMenuDrag(var Msg: TMessage)過程中充分發揮其想像,任何拖動樣式都可能被制作出來。不過本人用Delphi的TMainMenu或TPopupMenu類別雖經不懈努力均未能實現其選單項的拖 網路志工聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]--- 發表人 - axsoft 於 2002/08/16 16:27:01 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |