我们知道,C++Builder没有自画菜单,但可以调用API函数::SetMenuItemInfo()来改
变菜单类型,达到自画菜单的目的。下面的例子演示了如何使用自画菜单。当鼠标位于菜单
上拾,菜单项将凸出来。(黑体字为添加的代码)
4 a6 r1 a5 |3 E, r
//头文件
& Z/ A$ e8 P0 [4 _2 i, `: W//------------------------------------------
#ifndef TestMenuH
8 N3 d! J( g; S$ \) _7 f! G#define TestMenuH
//-----------------------------------------
#include Classes.hpp
#include Controls.hpp
: o% w f1 X# f- q1 I! ^" Q, |2 {#include StdCtrls.hpp
* I5 I3 P' \1 L* M. {#include Forms.hpp
) _3 c, v6 g; h! n1 K#include Menus.hpp//--------------------
class TForm1 : public TForm
{
1 ^ G$ M I0 U& q2 l__published: // IDE-managed Components
TMainMenu *MainMenu1;
2 H" m5 I) @* STMenuItem *aaa1;
TMenuItem *aaaaaaaaa1;
TMenuItem *ccc1;
TMenuItem *ddd1;
# y. Z: R( _4 _/ ?2 y( y9 c, kTMenuItem *eee1;
TMenuItem *ddsds1;
TMenuItem *fcdfsss1;
TMenuItem *dddddddd1;
void __fastcall FormCreate(TObject *Sender);
& G9 N# v2 E1 j4 S5 rprivate: // User declarations
void __fastcall Modify(TMenuItem *pMenuItem);
protected :
5 K, |# b" T" u( I) c2 OMESSAGE void __fastcall CNMeasureItem(TWMMeasureItem Msg);//增加响应消息
MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);
2 ^# o6 }, }* `4 _public: // User declarations
' F1 R A2 r: N4 ~5 P; m7 z5 z__fastcall TForm1(TComponent* Owner);
BEGIN_MESSAGE_MAP//添加消息映射
* y9 {' `; r) U6 g6 XVCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);
VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);
. @- x) A r0 A# e5 S: R! O$ \END_MESSAGE_MAP(TForm);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
$ ]9 V4 _# p# V. w//---------------------------------------------------------------------------
# }8 r9 N/ N1 j4 G$ j- b2 Q#endif
: U" D* H+ W, S; i0 X
//实现文件
//---------------------------------------------------------------------------
#include vcl.h
; c6 s+ O. f. ?#pragma hdrstop
9 v5 _* l/ w y$ ^6 ^6 X& ]
#include TestMenu.h
: u( ^8 h( d. ?% n3 y* N2 R//---------------------------------------------------------------------------
1 D/ u6 d8 Q* h% z#pragma package(smart_init)
, n; x1 C& c0 x5 d! Z#pragma resource *.dfm
TForm1 *Form1;
' z+ s) a0 ], V//---------------------------------------------------------------------------
# u( m8 A, T! h__fastcall TForm1::TForm1(TComponent* Owner)
, T, f. `7 l# k2 G: TForm(Owner)
{
}
//---------------------------------------------------------------------------
: [" C6 q9 f+ B; B- U. R, l4 m$ I) O- a! C+ s$ ^
void __fastcall TForm1::Modify(TMenuItem *pMenuItem)
{//修改缺省属性
0 K0 T( N$ F9 X8 t- gfor(int i=0;ipMenuItem-Count;i++)
- a. K% M0 a( g- I1 Z{
1 I2 J1 `3 W2 M2 d. k+ t7 zMENUITEMINFO mii=
4 k7 ]6 `0 E. g0 ?) @+ q/ Y) d) }{
sizeof(MENUITEMINFO),
; P! R3 R0 `; Y+ s7 e; HMIIM_TYPE|MIIM_DATA ,//改变类型和数据
- o# G/ g- D( B, bMF_OWNERDRAW,0,0,0,0,0,DWORD(pMenuItem-Items-Handle),
//把菜单项的句柄赋给32位数据
% n _# S, a$ Z0,
0,
};
if(pMenuItem-Items-Caption!=-)//如果不是间隔线
::SetMenuItemInfo(pMenuItem-Handle,i,TRUE,mii);
if(pMenuItem-Items-Count)//如果含有子菜单
Modify(pMenuItem-Items);
}
0 D: |4 m3 o- r' A! K. c1 e) H7 c; L6 h# H2 D; I& h
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
for(int i=0;iMainMenu1-Items-Count;i++)
{
; ? I% A% I4 fModify(MainMenu1-Items-Items);
}
2 l" t4 @% g% V0 R& t* o1 WDrawMenuBar(Handle);
}
; o. D6 V9 w$ p8 h, w0 ?//---------------------------------------------------------------------------
( A3 D4 E* f8 R+ Q, xvoid __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)
& h, Q0 a, a5 V$ X, P* ~) z{//设置菜单大小
. p% g9 x; @% PTMenuItem *pItem=MainMenu1-FindItem(Msg.MeasureItemStruct-itemData,fkHandle);
, _+ a& ~, J* H/ n4 MMsg.MeasureItemStruct-itemWidth =pItem-Caption.Length()*8+40;
, ^+ J( F. K% G7 `6 \3 dMsg.MeasureItemStruct-itemHeight = 20;
}
void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)
{//画出菜单
TMenuItem *pItem=MainMenu1-FindItem(Msg.DrawItemStruct-itemData,fkHandle);
4 z3 `, D# @8 @. VTCanvas *pCanvas=new TCanvas;
9 C0 P3 D* a" w( Q' H0 [pCanvas-Handle=Msg.DrawItemStruct-hDC;
$ i& D* {, k9 h4 I$ g$ F+ HRECT r=Msg.DrawItemStruct-rcItem;
, j* h3 r/ l# ^1 v* D& P; F, Y& ?pCanvas-Brush-Color=clBtnFace;
RECT r1=r;
' C- c# ~5 k2 a. jr1.right+=1;
) Y( ]- E( A( |; A o# M8 \r1.bottom+=1;
r1.top-=1;
r1.left-=1;
! V5 i$ o1 `7 R- {4 A9 zpCanvas-FillRect(r);
::SetBkMode(pCanvas-Handle,TRANSPARENT);
/ l6 G- ?, \, p( f' Q6 `3 I: GpCanvas-TextOut(r.left+10,r.top+2,pItem-Caption);
! e% M, }, c u; F7 ~4 Z, W5 X2 ~8 W# Gr.right-=1;
r.bottom-=1;
if(Msg.DrawItemStruct-itemAction == ODA_SELECT
4 q8 R" \0 t2 Z% F& Y3 oMsg.DrawItemStruct-itemStateODS_SELECTED )
{
0 ^: w8 Z; C9 B" LpCanvas-Pen-Color=(TColor)(RGB(255,255,255));
pCanvas-MoveTo(r.right,r.top);
; P9 m ^- N1 w3 t' g* J& F: BpCanvas-LineTo(r.left,r.top);
pCanvas-LineTo(r.left,r.bottom);
2 ^& E7 A' M+ t# {& m: FpCanvas-Pen-Color=(TColor)(RGB(128,128,128));
( E; S% Y; F$ u: w$ [2 ^pCanvas-LineTo(r.right,r.bottom);
pCanvas-LineTo(r.right,r.top);
}
}

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