|
我们知道,C++Builder没有自画菜单,但可以调用API函数::SetMenuItemInfo()来改
6 M2 h; K, d1 V% v9 J+ E" g变菜单类型,达到自画菜单的目的。下面的例子演示了如何使用自画菜单。当鼠标位于菜单 ) B% b$ |5 @ D* W4 b
上拾,菜单项将凸出来。(黑体字为添加的代码)
- ~3 D- z! x) X/ |; } I& z& ?4 A) G4 m7 h3 a
//头文件 $ F7 b& b* x4 [# ~
//------------------------------------------
: H, d0 z S6 B( O2 L2 f#ifndef TestMenuH
2 i* r+ L* t( \9 t3 ?#define TestMenuH
/ x5 P; q. K/ N//----------------------------------------- ' e$ r" v1 s0 D, W& {' q8 q
#include Classes.hpp ' S# t4 M1 U/ B3 D
#include Controls.hpp
Z( p& H/ g8 }: B) D#include StdCtrls.hpp
- O( \' [9 Q- J- F#include Forms.hpp
1 t: C6 w6 g* {1 c#include Menus.hpp//--------------------
& n3 n; S) s4 Z! S! E. q
4 V+ }* G. M7 Qclass TForm1 : public TForm . U5 Q7 | g1 I# @
{ * y+ q2 ]$ q& E& C+ a7 n* y
__published: // IDE-managed Components
* ?0 Q$ L; \) ? w0 a' l- ATMainMenu *MainMenu1; 9 G5 }0 h% ^7 Y6 t) Q- A+ s
TMenuItem *aaa1;
5 Y4 Q9 e) \7 a5 Y! O9 ATMenuItem *aaaaaaaaa1;
) m, U% W/ q8 p ~TMenuItem *ccc1; 0 D% K% b/ d/ G* b
TMenuItem *ddd1;
( T& y4 _& \' {& M% H! s' J+ \TMenuItem *eee1;
2 ?4 d8 b7 v7 q0 ?: {TMenuItem *ddsds1; 4 ~( J9 Z- f" C9 d7 Z/ r
TMenuItem *fcdfsss1; - m; ^2 b8 V1 x
TMenuItem *dddddddd1; 0 ]- A* ~9 L9 v) L
void __fastcall FormCreate(TObject *Sender);
: V- q: y- b& ~8 a' uprivate: // User declarations & y. M. `8 @! U/ f1 ]- i
void __fastcall Modify(TMenuItem *pMenuItem);
3 G9 H5 b0 ~0 Y8 }8 P' i8 F( ]protected : & Y. ^$ @, B* G# a' n# c" j$ |8 R0 [
MESSAGE void __fastcall CNMeasureItem(TWMMeasureItem Msg);//增加响应消息 1 d2 N7 Y7 p9 f* r& m b
MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);
9 X+ \% L. a0 A$ ]7 m) lpublic: // User declarations
4 o5 Y6 i' O5 F, W8 ?7 P7 C! t x__fastcall TForm1(TComponent* Owner); $ S6 ]/ R; |* i E
BEGIN_MESSAGE_MAP//添加消息映射 9 X3 X. C) M& ~* j- \
VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);
( z: _5 a* I3 [VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem); : V5 U8 V* F7 S6 C' I# V6 n z
END_MESSAGE_MAP(TForm); & x5 H' q. ] U7 e3 k" `
};
- f; V6 R Q5 p6 s: `; _+ y//--------------------------------------------------------------------------- 8 s4 E" V8 H) ]
extern PACKAGE TForm1 *Form1; / m) [2 w2 I+ v+ j( G
//--------------------------------------------------------------------------- * ?6 X+ f7 b9 W7 ~% l* ?
#endif
8 B, u* y/ y$ _4 h. T8 w/ c* ? " I: |# ]+ x ?. `$ o8 R6 ~! F
//实现文件
' S: i; [& `5 K//--------------------------------------------------------------------------- ' O$ Z; R5 {2 }3 E2 V! E
#include vcl.h 9 ]+ ]) L- [* I
#pragma hdrstop ' Y4 N: G% u) u: x0 N. r# {
Y# n8 n3 g" b% z( Q/ L. a#include TestMenu.h
/ T3 U0 j0 a; y( X( p! U. D//--------------------------------------------------------------------------- / k& M) n( E& D* g$ o
#pragma package(smart_init)
! m5 \! a2 U5 G0 j#pragma resource *.dfm
$ n5 f1 ~9 _) `7 q" fTForm1 *Form1;
( u5 _8 |( R3 @+ y: p9 X//--------------------------------------------------------------------------- # s1 Q1 d$ H& J7 i3 n$ u( j
__fastcall TForm1::TForm1(TComponent* Owner)
3 X+ N+ R y E" z; {+ Q q, y7 m' ?: TForm(Owner)
. u' V( B f! S4 u2 y" c1 L{ " y5 ?3 @( W7 R: m! z! a; {
} 5 Y0 u% O G% y
//--------------------------------------------------------------------------- ) p4 R% J& J! S2 Z+ i9 }% Q
( P: u- W2 f2 T5 B" b$ t$ E
void __fastcall TForm1::Modify(TMenuItem *pMenuItem) 4 [8 c1 n" E& o: I
{//修改缺省属性
: B$ y8 r: p( J! Rfor(int i=0;ipMenuItem-Count;i++)
/ f2 F4 A/ h# s2 b{
3 k# u% W; y* X" `2 Z9 r0 qMENUITEMINFO mii=
; _* ?: T5 P% Q# D{
* N' O$ s* j& e# ]4 L/ B% E* rsizeof(MENUITEMINFO), 5 l% d' {$ F# }* I
MIIM_TYPE|MIIM_DATA ,//改变类型和数据
9 W& [7 A0 K& F5 q/ }MF_OWNERDRAW,0,0,0,0,0,DWORD(pMenuItem-Items-Handle),
5 l% ^$ g0 X& f3 d$ t7 x/ D//把菜单项的句柄赋给32位数据 " P1 n( s4 d% C& q2 R3 W- S
0,
6 k; o" `( _* h+ s0,
, E+ ^2 r$ u) {1 Z};
6 e, B; ]6 I3 C& }. z9 F0 `if(pMenuItem-Items-Caption!=-)//如果不是间隔线
; |, n! W$ R; E4 D- v# m/ h) u& z::SetMenuItemInfo(pMenuItem-Handle,i,TRUE,mii);
' C2 a4 g( Y; [. R; Q; X8 vif(pMenuItem-Items-Count)//如果含有子菜单
! R" o+ \1 Q4 Y( p- l, M6 b) |$ wModify(pMenuItem-Items); 9 z# s+ m4 a1 z2 T+ q
}
7 J8 b' W4 ~" _$ u/ h) j 8 G' S# s4 V( m$ c8 v
}
1 X* e- S/ B: q; Q" v$ d3 q6 }void __fastcall TForm1::FormCreate(TObject *Sender)
- S1 U- I8 f8 t1 U0 p. j{
0 ~% j- f& X4 ?: r4 I( L& ifor(int i=0;iMainMenu1-Items-Count;i++)
5 T; ]3 n0 Q1 L" L) T! u- _6 E{ 7 m# A% w/ |, k0 Z
Modify(MainMenu1-Items-Items);
& c8 z! N; ~$ {1 ^! d} 5 ?+ u0 ~! D. R8 K) M/ ?
DrawMenuBar(Handle); 9 ]& x5 C$ S1 Y/ {
}
: _* ^8 N0 U( Z/ J3 a' w) V- b//--------------------------------------------------------------------------- / Z! {; s* C) Z% C& ~
void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg) * m, m" c. `* l# \
{//设置菜单大小 $ f `: X/ z0 z" J% @
TMenuItem *pItem=MainMenu1-FindItem(Msg.MeasureItemStruct-itemData,fkHandle);
7 j" y* E5 A+ L8 OMsg.MeasureItemStruct-itemWidth =pItem-Caption.Length()*8+40; ' N; n8 G0 b3 G% g# Y6 x
Msg.MeasureItemStruct-itemHeight = 20;
" e1 G& C; H Q' \9 ^6 ^}
* }( W( W8 g2 T0 v' g4 _void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)
" m9 f. N3 c: a3 f9 X{//画出菜单
X5 u" A1 @! U0 `" a7 J# Z# p xTMenuItem *pItem=MainMenu1-FindItem(Msg.DrawItemStruct-itemData,fkHandle); 3 v1 e1 f" d& a; t! T
TCanvas *pCanvas=new TCanvas; 5 \. b& y, x% e5 w' Y
pCanvas-Handle=Msg.DrawItemStruct-hDC; ; ^/ \1 D R- V) [( Y4 |9 m% ?
RECT r=Msg.DrawItemStruct-rcItem;
: Z" y. Y( [4 v( `pCanvas-Brush-Color=clBtnFace; 5 S6 N$ q8 f7 U& s! X
RECT r1=r;
/ a4 @/ |, A# {; pr1.right+=1; 4 U( |+ l+ _0 R3 U! k8 L
r1.bottom+=1;
. D- \. J, d, o* Ar1.top-=1; ) o) u& D, B0 v2 [, }" ?
r1.left-=1;
0 P) ~' {; A3 `pCanvas-FillRect(r); " a6 o% ]6 I p* `: o
::SetBkMode(pCanvas-Handle,TRANSPARENT); % X8 T# ^% w: g
pCanvas-TextOut(r.left+10,r.top+2,pItem-Caption); : P6 m9 [ X7 C% x& r9 I
r.right-=1; $ ^5 n0 N5 r8 T9 k; m, _" ?
r.bottom-=1; 0 T3 ?& b4 {- i7 j" o
if(Msg.DrawItemStruct-itemAction == ODA_SELECT , G( ~ B& T9 y$ `3 L& ~
Msg.DrawItemStruct-itemStateODS_SELECTED )
2 h4 D8 x: i8 b# O. S9 Z{ $ Y" i2 b$ v' @$ [2 h' E$ W3 @
pCanvas-Pen-Color=(TColor)(RGB(255,255,255));
6 |# Q E1 _, D% X. D% ApCanvas-MoveTo(r.right,r.top); ! E) g& G( g' a3 w% A1 [
pCanvas-LineTo(r.left,r.top); ) @* [8 }! n6 n# d' U$ w
pCanvas-LineTo(r.left,r.bottom);
8 F" T2 q) p5 D7 w+ o! fpCanvas-Pen-Color=(TColor)(RGB(128,128,128));
]* [ ~8 B" W& kpCanvas-LineTo(r.right,r.bottom); ; N4 S$ h" v" v
pCanvas-LineTo(r.right,r.top); , x" Z7 g4 n: F0 d
}
% P* D6 }2 [ t% r4 D% W7 t3 n3 m4 u8 j7 j1 {- ^
} |