|
我们知道,C++Builder没有自画菜单,但可以调用API函数::SetMenuItemInfo()来改
6 a, g) @. o1 \: ^* h: F+ p* Z变菜单类型,达到自画菜单的目的。下面的例子演示了如何使用自画菜单。当鼠标位于菜单 # |% g% n/ j( l9 N
上拾,菜单项将凸出来。(黑体字为添加的代码) - @6 V+ c! }. n
" M g1 u! J q' Y! x//头文件
2 N+ S/ Y% @$ T//------------------------------------------ " P0 B% ?, ?8 M5 k
#ifndef TestMenuH
' W6 B7 u! T s$ _! R; j, r; E#define TestMenuH
7 ^+ C7 u) h {8 T3 q O( ~2 }% J* p8 |//----------------------------------------- : B( Q) K. i/ N6 t; r
#include Classes.hpp
L: s- j" C8 K7 M# u# ?. q#include Controls.hpp 7 P2 F3 l! b7 ^$ v$ P0 ^; e
#include StdCtrls.hpp
8 x( G) \# v N T* {* |#include Forms.hpp
# B6 u: i2 P1 l#include Menus.hpp//-------------------- 9 H% v+ Z! _, L0 h( G6 B
7 p+ d, K. U3 F! x9 ^0 B
class TForm1 : public TForm 9 f( _& }! ~; v, M, ^
{
. m( I6 l; Q$ Z__published: // IDE-managed Components ( ^" P7 q2 X: S; F1 x8 C+ {. @
TMainMenu *MainMenu1; / I8 C+ @- c3 J/ P% z
TMenuItem *aaa1;
h) J! a4 U* o0 f( L: w# MTMenuItem *aaaaaaaaa1;
' O& r$ d4 ]& T4 _. ~$ U1 gTMenuItem *ccc1; ( A/ Z! H3 I0 g0 g& a
TMenuItem *ddd1; 2 ^! e7 K2 E9 `9 d
TMenuItem *eee1; 3 z' b3 j/ I& T) c
TMenuItem *ddsds1; - [/ [& B. J# u7 l
TMenuItem *fcdfsss1; 1 z$ f9 z# Z9 w# b8 D
TMenuItem *dddddddd1; ( C+ D3 g# U) K* W' W' V6 t+ P7 b
void __fastcall FormCreate(TObject *Sender);
/ T6 V! _4 S2 \private: // User declarations
" r9 X k+ I, @( |# O3 ]8 J3 mvoid __fastcall Modify(TMenuItem *pMenuItem); 3 r5 {/ S- Q# m& h$ }8 U9 h, \8 \# ^
protected : , q: g' T2 M9 n
MESSAGE void __fastcall CNMeasureItem(TWMMeasureItem Msg);//增加响应消息
/ O; L# ] a5 {$ N& ?+ dMESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg); % A* ~1 [9 f3 _ p4 X: J; j( i9 F
public: // User declarations
% S/ k$ U4 Q6 @& y; p* K0 ___fastcall TForm1(TComponent* Owner);
- B! T u) {" D) T( v: S3 {BEGIN_MESSAGE_MAP//添加消息映射
p1 q2 O6 W; p; \VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);
& |6 q! M- P" ]) }( ~3 aVCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);
' F& O% f1 R5 PEND_MESSAGE_MAP(TForm); , N2 L% u) }3 ~0 ?$ {
};
+ T" M5 r, n8 G. Y0 U( p9 K: ]7 Q; S) H//---------------------------------------------------------------------------
" Q o- J1 ~! ~8 aextern PACKAGE TForm1 *Form1; # Q# C0 U8 }# U2 R
//--------------------------------------------------------------------------- $ H+ c# n4 s9 `4 m' J* \/ D" }* G7 u
#endif ! `- f! V; B6 b) J1 N" j) R2 I
( P" I l4 @7 l! U5 S7 I//实现文件 ' x) i- q, } L
//--------------------------------------------------------------------------- 2 T1 K! @+ D) O9 ~# Q* ^; Y2 P
#include vcl.h 2 q9 ?* V" u& } t2 |9 k7 s
#pragma hdrstop
5 ]& T5 e* C2 Q3 w0 E9 {2 | 4 a$ U P2 d" i. b4 k- s" G
#include TestMenu.h ) p/ Q( v7 @1 Z- w( O4 b
//---------------------------------------------------------------------------
- Y$ h% h2 M; U#pragma package(smart_init)
7 m' C! F3 z' p0 H# R7 x#pragma resource *.dfm " v' e, _3 \+ k! Q$ p
TForm1 *Form1;
# S ]- K5 |2 e//---------------------------------------------------------------------------
5 _0 ] i! G6 \" J; ?/ z__fastcall TForm1::TForm1(TComponent* Owner) & }. R+ R) x6 _4 C6 C
: TForm(Owner)
9 h! O' w' Y! N% F' P{ : a) B. A2 m" @6 \
} 4 N7 K2 |0 Z; Y4 {3 h
//---------------------------------------------------------------------------
( Y' J# R0 T. x; z5 Q! Q 2 z9 C+ M2 M+ x
void __fastcall TForm1::Modify(TMenuItem *pMenuItem)
* m9 n' D( O- E" J# }{//修改缺省属性 , Z1 r1 G `) x; T
for(int i=0;ipMenuItem-Count;i++) ' D* h& y: P; `7 @) R3 W, C
{ 4 ~7 N9 A2 T1 Z& z& m7 o9 F
MENUITEMINFO mii=
s; `, {& d+ k* K; Y{
# |/ T3 d( \, f1 F& j" j# W8 nsizeof(MENUITEMINFO),
! W6 z/ J" ]. U; K6 b" DMIIM_TYPE|MIIM_DATA ,//改变类型和数据
6 N9 q' M1 m( O F" b! gMF_OWNERDRAW,0,0,0,0,0,DWORD(pMenuItem-Items-Handle), 9 K# p! N# ], [5 f$ n4 X- z
//把菜单项的句柄赋给32位数据 9 ?/ B2 x* E. v# P* ]' p" X) J$ w
0,
1 d |; U+ Y! I) S5 F0,
$ `$ Y" M# Q Q: ] i3 a};
* N$ b! m1 C) }- M1 g+ {: vif(pMenuItem-Items-Caption!=-)//如果不是间隔线
3 c( d3 Y' f; W5 c::SetMenuItemInfo(pMenuItem-Handle,i,TRUE,mii);
3 k- ]$ c# H8 }9 Mif(pMenuItem-Items-Count)//如果含有子菜单
) u' n/ l) g- C) m4 P! BModify(pMenuItem-Items); 6 ]8 k) `0 |" G3 f# {: P
}
8 \6 R6 |! q+ z6 z
) ~, w7 ^! R" V( D2 ]} % B1 c3 `& ~) H; l: N
void __fastcall TForm1::FormCreate(TObject *Sender) . b* s9 Q/ h6 Q( t5 E7 t4 F |' a* A
{ ; L% V; p; L; j* ^
for(int i=0;iMainMenu1-Items-Count;i++)
9 c6 i- ?0 d0 n R{ 8 G& k. e# X. H
Modify(MainMenu1-Items-Items);
& S( E, n, S- h4 m: ^+ X} 3 ~. }- j5 g8 q* U$ p" t; }
DrawMenuBar(Handle);
1 R9 F# v, f" X& t2 H}
7 K/ Z0 I% U9 |/ P) V/ U1 R- j//--------------------------------------------------------------------------- 2 [4 m7 @7 |5 D" }
void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)
1 w: @7 ]/ r* G$ X{//设置菜单大小
: M; F. G# x' p9 l6 ~ T8 J1 wTMenuItem *pItem=MainMenu1-FindItem(Msg.MeasureItemStruct-itemData,fkHandle);
+ V! _4 R7 g CMsg.MeasureItemStruct-itemWidth =pItem-Caption.Length()*8+40; ! q' z" H7 l0 T0 X: x# O5 G
Msg.MeasureItemStruct-itemHeight = 20; " |) l& ^9 t4 {
} & z( p# P ?* ?4 m7 W
void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)
% |3 h3 M) r0 K; O5 b9 I{//画出菜单
, N& K+ \1 Y: i; u rTMenuItem *pItem=MainMenu1-FindItem(Msg.DrawItemStruct-itemData,fkHandle);
6 R, g, d! i1 q" t X# MTCanvas *pCanvas=new TCanvas;
" m6 c* B3 K& L3 l0 ZpCanvas-Handle=Msg.DrawItemStruct-hDC; f4 {4 n( u3 U; b" L* w8 a% g6 V1 X; z
RECT r=Msg.DrawItemStruct-rcItem; 1 P- W: j5 c) c. e. q
pCanvas-Brush-Color=clBtnFace;
, w: B$ V t2 p. NRECT r1=r; ' {& Y" J% `- F
r1.right+=1; # H2 }" z0 b% l
r1.bottom+=1; $ s6 [& \- M) |
r1.top-=1; % x" W: L& J1 f9 ~ Q
r1.left-=1; 8 w5 E) D8 u; T7 |
pCanvas-FillRect(r);
- }; B8 b; s' j; x5 i. ^% o::SetBkMode(pCanvas-Handle,TRANSPARENT); 0 ] m0 I( K( v$ x y6 p
pCanvas-TextOut(r.left+10,r.top+2,pItem-Caption); . Y/ X% N9 G$ G9 Y3 i
r.right-=1; : T* g7 c L% q, x4 b8 Z6 }; [
r.bottom-=1;
$ o# K+ V# p( g0 ^5 O; qif(Msg.DrawItemStruct-itemAction == ODA_SELECT ! N9 d8 D! W6 e! v: Q
Msg.DrawItemStruct-itemStateODS_SELECTED )
* _ K& M# a8 l4 M{ 6 S6 N/ Q2 s& z, }
pCanvas-Pen-Color=(TColor)(RGB(255,255,255));
5 S8 R( C) ^& d, V+ o K. ^pCanvas-MoveTo(r.right,r.top);
0 z; Q f( r5 X2 t4 i4 QpCanvas-LineTo(r.left,r.top); 7 t2 l# X) m6 u- M
pCanvas-LineTo(r.left,r.bottom); # E- Q# x, B, v' k
pCanvas-Pen-Color=(TColor)(RGB(128,128,128));
, q. j+ f7 u9 n: n+ n9 ZpCanvas-LineTo(r.right,r.bottom); 1 }" P4 d# i7 Q) R$ G
pCanvas-LineTo(r.right,r.top); 4 P f% W: N: p% ?
}
: }1 M" D/ T# h* F" V' m/ n% |- E% F7 @2 Q
} |