|
我们知道,C++Builder没有自画菜单,但可以调用API函数::SetMenuItemInfo()来改
9 E7 M0 _1 r3 X4 [! A! z- E' g/ t9 ^变菜单类型,达到自画菜单的目的。下面的例子演示了如何使用自画菜单。当鼠标位于菜单 N; B" K/ t7 Y0 i! N) C6 J
上拾,菜单项将凸出来。(黑体字为添加的代码) ; I( j4 q K: m7 Q0 ?; R# U
7 `0 i7 E* j6 s//头文件 7 [) v5 j/ p- B3 p) d* U- o
//------------------------------------------
) l% V2 m5 c1 w3 U8 p" v#ifndef TestMenuH
W9 [9 x! K9 g0 @% N r#define TestMenuH 8 n2 q( k: q. l8 T
//-----------------------------------------
4 Y" |8 r4 A! v5 Z. @" e3 [#include Classes.hpp
' x. {; g9 d: w+ |9 e0 c1 w( c#include Controls.hpp
3 q, s3 P3 Y! b6 O9 Q#include StdCtrls.hpp % c% {, }: ~- r; N, e. C4 @8 V
#include Forms.hpp
/ w. v+ a# U- m7 C/ ~% {5 X* B0 G& K#include Menus.hpp//-------------------- & u8 I* {6 |/ Y) J* e
" M3 ^1 h r2 \+ q) ^) Z/ aclass TForm1 : public TForm
; z: ?' {3 p4 Q! ~+ ?3 j{
; R0 a- y1 n% L3 H& f' x( ~) L__published: // IDE-managed Components : M9 e8 W. `/ U' C$ k3 D8 \+ A
TMainMenu *MainMenu1; . l( X/ C5 t" G k% p* d! J3 L4 W( ^
TMenuItem *aaa1;
+ T, U3 _4 K7 Q0 H: ATMenuItem *aaaaaaaaa1;
* p0 w, ]4 R5 a, C( B# C$ S6 ?& ITMenuItem *ccc1;
8 ~, ?! p# E; a( G6 q+ t& yTMenuItem *ddd1; ! C. N9 k" a) C% c
TMenuItem *eee1; 1 b* `( |" V) L# Z
TMenuItem *ddsds1;
+ K' o3 t) ?$ z: B; Y$ n h+ XTMenuItem *fcdfsss1;
: K) i3 R, O6 w7 G GTMenuItem *dddddddd1;
9 W: T9 l* b/ U Nvoid __fastcall FormCreate(TObject *Sender);
5 L# |3 \9 z" B1 t& K& }: A# |; ~private: // User declarations " M: ]1 h+ ^* { T( \% I2 c
void __fastcall Modify(TMenuItem *pMenuItem); 5 x5 c* N2 k! g% M. I
protected :
. \' V# _$ O5 C* @MESSAGE void __fastcall CNMeasureItem(TWMMeasureItem Msg);//增加响应消息
, E$ j: B/ s+ oMESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);
, F( t, `4 z/ m5 I& mpublic: // User declarations t* Y. a3 `9 |9 y- y' |
__fastcall TForm1(TComponent* Owner); 7 ?# l- O- T; h$ ]8 S' i, T+ V, h( P9 ] o
BEGIN_MESSAGE_MAP//添加消息映射
0 e0 Y" B6 z2 h) |8 Z4 C. PVCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem); ; H6 w7 h/ Q9 V
VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem); + S: L9 K9 N" H' c& i7 k5 y$ u
END_MESSAGE_MAP(TForm);
* W6 f$ H2 A ~8 J* N};
: j n. K6 q" U5 O2 w, R8 x {# a//--------------------------------------------------------------------------- ( g: {5 q9 y1 p/ h; `$ u( L
extern PACKAGE TForm1 *Form1;
7 x4 ^) L2 \) g//---------------------------------------------------------------------------
# j- E8 R8 t3 @- @: D#endif
' L# x. B+ ^; Q% Z . y& S1 |$ Z. V4 r7 A5 i
//实现文件 $ A, `% z9 j8 L4 i- ]
//---------------------------------------------------------------------------
4 G5 Y/ f: G( X& @2 a9 {8 S/ Y#include vcl.h 4 r, R0 h5 V& |7 Y
#pragma hdrstop
, T7 ~+ z5 N0 c1 B" l' b
' W$ C+ ~/ k! o. G7 c9 r7 b' l$ h#include TestMenu.h 6 v$ C( @! h; y7 S% N9 X' |
//---------------------------------------------------------------------------
1 Y: Q% ^% F( Z5 V2 s#pragma package(smart_init)
% ?2 R6 Z: ~9 Y4 A# r7 t- G#pragma resource *.dfm % e3 }/ ~8 o) }
TForm1 *Form1; 4 x" a4 {4 U3 O7 X4 r/ R
//--------------------------------------------------------------------------- 1 F+ I: D) z/ P! d& m! U
__fastcall TForm1::TForm1(TComponent* Owner) + ^; Z4 q, u' \8 E
: TForm(Owner) 7 R: z0 {% B$ D) y: r8 }% k
{ 4 a4 r- a7 v f v) t4 Y
}
: [: s+ r1 p# F* ?# [3 O//---------------------------------------------------------------------------
- N# t8 `- j3 X4 |0 a. k
4 v5 O* b+ I0 q; U# Q' mvoid __fastcall TForm1::Modify(TMenuItem *pMenuItem)
% ~6 w/ y' [9 R5 y \{//修改缺省属性
9 ^/ \/ s6 l2 C; A( vfor(int i=0;ipMenuItem-Count;i++) & o. m8 H M1 @8 g) g
{ ! |9 w! q4 w7 k9 p
MENUITEMINFO mii=
7 }; a @) {7 X0 q{ 6 ` s; R$ G- b& p0 [
sizeof(MENUITEMINFO), 5 C8 h/ G4 k/ B, R0 b; t5 T
MIIM_TYPE|MIIM_DATA ,//改变类型和数据
$ o4 c1 A3 J$ S& mMF_OWNERDRAW,0,0,0,0,0,DWORD(pMenuItem-Items-Handle),
+ l% y+ q8 ?8 }//把菜单项的句柄赋给32位数据 6 z. Z& X& u6 E U/ f! [/ ]) q M
0,
+ o0 V% p; V, I `0, 1 f3 i7 e$ i! e; x! ~3 S
};
7 p$ s1 I' U2 \! |' s/ Zif(pMenuItem-Items-Caption!=-)//如果不是间隔线 ; M- ~" X9 o ]
::SetMenuItemInfo(pMenuItem-Handle,i,TRUE,mii); ( D0 ]+ v. m! y# e S6 y& X/ `
if(pMenuItem-Items-Count)//如果含有子菜单 5 |! ]" T [+ V7 n' Z* u% Z
Modify(pMenuItem-Items); ( b! S, x' Q5 X0 j/ e( @# B1 [. _+ o
} / E3 E2 h& v, [$ {& S+ w; S
P6 a5 H/ q. J( Z ]! O5 j* _" I; T} $ R5 k9 m4 P! X1 G5 Y+ O d8 Y
void __fastcall TForm1::FormCreate(TObject *Sender) : ?2 H! J( z) i% b; k& C O1 o0 O
{
9 q2 h0 ] `4 c- x vfor(int i=0;iMainMenu1-Items-Count;i++)
2 e8 q! q. J0 _{
: [# v3 u8 i' H! ^0 G9 hModify(MainMenu1-Items-Items);
. K) G( M# W0 J0 P* E} % D, |4 T$ }1 @. ]) f& z
DrawMenuBar(Handle);
! \- v6 \3 ?; V$ |+ u u; Q}
0 l/ k; J) g: R& y( q) l- k, D- t- G//--------------------------------------------------------------------------- 5 m' g3 \9 p* f) T+ @4 _
void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg) # Z$ Z& V( g' d- K# ~6 u! }# {: m
{//设置菜单大小 - i! N$ u/ u% h' C# [4 F
TMenuItem *pItem=MainMenu1-FindItem(Msg.MeasureItemStruct-itemData,fkHandle); 2 L0 s& d, G" _( a0 c
Msg.MeasureItemStruct-itemWidth =pItem-Caption.Length()*8+40; 6 T# R& Y' U8 N% ^
Msg.MeasureItemStruct-itemHeight = 20; * R3 f) k1 k6 v3 H
}
4 H8 Y7 @% O6 cvoid __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)
; d9 Q5 s3 U4 v6 R, d{//画出菜单
* }+ W" {2 T6 ]1 iTMenuItem *pItem=MainMenu1-FindItem(Msg.DrawItemStruct-itemData,fkHandle);
' B1 \! e A0 N. HTCanvas *pCanvas=new TCanvas; 5 J$ S1 Q- r1 \9 q
pCanvas-Handle=Msg.DrawItemStruct-hDC;
* L+ ]8 i6 ~/ J) [8 y$ B, u4 n0 oRECT r=Msg.DrawItemStruct-rcItem; ( t6 g5 s( w) N7 c
pCanvas-Brush-Color=clBtnFace; ) B# P- W. B5 B
RECT r1=r;
) g* S8 K5 y$ c0 [r1.right+=1; / U9 A9 p- _6 j3 v" D9 f
r1.bottom+=1; & s7 O" ] M, m1 e) ?0 c
r1.top-=1;
" O2 K1 T: A( K$ O L2 Gr1.left-=1; 6 [1 P4 z9 a! q. ^% l
pCanvas-FillRect(r);
" l4 u ? h! _4 A1 b::SetBkMode(pCanvas-Handle,TRANSPARENT);
7 c+ \$ D9 o% g& ^: e1 R( ApCanvas-TextOut(r.left+10,r.top+2,pItem-Caption);
: l h( P7 e. jr.right-=1; 3 w2 I" R2 W/ T& [. p
r.bottom-=1; 6 I( m6 ~% a" {* D, l( l* y( p! \
if(Msg.DrawItemStruct-itemAction == ODA_SELECT
' P6 T9 p6 O: |Msg.DrawItemStruct-itemStateODS_SELECTED ) ]. M, P0 G6 U) A
{
) O* e8 _6 a$ SpCanvas-Pen-Color=(TColor)(RGB(255,255,255));
" p& H- Y, ?3 g% u+ I) Q; W' gpCanvas-MoveTo(r.right,r.top);
" a ]! g# C# C, @3 @pCanvas-LineTo(r.left,r.top); - H) b9 l8 j& _- J" I* [3 ?9 B
pCanvas-LineTo(r.left,r.bottom);
$ y: `# }5 P$ ?* KpCanvas-Pen-Color=(TColor)(RGB(128,128,128)); 6 T3 [) ?3 l/ ` Q5 \. }0 ~6 u. V
pCanvas-LineTo(r.right,r.bottom);
9 m4 g5 k) \5 O2 h+ m) XpCanvas-LineTo(r.right,r.top);
7 U0 G) {, b* b3 @! w1 |8 l+ Y- ~} 6 k c- E6 U: h/ j d o) D3 C# [3 n
" K. x. L n/ i- ?$ S1 {, Z0 E} |