|
我们知道,C++Builder没有自画菜单,但可以调用API函数::SetMenuItemInfo()来改 ; |7 A0 s6 w- X3 K$ h7 @3 i+ i2 c
变菜单类型,达到自画菜单的目的。下面的例子演示了如何使用自画菜单。当鼠标位于菜单 8 \8 L: w2 e4 T
上拾,菜单项将凸出来。(黑体字为添加的代码)
( n' S% o2 `1 k) ] , O6 j' G% k) [% h; v$ U! ?2 [
//头文件
7 [& V6 S6 h' E& ]0 y//------------------------------------------ 5 I4 j# C+ ~6 Q! I* {
#ifndef TestMenuH 9 i* N1 O+ d9 g6 m
#define TestMenuH
- R$ }( o% s* `# C//-----------------------------------------
k* c0 t4 y1 U3 B#include Classes.hpp 7 a* ^0 @* \8 D/ e! g T0 Z
#include Controls.hpp % K; y9 U" Z5 X! x' _# \
#include StdCtrls.hpp $ r' k) K5 U- l q: w7 O, C
#include Forms.hpp
& D( v R6 I! V) G1 v+ W#include Menus.hpp//--------------------
0 E3 ^, [/ \" b
, D" o# D: ?; Eclass TForm1 : public TForm
2 N& v% ~9 z7 w7 S8 @3 ]{
' v1 I$ \. o' `( h& A3 V' v__published: // IDE-managed Components
+ c' u, y+ ~& ^8 p2 i; O9 UTMainMenu *MainMenu1;
0 i1 b* R& N& g( H7 ?0 |7 GTMenuItem *aaa1;
# x6 d( W, _) Z* O# rTMenuItem *aaaaaaaaa1;
1 }6 \& N5 h5 ]TMenuItem *ccc1; ; ?; m- a0 a4 u' m4 E
TMenuItem *ddd1; 8 L# H- z, @' x$ j
TMenuItem *eee1; - n3 d6 i; t) g9 q l
TMenuItem *ddsds1;
" Y( M- w q9 I' T. }TMenuItem *fcdfsss1; . u: s8 E+ I% U# w8 R
TMenuItem *dddddddd1; 3 ]2 Q! g& b# J9 Z9 ~
void __fastcall FormCreate(TObject *Sender);
% m2 Y$ r& c* F& I' R. a! wprivate: // User declarations
( V: L4 @7 Z% C- a; Svoid __fastcall Modify(TMenuItem *pMenuItem); * t- q. n& J0 u. h* \& a" }
protected :
5 ^" ^" T/ l4 L$ h9 u1 F& R% @MESSAGE void __fastcall CNMeasureItem(TWMMeasureItem Msg);//增加响应消息 4 p3 J6 w) G$ }* r
MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);
" a$ F8 M' |6 L8 ?) b2 fpublic: // User declarations
. `: `% ]* w+ C__fastcall TForm1(TComponent* Owner);
+ k* m, L& G, F6 v jBEGIN_MESSAGE_MAP//添加消息映射
* I! w+ a5 _1 F" ]8 yVCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);
6 q& p6 L/ Y8 }- ~% ^# }VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem); / P. L8 G `: A& d" H
END_MESSAGE_MAP(TForm);
, S# C$ i( C/ B5 d% N9 T};
# K% g' I9 N" P/ e' X//---------------------------------------------------------------------------
7 U( Y) z+ P8 d* ], w6 {extern PACKAGE TForm1 *Form1; 6 P/ d6 J" f, Q D
//--------------------------------------------------------------------------- ( r1 x% X4 V9 l9 @' l
#endif 1 @! ~! t* f% x# \& U$ s
! G& a2 l1 w) P& W
//实现文件 $ d5 ?+ S; A. \( T3 T* i) F, ]
//---------------------------------------------------------------------------
K! P( p7 [: o4 S4 Z. O, S. {; U#include vcl.h 9 D; ]$ {$ V4 }9 b, R' R1 m7 K2 q
#pragma hdrstop " f- Z/ z8 w* e7 I2 Q9 c) L
& Y2 L" \+ j: n' Y9 w#include TestMenu.h
" i1 m- d2 Z! p5 M/ t//--------------------------------------------------------------------------- : ?6 H0 a1 I8 p
#pragma package(smart_init)
1 K( A6 r2 F% k#pragma resource *.dfm 5 n9 e1 K; z; r6 x' e
TForm1 *Form1; " @& W6 z$ Q2 y) }' m, z& i
//---------------------------------------------------------------------------
* m: P$ j- l5 t5 E( |+ Q& }__fastcall TForm1::TForm1(TComponent* Owner) ! t1 h: @- C4 J) B. c
: TForm(Owner) . s% i1 o Y: L7 I3 F- |# G( ]% z! t
{ 6 `( L, u, E0 s% J, _; |1 o" U
} 6 Y! } O9 d* I- \4 ^2 h
//---------------------------------------------------------------------------
- K9 k% S3 H0 k9 K( n5 E2 i ; @0 k; a# S/ X
void __fastcall TForm1::Modify(TMenuItem *pMenuItem) . X# \# W' z. i, D: e
{//修改缺省属性
7 P& @' l9 d7 Afor(int i=0;ipMenuItem-Count;i++)
+ r) F$ m0 j1 }/ Y3 L' {{
: s2 l/ K, M6 s- JMENUITEMINFO mii=
( U3 Y7 n6 y- m% h{
( }# ~" H; ^5 O' ?. ^sizeof(MENUITEMINFO),
5 O7 g/ A" ? d: B2 lMIIM_TYPE|MIIM_DATA ,//改变类型和数据
" s& I$ v$ C2 H5 [+ lMF_OWNERDRAW,0,0,0,0,0,DWORD(pMenuItem-Items-Handle), + U* u+ f$ ~& c, _9 K/ s
//把菜单项的句柄赋给32位数据
+ w4 X! t2 W& C7 X+ R0, # z- M- C5 s7 W- ?4 s, I; i1 l
0, 4 m* F" k. \( P' E
};
k- A ~! f- Y% d7 Iif(pMenuItem-Items-Caption!=-)//如果不是间隔线
! N" t9 t$ ?# V9 Y/ ]::SetMenuItemInfo(pMenuItem-Handle,i,TRUE,mii);
- B$ ] y+ c3 e! wif(pMenuItem-Items-Count)//如果含有子菜单
- Q, Z, ?8 N2 w# UModify(pMenuItem-Items);
8 p2 H# n: r3 p1 |5 E. I: {+ G}
( O# l. O, z# P$ ?8 }6 B- r* J) ? ' A& E. Q7 {7 n2 `1 U
} $ x. D; L( K7 I6 Q6 D
void __fastcall TForm1::FormCreate(TObject *Sender)
. u8 G* w5 _8 ^( q/ [! A$ W& s{
4 R2 J2 D3 D# b9 \1 V" jfor(int i=0;iMainMenu1-Items-Count;i++) # ?- w: W9 U; t9 {# C
{
' C7 A+ @2 l! `8 V0 XModify(MainMenu1-Items-Items);
5 J8 ], c! z1 r0 y4 P} 0 y5 ~/ f3 z# r
DrawMenuBar(Handle);
& N! ^! `* u, O8 j7 J4 Q4 B} ' j T$ G- ^% q
//---------------------------------------------------------------------------
' x- D1 M7 z1 nvoid __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)
9 m/ {) B$ S8 v* @$ W9 x( d! Y{//设置菜单大小
8 |3 y; _; \3 y# i, ATMenuItem *pItem=MainMenu1-FindItem(Msg.MeasureItemStruct-itemData,fkHandle);
: H5 C, Y8 k' N$ A1 cMsg.MeasureItemStruct-itemWidth =pItem-Caption.Length()*8+40; 4 }2 s0 M/ `9 H# b2 Z% J
Msg.MeasureItemStruct-itemHeight = 20;
5 E6 e3 O* W6 n4 [}
/ w; S# `/ X2 A* X( Uvoid __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)
7 }5 `* p" W( d0 }" n{//画出菜单
8 y/ c( m) X r7 {. X% C2 S5 P% FTMenuItem *pItem=MainMenu1-FindItem(Msg.DrawItemStruct-itemData,fkHandle);
6 a. K! h/ ^0 c5 y ~1 Q* k7 |$ `TCanvas *pCanvas=new TCanvas;
/ C( K) w4 V8 EpCanvas-Handle=Msg.DrawItemStruct-hDC; 3 b/ _$ b7 e. L) G& x# }
RECT r=Msg.DrawItemStruct-rcItem;
$ }$ H. }4 W" g1 q2 }7 hpCanvas-Brush-Color=clBtnFace;
! F; \' a8 j, y/ I9 q) dRECT r1=r;
2 i3 h: P; U1 U+ Y! d" e& Q! Ur1.right+=1;
8 c) r2 f' v; m: f, R* H+ Mr1.bottom+=1;
v" h' r6 z" u' X* vr1.top-=1; 5 [. m% c. n; A' Y1 K
r1.left-=1;
% j8 I s& _. S4 S; q9 OpCanvas-FillRect(r);
. T9 `* e9 t) Z, ]) z) `$ \::SetBkMode(pCanvas-Handle,TRANSPARENT); # J' m+ ]- d% ?. W* Z& F/ S
pCanvas-TextOut(r.left+10,r.top+2,pItem-Caption);
2 f1 Y6 T7 L1 @6 ?5 J/ ar.right-=1; $ d4 S$ g, E; B5 A; f- ~
r.bottom-=1; 7 m& r9 W6 e/ |' d$ I
if(Msg.DrawItemStruct-itemAction == ODA_SELECT
7 W4 J2 J' l7 q3 L: B" sMsg.DrawItemStruct-itemStateODS_SELECTED )
w; K' `6 w7 ?: P( _" c{
# f. m, z& R3 G4 npCanvas-Pen-Color=(TColor)(RGB(255,255,255));
$ H+ R* o! W( T, ~- `" spCanvas-MoveTo(r.right,r.top);
& {5 _: [4 I3 B# }/ kpCanvas-LineTo(r.left,r.top); 3 p; Z3 i. L: Y* [
pCanvas-LineTo(r.left,r.bottom);
) Q: M0 `% u: XpCanvas-Pen-Color=(TColor)(RGB(128,128,128)); . D" X. y8 O* B* }
pCanvas-LineTo(r.right,r.bottom); 9 s0 Q8 @# w4 o9 t
pCanvas-LineTo(r.right,r.top);
! D/ V2 }' V9 ~9 f}
+ ~+ X3 z0 d* e8 g0 R0 A
|, A8 t6 I% D9 N! ?} |