我们知道,C++Builder没有自画菜单,但可以调用API函数::SetMenuItemInfo()来改
* F6 E N; I* |变菜单类型,达到自画菜单的目的。下面的例子演示了如何使用自画菜单。当鼠标位于菜单
7 Z0 w3 X3 }1 G T D8 N0 A6 c上拾,菜单项将凸出来。(黑体字为添加的代码)
, j4 V- Y7 q' z, J, ]
//头文件
//------------------------------------------
3 B% Q& Y! U1 g#ifndef TestMenuH
' }: p. c* |. _7 v' Y" ^+ M* F#define TestMenuH
9 N- c# {* z7 ~4 b0 P& m4 b9 h//-----------------------------------------
" }: P. `2 O. v7 Y) [8 V; N#include Classes.hpp
#include Controls.hpp
#include StdCtrls.hpp
3 w8 x% e, H1 |6 h4 f#include Forms.hpp
#include Menus.hpp//--------------------
class TForm1 : public TForm
" E$ g- d, \; t0 S: S9 h! e* o. E{
__published: // IDE-managed Components
: w( {; f, C, P& t. D3 xTMainMenu *MainMenu1;
( C" V% r: u2 f O" p0 vTMenuItem *aaa1;
3 X! ^% E Y2 T0 S6 FTMenuItem *aaaaaaaaa1;
TMenuItem *ccc1;
; t$ P% h# ]% } j8 L# Z1 ?" f2 ZTMenuItem *ddd1;
2 C- t0 K: ]! k" xTMenuItem *eee1;
TMenuItem *ddsds1;
& k* V+ \- W' l2 T* P% N6 L; W+ sTMenuItem *fcdfsss1;
) R2 x5 `& h# {9 m2 x1 eTMenuItem *dddddddd1;
void __fastcall FormCreate(TObject *Sender);
private: // User declarations
8 O( a4 h y( i! }3 }+ Evoid __fastcall Modify(TMenuItem *pMenuItem);
6 z" H; i G- E, o5 ]protected :
MESSAGE void __fastcall CNMeasureItem(TWMMeasureItem Msg);//增加响应消息
9 L/ t0 K7 |0 [+ K, KMESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);
/ U6 k+ E: y0 D( O9 kpublic: // User declarations
__fastcall TForm1(TComponent* Owner);
BEGIN_MESSAGE_MAP//添加消息映射
VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);
7 D S7 X" d6 R& Y8 nVCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);
* k& p2 _8 x& fEND_MESSAGE_MAP(TForm);
};
//---------------------------------------------------------------------------
9 K% }: r8 ]5 bextern PACKAGE TForm1 *Form1;
' O$ r! E4 _8 h2 s- h//---------------------------------------------------------------------------
#endif
8 z; Q2 l) C1 i
//实现文件
//---------------------------------------------------------------------------
6 q4 k, I$ e# L. b. ]4 `#include vcl.h
: C4 l5 H( ^& C3 [- C# L2 a% o9 r#pragma hdrstop
2 v+ H0 L2 B) K$ u
#include TestMenu.h
2 P0 v/ F" M# ]//---------------------------------------------------------------------------
, M2 F4 V! i0 m4 `; E% p7 ]$ l#pragma package(smart_init)
, p l4 G/ P. ~% K#pragma resource *.dfm
TForm1 *Form1;
//---------------------------------------------------------------------------
7 K! W( a$ c3 N3 O8 Y" P1 O, o__fastcall TForm1::TForm1(TComponent* Owner)
, o5 @- w& U8 n, ]# d$ t9 ?: TForm(Owner)
{
! j9 q7 s% U4 f, I |8 x0 E$ n}
//---------------------------------------------------------------------------
4 ?1 z$ ?$ e" |; U" t+ D
void __fastcall TForm1::Modify(TMenuItem *pMenuItem)
{//修改缺省属性
6 U: C/ U) z- ^5 Z5 v8 T* Ffor(int i=0;ipMenuItem-Count;i++)
{
MENUITEMINFO mii=
8 D( F0 P% h. n, I! {{
sizeof(MENUITEMINFO),
MIIM_TYPE|MIIM_DATA ,//改变类型和数据
5 y8 r: c/ o% }# s3 [: s# x' F( \MF_OWNERDRAW,0,0,0,0,0,DWORD(pMenuItem-Items-Handle),
//把菜单项的句柄赋给32位数据
! P1 s* K4 S' n3 a$ y* x! }* Y0,
0,
};
if(pMenuItem-Items-Caption!=-)//如果不是间隔线
::SetMenuItemInfo(pMenuItem-Handle,i,TRUE,mii);
if(pMenuItem-Items-Count)//如果含有子菜单
. n5 l: U, K$ NModify(pMenuItem-Items);
3 r% c. M; Z2 I+ @}
( }$ W9 O, _& e# R. E, \
}
4 P B) a0 C5 Nvoid __fastcall TForm1::FormCreate(TObject *Sender)
{
4 F; J4 `- q, p" {! q8 I# i$ Ofor(int i=0;iMainMenu1-Items-Count;i++)
{
: Z% \" m9 \; g/ M" D, BModify(MainMenu1-Items-Items);
/ s$ j0 e: F7 g3 j; H- |' \}
DrawMenuBar(Handle);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)
{//设置菜单大小
3 L; ?( ~/ G) ]$ o' K- K4 aTMenuItem *pItem=MainMenu1-FindItem(Msg.MeasureItemStruct-itemData,fkHandle);
Msg.MeasureItemStruct-itemWidth =pItem-Caption.Length()*8+40;
Msg.MeasureItemStruct-itemHeight = 20;
}
void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)
" \) Y* X. d* E& }. _{//画出菜单
) X: Y2 Z% j5 W$ v4 P2 n/ \TMenuItem *pItem=MainMenu1-FindItem(Msg.DrawItemStruct-itemData,fkHandle);
TCanvas *pCanvas=new TCanvas;
, z7 h' n9 j% `* a# d6 e5 ypCanvas-Handle=Msg.DrawItemStruct-hDC;
RECT r=Msg.DrawItemStruct-rcItem;
1 z$ p+ H& E8 mpCanvas-Brush-Color=clBtnFace;
& R& A, c4 E# ?% ^! m3 FRECT r1=r;
r1.right+=1;
r1.bottom+=1;
r1.top-=1;
r1.left-=1;
/ m# k, }1 c3 ~6 u5 @8 ]1 o" V/ ^- }pCanvas-FillRect(r);
8 o& \) o% ] G::SetBkMode(pCanvas-Handle,TRANSPARENT);
pCanvas-TextOut(r.left+10,r.top+2,pItem-Caption);
r.right-=1;
r.bottom-=1;
* [$ E8 w0 F5 f3 {9 jif(Msg.DrawItemStruct-itemAction == ODA_SELECT
2 {5 _5 M1 B4 y. |/ cMsg.DrawItemStruct-itemStateODS_SELECTED )
{
pCanvas-Pen-Color=(TColor)(RGB(255,255,255));
pCanvas-MoveTo(r.right,r.top);
2 f$ l" _0 ]$ }" m D1 c4 _pCanvas-LineTo(r.left,r.top);
pCanvas-LineTo(r.left,r.bottom);
pCanvas-Pen-Color=(TColor)(RGB(128,128,128));
1 i' c, _. Q% g+ O! w7 S- ]pCanvas-LineTo(r.right,r.bottom);
pCanvas-LineTo(r.right,r.top);
}
}

| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |