Windows拖動菜單揭密
發(fā)表時間:2023-08-16 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]本文簡述編程制作Windows拖動菜單的基本方法,并用Delphi 5.0給出示例代碼。其實在Windows編程中制作拖動菜單的基本方法比許多人想象的要簡單的多(這是本人在Microsort網(wǎng)站上查...
本文簡述編程制作Windows拖動菜單的基本方法,并用Delphi 5.0給出示例代碼。
其實在Windows編程中制作拖動菜單的基本方法比許多人想象的要簡單的多(這是本人在Microsort網(wǎng)站上查閱了大量資料編程測試后得出的結(jié)論),前段時間本人在網(wǎng)上看到一些另類實現(xiàn)方法,甚覺不妥。
拖動菜單制作主要使用的消息和函數(shù)是一個在Win98以后版本才有的Windows消息WM_MENUDRAG和一個菜單類型常量MIM_ MNS_DRAGDROP;一個數(shù)據(jù)類型TMenuInfo和一個API函數(shù)SetMenuInfo()。其它則是一些大家都熟悉的Windows消息和API菜單函數(shù)。
以下按Delphi編程方式給出具體的步驟和代碼。
第一步,創(chuàng)建一個項目,不用多說。
第二步,定義如下二個Windows消息響應(yīng)過程:
procedure WMContextMenu(var Msg: TMessage); message WM_CONTEXTMENU;
procedure WMMenuDrag(var Msg: TMessage); message WM_MENUDRAG;
第三步,編寫上面二個Windows消息響應(yīng)過程的實現(xiàn)部份,作為一個示例如下:
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; //關(guān)鍵,指定Menu是拖動菜單,否則將不響應(yīng)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
//響應(yīng)用戶動,制作拖動菜單并不難,難的是這一部份,當(dāng)拖動發(fā)生時,程序員要在此如何完成拖動
GetMenuString(Msg.LParam,Msg.wParam, @buffer, sizeof(buffer),MF_BYPOSITION );
Caption:=Format('你拖動的菜單項: ID=%d ; 標題是: %s',[Msg.wParam,buffer]);
//必須返加回 MND_ENDMENU或MND_CONTINUE
//當(dāng)用MND_ENDMENU時每拖動一下,菜單都將消失,如果你不想它消失,可使用MND_CONTINUE
Msg.Result:=MND_ENDMENU;
end;
第四步,運行程序,單擊鼠標右鍵,拖動其彈出菜單,主窗口的標題欄將指示出你所進行的拖動。
到此為此一個基本的拖動菜單已經(jīng)完成,雖然在拖動時你看不到如同Windows開始菜單一樣的拖動效果,但它的的確確是一個非常正宗的拖動菜單,只要編程者在WMMenuDrag(var Msg: TMessage)過程中充分發(fā)揮其想象,任何拖動樣式都可能被制作出來。不過本人用Delphi的TMainMenu或TPopupMenu類雖經(jīng)不懈努力均未能實現(xiàn)其菜單項的拖動。
如果你有什么疑問,可到www.netgocn.com去和我交流。