|
我们知道,C++Builder没有自画菜单,但可以调用API函数::SetMenuItemInfo()来改 $ D5 e& T" k9 x0 ]( V! G: L! w' a
变菜单类型,达到自画菜单的目的。下面的例子演示了如何使用自画菜单。当鼠标位于菜单
! M' _6 z$ e# V5 ?上拾,菜单项将凸出来。(黑体字为添加的代码)
" Z% C2 c j D9 S/ _+ C 2 e( u; Q: L- ?0 G/ h
//头文件 1 p$ e1 Q# c4 x2 Q+ [; R+ u
//------------------------------------------ ( v( L3 P9 o5 v' B
#ifndef TestMenuH
$ ?, \7 ^$ s- g6 h( T1 R/ e#define TestMenuH
3 ]3 ~4 r* _+ S8 H//-----------------------------------------
* s6 c9 j* U3 y+ c: J, ~4 l# d& h#include Classes.hpp $ F5 x3 }: K" Q( o3 P
#include Controls.hpp 1 Q7 i: f( l( o6 c7 t& Q
#include StdCtrls.hpp 7 }$ R5 r; f: Q
#include Forms.hpp
" Z5 N: q% E; x T* Y#include Menus.hpp//--------------------
( N; L1 ~2 S1 q8 p" f9 D; g9 e9 Q
( D! [9 T, Y1 Z7 V) I1 Q+ Q+ Sclass TForm1 : public TForm
0 l& K, z9 [, ~) R{ 8 `' q+ U/ c! e9 K! f: q+ U
__published: // IDE-managed Components
( }2 ?' y. Q K0 r U; z" W3 wTMainMenu *MainMenu1; , N$ R1 [ C# Z4 l4 q5 U# j7 i6 L
TMenuItem *aaa1;
" j T; q( I% _TMenuItem *aaaaaaaaa1; . @0 o# v5 s. z" [6 J2 i7 \: N
TMenuItem *ccc1;
0 u0 H* t5 t. \2 [4 ?TMenuItem *ddd1; / l/ X6 x3 L3 Y3 u
TMenuItem *eee1;
0 t9 W. D7 f1 G1 T; `TMenuItem *ddsds1; ( }9 M& Q. Z+ a7 T. n/ Z" N; S3 N" _
TMenuItem *fcdfsss1; ! F# m9 H! _* Q" Q1 k: I
TMenuItem *dddddddd1; 9 @: L9 ?$ ?6 ]- B- w
void __fastcall FormCreate(TObject *Sender);
6 b) X* ]4 ]! C9 S Q4 dprivate: // User declarations
: _; s$ p9 H- [$ A& |void __fastcall Modify(TMenuItem *pMenuItem); 6 v f( x' j7 m Z) f: ~7 |
protected : : r$ M a: H8 Z; K) H
MESSAGE void __fastcall CNMeasureItem(TWMMeasureItem Msg);//增加响应消息 + _! Z; O k; E
MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);
$ U0 M W/ U: z |* y) wpublic: // User declarations
* M; D& x/ \9 l: c) `4 c, t__fastcall TForm1(TComponent* Owner); # A% O0 n/ s) K/ |8 v/ O* r
BEGIN_MESSAGE_MAP//添加消息映射 4 s# T/ M, p: }7 R/ @7 E( M
VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem); 7 s, G9 [) K! s! k0 M9 t; g
VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem); 0 [5 V& J9 E9 K/ u. C* s8 x/ }
END_MESSAGE_MAP(TForm);
- I- ~; D8 P ^" q6 g0 G}; # Q+ \) Z! k6 J1 b G/ W% [
//--------------------------------------------------------------------------- " a% T! u" q: U2 q s" J+ L4 ]4 j
extern PACKAGE TForm1 *Form1; : V' }3 u; {% @9 F" A0 U: p) x
//---------------------------------------------------------------------------
4 w) I+ {9 q; T#endif
8 z7 ^( j8 S/ N. f1 ]8 v- F 0 ]$ S" @. d: j7 D0 [
//实现文件 5 {* c6 ^+ s2 d! ^# M
//--------------------------------------------------------------------------- ; @/ F8 p' p; L" E" z$ ^
#include vcl.h * s" y4 h! R7 q
#pragma hdrstop
! Y& j4 ^/ n$ E, `, J
% B+ D( Y8 W; ^, P4 i8 i9 ^; F. n0 ^#include TestMenu.h
9 G/ p' l3 u9 L//--------------------------------------------------------------------------- . V& s2 l% h; M
#pragma package(smart_init)
, n: {4 a( ^' j) Y& M#pragma resource *.dfm
+ {& C G1 m. c% r: y8 `6 h, s: NTForm1 *Form1;
- M. a5 U# z% f1 H$ X2 j4 c//---------------------------------------------------------------------------
- t0 h( c9 Z8 e/ X7 \ A H__fastcall TForm1::TForm1(TComponent* Owner) ; o2 q9 U& b' p8 Z8 W" u
: TForm(Owner)
$ A+ O. k0 P1 J& L* V0 a# d$ n6 e{
3 q' e8 K3 M% L( I; f' R6 g}
$ H0 x+ u7 r3 R/ \ V+ j9 h/ G//---------------------------------------------------------------------------
* l: V) b8 m6 V7 e! P- }) N& z ) N) s L& C$ b# Q, m/ l/ S/ j' t
void __fastcall TForm1::Modify(TMenuItem *pMenuItem) ; L1 `0 Q* x6 I3 V# M5 C
{//修改缺省属性
# E$ K* U7 X% q$ [ efor(int i=0;ipMenuItem-Count;i++) & Z/ E1 d" n6 K; b
{ 9 _6 _" E+ \4 _" A! v, l
MENUITEMINFO mii=
1 w: C+ h- T6 S0 _! |{ , L- x8 f3 O0 g) F5 e4 [$ m
sizeof(MENUITEMINFO), 0 U# C2 D+ L' A/ W7 R5 G- O- {: ~
MIIM_TYPE|MIIM_DATA ,//改变类型和数据 $ m" T9 D- D$ z) s( I; d
MF_OWNERDRAW,0,0,0,0,0,DWORD(pMenuItem-Items-Handle), 7 y4 ]6 _3 f% C5 M3 S
//把菜单项的句柄赋给32位数据
/ x+ ]2 F4 P1 u+ m$ _0 X* [: Z0,
' y( z/ Y* b. Z7 |4 B* P. K3 K) r0, . `( R; a/ M% n
}; ; p* m6 i! I" n4 `( F
if(pMenuItem-Items-Caption!=-)//如果不是间隔线 5 }0 o. {& G6 M8 L/ Z% p+ m
::SetMenuItemInfo(pMenuItem-Handle,i,TRUE,mii);
- x9 D* B5 x+ I$ t2 [if(pMenuItem-Items-Count)//如果含有子菜单
& F/ A; y0 F% I: u) r7 ZModify(pMenuItem-Items);
0 V+ l* e: `4 k1 j% E} " U4 h ?% J. I6 c: v6 A! C
* g4 u7 |+ @" _' e6 `- S9 B} , w$ q- @3 f& O1 R0 ^
void __fastcall TForm1::FormCreate(TObject *Sender)
L2 k; { j' [" k! Y* E& F{ y2 Y2 ^5 k! q. z6 k2 d1 c
for(int i=0;iMainMenu1-Items-Count;i++) 7 v+ X! ~0 R* t. Y& H' u* @
{ $ h. a: v7 {& ]7 q5 n" u& d) M6 L
Modify(MainMenu1-Items-Items); 8 K3 C7 Y2 p2 J( R% V8 ?2 s* {8 `
}
8 j: A' ], F# l n! k1 d$ MDrawMenuBar(Handle); ' o7 e. b4 F2 s7 {9 c# s
}
2 T2 w$ ^" R4 M6 E- Z8 n//---------------------------------------------------------------------------
5 \* r$ M/ ^% Nvoid __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg) 2 M3 U9 B9 b! ]9 x, w) u
{//设置菜单大小 / u' n3 R( ^9 o' W* t* c
TMenuItem *pItem=MainMenu1-FindItem(Msg.MeasureItemStruct-itemData,fkHandle); ; F% r, T* ~' W- Y
Msg.MeasureItemStruct-itemWidth =pItem-Caption.Length()*8+40;
+ m* O& h1 L3 fMsg.MeasureItemStruct-itemHeight = 20;
$ n2 J5 v8 f8 I3 z# n( j7 u5 h} 6 R6 r4 H; f" I4 n+ x3 l
void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg) * r9 G$ F, Y. C2 h1 j
{//画出菜单
4 ^8 u# Z! M9 b" Z, y# rTMenuItem *pItem=MainMenu1-FindItem(Msg.DrawItemStruct-itemData,fkHandle); 3 I, M( }# Z2 G2 W* l5 f2 z) d% `
TCanvas *pCanvas=new TCanvas; & k3 S# K8 I( V4 z* Y& H7 }" U
pCanvas-Handle=Msg.DrawItemStruct-hDC; , T+ b+ P, M2 [. ?# E- [5 }1 r6 }$ r
RECT r=Msg.DrawItemStruct-rcItem;
/ V; R4 \9 @( _. ?+ h% wpCanvas-Brush-Color=clBtnFace; + T* n8 H# n7 q; V+ G8 _! v( S( ]
RECT r1=r; ' x! F: ^9 w& N5 S% ^7 K
r1.right+=1; ! |* W W6 i, W, b/ F
r1.bottom+=1; 5 H6 l- s1 N0 t& W# D3 A
r1.top-=1; " g' B2 U$ m% i u. }# g
r1.left-=1; 1 \* _# b5 j9 J
pCanvas-FillRect(r); & ^) r* S N* Q) F/ P& m5 ~2 ~3 h
::SetBkMode(pCanvas-Handle,TRANSPARENT); ' W- E0 u: `# t$ t; A9 |) s
pCanvas-TextOut(r.left+10,r.top+2,pItem-Caption);
7 y0 H9 L# _) o+ s+ I# mr.right-=1;
) r; ]/ M% B# nr.bottom-=1; $ s! ~& z& ^" n& k6 o
if(Msg.DrawItemStruct-itemAction == ODA_SELECT # M" u: r/ a8 I2 A
Msg.DrawItemStruct-itemStateODS_SELECTED ) 9 \. t3 F7 ?+ B8 D8 `& v1 k8 ^
{
- D) G$ h: K% s0 @$ u+ Q. mpCanvas-Pen-Color=(TColor)(RGB(255,255,255)); " Q0 p8 R: d# |1 F
pCanvas-MoveTo(r.right,r.top); : ?' W' S! V" P
pCanvas-LineTo(r.left,r.top); ) S0 A( w C! l, ~+ @1 s
pCanvas-LineTo(r.left,r.bottom); 7 p/ m" |$ i7 x0 x& U2 b* _
pCanvas-Pen-Color=(TColor)(RGB(128,128,128));
) I2 p, B* g4 m" J, T! N! tpCanvas-LineTo(r.right,r.bottom); 7 B/ k& p5 d' r8 f2 m
pCanvas-LineTo(r.right,r.top);
$ G, u; I" c) b9 q* L3 _) A}
2 |4 @, J+ _; ]; w0 i$ e; T a) M- W. e6 n1 }/ V# F; o% @: L
} |