<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      Windows拖動菜單揭密

      [摘要]本文簡述編程制作Windows拖動菜單的基本方法,并用Delphi 5.0給出示例代碼。其實在Windows編程中制作拖動菜單的基本方法比許多人想象的要簡單的多(這是本人在Microsort網站上查...
      本文簡述編程制作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類雖經不懈努力均未能實現其菜單項的拖動。

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


      日韩精品一区二区三区高清