六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

Windows拖動菜單揭密

[摘要]本文簡述編程制作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 ; 標(biāo)題是: %s',[Msg.wParam,buffer]);

//必須返加回 MND_ENDMENU或MND_CONTINUE

//當(dāng)用MND_ENDMENU時每拖動一下,菜單都將消失,如果你不想它消失,可使用MND_CONTINUE

  Msg.Result:=MND_ENDMENU;

end;



第四步,運行程序,單擊鼠標(biāo)右鍵,拖動其彈出菜單,主窗口的標(biāo)題欄將指示出你所進行的拖動。

到此為此一個基本的拖動菜單已經(jīng)完成,雖然在拖動時你看不到如同Windows開始菜單一樣的拖動效果,但它的的確確是一個非常正宗的拖動菜單,只要編程者在WMMenuDrag(var Msg: TMessage)過程中充分發(fā)揮其想象,任何拖動樣式都可能被制作出來。不過本人用Delphi的TMainMenu或TPopupMenu類雖經(jīng)不懈努力均未能實現(xiàn)其菜單項的拖動。

如果你有什么疑問,可到www.netgocn.com去和我交流。


標(biāo)簽:Windows拖動菜單揭密 
主站蜘蛛池模板: 日产精品一二三四区国产 | 综合 欧美 亚洲日本 | 亚洲第1页 | 伊人干 | 亚洲区欧美中文字幕久久 | 日韩播放 | 日本无人区码卡1 | 青青青青草原国产免费 | 亚洲第一a | 日毛片| 青娱娱乐盛宴免费一二区 | 欧洲三级视频 | 欧美一级黄色片在线观看 | 热久久这里是精品6免费观看 | 亚洲欧美在线精品 | 在线91精品国产免费 | 性欧美巨大极品videos | 四虎在线观看 | 午夜性伦鲁啊鲁免费视频 | 中文字幕在线免费观看视频 | 日本在线观看一区二区三区 | 一本久久道 | 亚洲人成www在线播放 | 欧美性视频一区二区三区 | 日韩 亚洲 翔田千里 在线 | 日本福利网站 | 亚洲成a人片77777kkkk | 日韩特级毛片免费观看视频 | 综合婷婷丁香 | 亚洲人免费 | 亚洲午夜久久久 | 日日日操操操 | 一区二区免费 | 亚洲精品色婷婷在线影院麻豆 | 午夜国产在线观看 | 色婷婷在线视频 | 欧美亚洲免费久久久 | 亚洲国产精品免费观看 | 日韩欧美在 | 日韩精品免费在线视频 | 亚洲精品高清在线观看 |