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

Windows拖曳選單揭密

 
axsoft
版主


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-08-16 13:17:21 IP:61.218.xxx.xxx 未訂閱

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
系統時間:2024-05-09 5:55:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!