Windows拖動選單揭密 (轉)

worldblog發表於2007-12-13
Windows拖動選單揭密 (轉)[@more@]

拖動選單揭密: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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章