線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1224
推到 Plurk!
推到 Facebook!

實現Windows拖曳功能表的技巧

 
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-12-06 18:10:28 IP:210.64.xxx.xxx 未訂閱
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 市消失 -------------------------------------------------------------------------
系統時間:2024-04-26 6:01:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!