Windows拖動選單揭密 (轉)
拖動選單揭密:namespace prefix = o ns = "urn:schemas--com::office" />
本文簡述製作Windows拖動選單的基本方法,並用 5.0給出示例程式碼。
其實在Windows程式設計中製作拖動選單的基本方法比許多人想象的要簡單的多(這是本人在Microsort網站上查閱了大量資料程式設計測試後得出的結論),前段時間本人在網上看到一些另類實現方法,甚覺不妥。
拖動選單製作主要使用的訊息和是一個在以後版本才有的Windows訊息WM_MENUDRAG和一個選單型別常量MIM_ MNS_DRAGDROP;一個資料型別TMenuInfo和一個函式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(LO(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類雖經不懈努力均未能實現其選單項的拖動。
如果你有什麼疑問,可到gocn.com/">去和我交流。
成都 李曉方
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992820/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- WINDOWS未開函式揭密(1) (轉)Windows函式
- WINDOWS未公開函式揭密(2) (轉)Windows函式
- Windows未公開函式揭密——之一 (轉)Windows函式
- Windows未公開函式揭密——之二 (轉)Windows函式
- Windows未公開函式揭密——之三 (轉)Windows函式
- 側欄懸浮導航選單拖動滾動條可以自動定位效果
- 安裝Win2k後恢復Windows XP 啟動選單(轉)Windows
- jquery外掛 - EasyDrag 簡單拖動欄jQuery
- 用win2000啟動選單實現windows全家福(轉)Windows
- iGoogle的模組拖動層拖動Go
- 選單(轉)
- 規範設計Windows應用軟體選單 (轉)Windows
- WIN98特殊視窗的動態拖動 (轉)
- DW+ASP 玩轉動態二級選單 (轉)
- javascript對點選事件和拖動事件的區分JavaScript事件
- Windows 98 將控制皮膚新增到開始選單(轉)Windows
- angular 拖動功能Angular
- Unity 拖動UIUnityUI
- javacript 拖動 divJava
- Visual C++應用框架揭密 (轉)C++框架
- 輕鬆實現SINDOWS 98動態選單 (轉)
- Windows Boot Manager改成中文選單Windowsboot
- 右鍵模擬windows選單Windows
- 網頁模組拖動,Js仿Google和Windows Live的層拖拽網頁JSGoWindows
- Winform中實現拖動 Windows 邊緣來調整其大小ORMWindows
- C#實現窗體拖動、不允許窗體拖動、任意控制元件執行時拖動C#控制元件
- 從資料庫中動態選取下拉選單的方法 (轉)資料庫
- Windows server 2008(windows Vista)啟動選單輕鬆搞定薦WindowsServer
- Web Office 套件(8):狀態管理 & 拖動滑鼠選中文字Web套件
- 通過滑鼠拖動選取指定數字程式碼例項
- 使用CCScrollView後,如果有選單,不能拖動【優先順序問題】問題解決View
- IDEA小技巧:Debug拖動跳轉任意行Idea
- 拖慢系統啟動的8個原因[上](轉)
- 拖慢系統啟動的8個原因[下](轉)
- ios - 關於拖動手勢簡單應用場景iOS
- HTML元素拖動JSHTMLJS
- jquery拖動程式碼jQuery
- 一起玩轉微服務(12)——揭密starter微服務