|
我们知道,C++Builder没有自画菜单,但可以调用API函数::SetMenuItemInfo()来改
6 d3 n5 U4 v5 s. D3 e& e变菜单类型,达到自画菜单的目的。下面的例子演示了如何使用自画菜单。当鼠标位于菜单 7 p& l: A4 {$ V: ?% C
上拾,菜单项将凸出来。(黑体字为添加的代码) : c5 o. m j+ `7 m. j, M# D0 }
* D" R2 }) v c# d$ \" ~% j//头文件
8 U8 z5 | C& ~//------------------------------------------ / R' F5 ]6 V, P' F
#ifndef TestMenuH
% f' o" d. J8 N#define TestMenuH
. D0 Y$ Q2 ^( @) w, \. o1 B//----------------------------------------- , B! L) q4 H5 l, S( ]4 y
#include Classes.hpp
. r: j+ L& f/ c, _7 M0 V#include Controls.hpp * k- @# D! P9 j [' m6 g
#include StdCtrls.hpp . k6 L7 ^& G) M/ p/ N, z
#include Forms.hpp
( p) Q( p) L4 s& m" v6 [) `3 `#include Menus.hpp//-------------------- 9 q( S# }# _( m' U$ t
) n8 b, l$ z" h2 C5 u. w9 T' }
class TForm1 : public TForm & ]6 F7 {+ c/ R3 q3 c# ^; u$ m
{ 5 Z( k2 ]( A& {/ q2 e1 s
__published: // IDE-managed Components . O$ q9 z4 ^8 g
TMainMenu *MainMenu1;
" {# R6 h d, PTMenuItem *aaa1; ! f1 r5 g* c' F$ H8 r5 S
TMenuItem *aaaaaaaaa1; , L; c4 l3 y+ f @3 x
TMenuItem *ccc1; # ~1 D ]. ]/ @/ N0 a9 G5 a" C) c# D
TMenuItem *ddd1;
9 a! w0 h+ e; q/ GTMenuItem *eee1;
+ b4 [ J9 o, y. NTMenuItem *ddsds1; C v: A: ?' b b
TMenuItem *fcdfsss1; . ^/ A1 E, k: _5 [7 D8 W
TMenuItem *dddddddd1;
4 F$ d$ J0 G8 K0 T! D4 c8 @void __fastcall FormCreate(TObject *Sender); / Y5 w$ L" t6 q/ F, j1 d
private: // User declarations + `2 V: p B% i
void __fastcall Modify(TMenuItem *pMenuItem);
5 W( {! H( x: h: ]- t5 m' y1 ~protected : m4 f& I$ `! z) ~3 C% y$ X
MESSAGE void __fastcall CNMeasureItem(TWMMeasureItem Msg);//增加响应消息 4 v; h" P! B3 g3 [2 E/ ?
MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg); - r# d. R( c) p- I$ H' V
public: // User declarations " |1 c, b8 A0 S/ T
__fastcall TForm1(TComponent* Owner); 4 l* n2 @; f. ?: C5 [
BEGIN_MESSAGE_MAP//添加消息映射
9 m l) W% f0 mVCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);
. @! z5 ?/ {3 U- BVCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);
, b4 G7 t h$ t, |6 `END_MESSAGE_MAP(TForm);
- \+ i7 E& O) k};
* G' O. e$ S" l! r4 L//---------------------------------------------------------------------------
$ \; O h z. x" w) kextern PACKAGE TForm1 *Form1; 9 B, J! n6 e$ d. q) X! w7 m( H# z* e
//---------------------------------------------------------------------------
- s1 a% W! s$ u* e+ N# V5 s3 _#endif
$ Z8 K3 z# A. [3 t
" }% R( t/ I/ V2 l8 ]. u c//实现文件
+ E3 g4 P' m& a4 U( l( g8 {9 p//--------------------------------------------------------------------------- 3 ~: B# H. O/ J# F) G! V
#include vcl.h 3 |1 h( i: a, d
#pragma hdrstop 8 b# O6 {6 f: E5 g
1 X8 f7 o4 D: p9 t
#include TestMenu.h
5 M5 @6 p) d/ U- y" j t2 N7 F//--------------------------------------------------------------------------- 9 z6 {1 w1 e5 G! X+ z, L. w: K
#pragma package(smart_init)
) q! F5 Y5 [% V' ^- v; R& |#pragma resource *.dfm
) V- b) u/ K. _$ g2 D; yTForm1 *Form1;
1 N+ ]/ k4 \6 q9 t9 ?1 T//--------------------------------------------------------------------------- 0 W( ?6 B% i/ i" l, J3 D) F6 }
__fastcall TForm1::TForm1(TComponent* Owner)
' i9 [ i2 A: P% ^1 O: TForm(Owner) 1 R3 L& H! b- m% i9 W6 @' h* \
{ - R2 U* ~: G( e# e- h5 B& R4 A
} 9 n/ X/ Y* ?, {" a/ f
//--------------------------------------------------------------------------- 5 H# w& x/ ]9 a) O7 @
8 A1 u, ^. V& b- D
void __fastcall TForm1::Modify(TMenuItem *pMenuItem) . D1 o1 L' }6 b. o% u7 t
{//修改缺省属性
2 e+ b7 U1 K* g' v$ t, ~ Ufor(int i=0;ipMenuItem-Count;i++)
$ }1 ` L) ?7 ]% I{
: K4 T6 y1 g. k( V) Y4 ?. EMENUITEMINFO mii= 7 R$ m N; K" o# Q. p6 g, X! N- H
{
; e4 y7 K" d. ?% {& O4 D3 rsizeof(MENUITEMINFO), 4 P3 D0 W, ~% s3 \3 o
MIIM_TYPE|MIIM_DATA ,//改变类型和数据 , W1 B: F/ y' C8 B2 J$ u
MF_OWNERDRAW,0,0,0,0,0,DWORD(pMenuItem-Items-Handle), * L2 z" }1 I4 y2 ~3 O9 k: a( n3 a
//把菜单项的句柄赋给32位数据 ; r, A, F/ q. F( Z8 }
0, - j: o( }% c3 G2 n ^# V* y" k
0,
% Q0 W/ ~6 y0 U7 s: u4 D$ N: B0 L( Q}; ; _- T4 L: q. i
if(pMenuItem-Items-Caption!=-)//如果不是间隔线 ' [5 T2 n* E6 ?4 X' i
::SetMenuItemInfo(pMenuItem-Handle,i,TRUE,mii); / a4 b3 w: P2 [* |
if(pMenuItem-Items-Count)//如果含有子菜单
9 G4 m7 j- M9 z% f8 v* K0 x& EModify(pMenuItem-Items); * W9 q) H/ N7 k7 M. g
}
. \/ j$ ~/ ^7 i8 O4 \% N% r ( N `! ^! b1 W; m) Y6 P: V
} 5 S- D5 f: h( W- l- J; z
void __fastcall TForm1::FormCreate(TObject *Sender)
+ {; S5 Z% k) {; t' a{ ) K4 J# x( V* }5 Y( d- Y
for(int i=0;iMainMenu1-Items-Count;i++)
; P6 h; G2 Y9 d- \0 B3 u# d" \{
# U5 H/ S( K: i g- O( u( d" z' g1 kModify(MainMenu1-Items-Items);
6 E2 j- o3 k; D- Q: N. E- H} % H! Y3 X2 U/ P1 _# {' {% x
DrawMenuBar(Handle);
9 r2 O2 x, x9 W+ J7 t4 _5 r/ J" j} ) F6 U' Y6 T) c9 E% V, ^
//---------------------------------------------------------------------------
2 h0 ?) s, S) h6 [) Ovoid __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg) # _, n# V3 }& z5 o
{//设置菜单大小 & O" V) f4 [) s/ d! w/ D: y# E
TMenuItem *pItem=MainMenu1-FindItem(Msg.MeasureItemStruct-itemData,fkHandle);
3 Z( U7 [+ l1 m; d# k$ qMsg.MeasureItemStruct-itemWidth =pItem-Caption.Length()*8+40; 5 x8 W, `( `1 f, W
Msg.MeasureItemStruct-itemHeight = 20;
6 E) ~$ i% D8 z8 y}
2 F" a; K6 q$ Q4 Kvoid __fastcall TForm1::CNDrawItem(TWMDrawItem Msg) 2 R, a6 \& d! @' z" _$ j# v, d, X
{//画出菜单 3 [5 p8 K' h& w0 e! P4 W8 |7 u: N
TMenuItem *pItem=MainMenu1-FindItem(Msg.DrawItemStruct-itemData,fkHandle);
# O% |$ ` Q* V- m5 f4 c+ VTCanvas *pCanvas=new TCanvas;
( `, [/ }) r; L2 t% s; |pCanvas-Handle=Msg.DrawItemStruct-hDC; & {8 C' r) h) F5 g
RECT r=Msg.DrawItemStruct-rcItem;
" ^8 h% G7 B, k( T5 bpCanvas-Brush-Color=clBtnFace; 9 t, j1 Y$ D9 m* L
RECT r1=r;
' V D8 K' r. tr1.right+=1; 1 f% W5 B7 A* s, Q" E1 B
r1.bottom+=1; 9 X+ `' L0 |0 ?) |1 }
r1.top-=1; - }% X0 [. F v+ e R8 S6 X
r1.left-=1; 8 U3 X5 b& F& }- S2 R; }# v% Q* I6 F
pCanvas-FillRect(r);
; A% w( Y( r2 b9 n, L8 c& v::SetBkMode(pCanvas-Handle,TRANSPARENT); 8 i5 K6 {. X2 \1 m
pCanvas-TextOut(r.left+10,r.top+2,pItem-Caption); 6 f; {) O! t# O d+ C2 Q' s
r.right-=1; 8 g+ F8 M% l6 W) h; h3 ~& P2 F9 H
r.bottom-=1; ) U9 j% f5 A" E: w# G! n% l
if(Msg.DrawItemStruct-itemAction == ODA_SELECT
8 ?4 J) |% O/ x2 r3 XMsg.DrawItemStruct-itemStateODS_SELECTED ) 5 Z& }; {; C; ^+ W. F: m
{ 0 d. G: ~, _8 P6 {0 t. N$ a) _
pCanvas-Pen-Color=(TColor)(RGB(255,255,255));
, h4 P7 W1 u! d5 xpCanvas-MoveTo(r.right,r.top); 7 \. ^; q" w7 y& `. g; M! E, Q
pCanvas-LineTo(r.left,r.top); 3 V- m( n& ^/ j1 I5 t
pCanvas-LineTo(r.left,r.bottom);
. c9 U7 M U/ ]5 A! M' R) S4 FpCanvas-Pen-Color=(TColor)(RGB(128,128,128)); ! a5 V" Y6 H6 r, T0 n) v. M' x
pCanvas-LineTo(r.right,r.bottom); " [5 b$ @' ]/ Q
pCanvas-LineTo(r.right,r.top);
4 s/ f) t2 m9 }; z$ Z}
# h8 w$ E# p" C P
$ P8 j3 V2 P$ k. x/ N' E9 p; W} |