如何自画菜单?
<P> 我们知道,C++Builder没有自画菜单,但可以调用API函数::SetMenuItemInfo()来改 </P><P>变菜单类型,达到自画菜单的目的。下面的例子演示了如何使用自画菜单。当鼠标位于菜单 </P>
<P>上拾,菜单项将凸出来。(黑体字为添加的代码) </P>
<P> </P>
<P>//头文件 </P>
<P>//------------------------------------------ </P>
<P>#ifndef TestMenuH </P>
<P>#define TestMenuH </P>
<P>//----------------------------------------- </P>
<P>#include Classes.hpp </P>
<P>#include Controls.hpp </P>
<P>#include StdCtrls.hpp </P>
<P>#include Forms.hpp </P>
<P>#include Menus.hpp//-------------------- </P>
<P> </P>
<P>class TForm1 : public TForm </P>
<P>{ </P>
<P>__published: // IDE-managed Components </P>
<P>TMainMenu *MainMenu1; </P>
<P>TMenuItem *aaa1; </P>
<P>TMenuItem *aaaaaaaaa1; </P>
<P>TMenuItem *ccc1; </P>
<P>TMenuItem *ddd1; </P>
<P>TMenuItem *eee1; </P>
<P>TMenuItem *ddsds1; </P>
<P>TMenuItem *fcdfsss1; </P>
<P>TMenuItem *dddddddd1; </P>
<P>void __fastcall FormCreate(TObject *Sender); </P>
<P>private: // User declarations </P>
<P>void __fastcall Modify(TMenuItem *pMenuItem); </P>
<P>protected : </P>
<P>MESSAGE void __fastcall CNMeasureItem(TWMMeasureItem Msg);//增加响应消息 </P>
<P>MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg); </P>
<P>public: // User declarations </P>
<P>__fastcall TForm1(TComponent* Owner); </P>
<P>BEGIN_MESSAGE_MAP//添加消息映射 </P>
<P>VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem); </P>
<P>VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem); </P>
<P>END_MESSAGE_MAP(TForm); </P>
<P>}; </P>
<P>//--------------------------------------------------------------------------- </P>
<P>extern PACKAGE TForm1 *Form1; </P>
<P>//--------------------------------------------------------------------------- </P>
<P>#endif </P>
<P> </P>
<P>//实现文件 </P>
<P>//--------------------------------------------------------------------------- </P>
<P>#include vcl.h </P>
<P>#pragma hdrstop </P>
<P> </P>
<P>#include TestMenu.h </P>
<P>//--------------------------------------------------------------------------- </P>
<P>#pragma package(smart_init) </P>
<P>#pragma resource *.dfm </P>
<P>TForm1 *Form1; </P>
<P>//--------------------------------------------------------------------------- </P>
<P>__fastcall TForm1::TForm1(TComponent* Owner) </P>
<P>: TForm(Owner) </P>
<P>{ </P>
<P>} </P>
<P>//--------------------------------------------------------------------------- </P>
<P> </P>
<P>void __fastcall TForm1::Modify(TMenuItem *pMenuItem) </P>
<P>{//修改缺省属性 </P>
<P>for(int i=0;ipMenuItem-Count;i++) </P>
<P>{ </P>
<P>MENUITEMINFO mii= </P>
<P>{ </P>
<P>sizeof(MENUITEMINFO), </P>
<P>MIIM_TYPE|MIIM_DATA ,//改变类型和数据 </P>
<P>MF_OWNERDRAW,0,0,0,0,0,DWORD(pMenuItem-Items-Handle), </P>
<P>//把菜单项的句柄赋给32位数据 </P>
<P>0, </P>
<P>0, </P>
<P>}; </P>
<P>if(pMenuItem-Items-Caption!=-)//如果不是间隔线 </P>
<P>::SetMenuItemInfo(pMenuItem-Handle,i,TRUE,mii); </P>
<P>if(pMenuItem-Items-Count)//如果含有子菜单 </P>
<P>Modify(pMenuItem-Items); </P>
<P>} </P>
<P> </P>
<P>} </P>
<P>void __fastcall TForm1::FormCreate(TObject *Sender) </P>
<P>{ </P>
<P>for(int i=0;iMainMenu1-Items-Count;i++) </P>
<P>{ </P>
<P>Modify(MainMenu1-Items-Items); </P>
<P>} </P>
<P>DrawMenuBar(Handle); </P>
<P>} </P>
<P>//--------------------------------------------------------------------------- </P>
<P>void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg) </P>
<P>{//设置菜单大小 </P>
<P>TMenuItem *pItem=MainMenu1-FindItem(Msg.MeasureItemStruct-itemData,fkHandle); </P>
<P>Msg.MeasureItemStruct-itemWidth =pItem-Caption.Length()*8+40; </P>
<P>Msg.MeasureItemStruct-itemHeight = 20; </P>
<P>} </P>
<P>void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg) </P>
<P>{//画出菜单 </P>
<P>TMenuItem *pItem=MainMenu1-FindItem(Msg.DrawItemStruct-itemData,fkHandle); </P>
<P>TCanvas *pCanvas=new TCanvas; </P>
<P>pCanvas-Handle=Msg.DrawItemStruct-hDC; </P>
<P>RECT r=Msg.DrawItemStruct-rcItem; </P>
<P>pCanvas-Brush-Color=clBtnFace; </P>
<P>RECT r1=r; </P>
<P>r1.right+=1; </P>
<P>r1.bottom+=1; </P>
<P>r1.top-=1; </P>
<P>r1.left-=1; </P>
<P>pCanvas-FillRect(r); </P>
<P>::SetBkMode(pCanvas-Handle,TRANSPARENT); </P>
<P>pCanvas-TextOut(r.left+10,r.top+2,pItem-Caption); </P>
<P>r.right-=1; </P>
<P>r.bottom-=1; </P>
<P>if(Msg.DrawItemStruct-itemAction == ODA_SELECT </P>
<P>Msg.DrawItemStruct-itemStateODS_SELECTED ) </P>
<P>{ </P>
<P>pCanvas-Pen-Color=(TColor)(RGB(255,255,255)); </P>
<P>pCanvas-MoveTo(r.right,r.top); </P>
<P>pCanvas-LineTo(r.left,r.top); </P>
<P>pCanvas-LineTo(r.left,r.bottom); </P>
<P>pCanvas-Pen-Color=(TColor)(RGB(128,128,128)); </P>
<P>pCanvas-LineTo(r.right,r.bottom); </P>
<P>pCanvas-LineTo(r.right,r.top); </P>
<P>} </P>
<P>} </P> {:soso_e102:} 可以研究一下 !!!!! 这个不错。。。 看了,感觉不错,谢谢您提供
页:
[1]