|
我们知道,C++Builder没有自画菜单,但可以调用API函数::SetMenuItemInfo()来改
3 W% j$ O$ o0 g$ H6 A$ Y f变菜单类型,达到自画菜单的目的。下面的例子演示了如何使用自画菜单。当鼠标位于菜单
; M/ V/ E( f7 g. s上拾,菜单项将凸出来。(黑体字为添加的代码)
3 |! Q' Z! a( D* l+ Q/ ], f. { - w5 T1 f- r8 ~- k, U8 J- d
//头文件 & H% a, s n: j2 \- e2 p) F
//------------------------------------------
1 _# \5 `; Z0 [0 q# z% _( T3 N#ifndef TestMenuH
1 P/ l5 u6 K, `1 X/ k#define TestMenuH
# m4 b7 G2 F% W$ ?2 ^ s) r; H//----------------------------------------- ' F; {" }" K. J3 E! \( H0 w, H
#include Classes.hpp
/ x0 B% f2 x% w4 m# e$ g2 w#include Controls.hpp + M) P7 Z$ u3 H5 }, l7 N
#include StdCtrls.hpp
' d! V) B5 z4 E#include Forms.hpp
/ y$ i4 e7 ]* b3 n#include Menus.hpp//--------------------
- |1 q: G: D _ A# E9 ]% G: r: T2 P( ^+ G4 e5 `
class TForm1 : public TForm 3 f. |* Y# u- A" q
{
; Y6 A: ^4 Q* E1 M3 p9 S5 V7 s__published: // IDE-managed Components
% H, g( Q6 |& m4 G9 ITMainMenu *MainMenu1; ( E# _5 @8 M, R$ |6 t+ p0 i' D# R! {
TMenuItem *aaa1; , {' d6 d8 ^8 ~/ f/ m5 K
TMenuItem *aaaaaaaaa1; + n J' j, l# e
TMenuItem *ccc1;
. x& {( o& I% z: D% qTMenuItem *ddd1; z6 ^, E6 `; w4 P8 s1 G
TMenuItem *eee1;
4 D4 H1 i; y$ }+ ?* ]6 u; MTMenuItem *ddsds1;
1 J( ~1 ?- b( ]# a CTMenuItem *fcdfsss1;
) X( Q( k) L' y" r" D7 L3 l4 YTMenuItem *dddddddd1;
" I7 z- v& W2 p- I |void __fastcall FormCreate(TObject *Sender); # s5 N8 O' O) l7 o0 D
private: // User declarations 1 M2 g4 T. n. d6 R8 e
void __fastcall Modify(TMenuItem *pMenuItem);
2 h7 s0 \9 Z& }/ Y$ Fprotected :
* e( T& R6 q2 c; O* t1 X( m# ~MESSAGE void __fastcall CNMeasureItem(TWMMeasureItem Msg);//增加响应消息 M- [% k. I9 V+ _3 H# F
MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);
/ d3 Z: f, T1 B/ ^public: // User declarations " d$ f, q4 y* |% g; W1 X
__fastcall TForm1(TComponent* Owner);
6 X- b% y, c2 [% f" L) TBEGIN_MESSAGE_MAP//添加消息映射
1 s2 _0 e3 w: K% `4 ^- d8 P! E! hVCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);
% K& R1 n# j' Z' hVCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);
1 o( C- ~# O" i4 G. ~5 ^" xEND_MESSAGE_MAP(TForm); # \8 E3 [4 P9 v% j
};
' r" V' h" r( N; g l1 J//--------------------------------------------------------------------------- 2 L& V8 t+ c" J. H
extern PACKAGE TForm1 *Form1;
! H* {" B1 f" c" K3 n//---------------------------------------------------------------------------
0 M, C. N6 @9 o, x- I1 z#endif ( |0 P( U% j5 C
0 V6 M; u# S6 Y e//实现文件 ! |5 P# C, I, y' c. [
//---------------------------------------------------------------------------
% P" z/ a( N# [6 ~7 y6 D+ d% T4 Y9 f#include vcl.h ! G7 u: b' c, q5 O/ K" ^6 M
#pragma hdrstop
) Q* H3 Q/ g* _) a# c9 R ) H. F ?9 `% \& \% e% @
#include TestMenu.h
- H% i# P: N# \//--------------------------------------------------------------------------- , }7 s7 O+ V5 h! D$ G* Y
#pragma package(smart_init)
* S6 l% j7 n1 w#pragma resource *.dfm a8 e3 ~7 r% ]% @- |! d4 V
TForm1 *Form1; " J; J4 ?( L( s/ i- I, |* Q* G
//--------------------------------------------------------------------------- 7 M; n: N& v' f, w, k
__fastcall TForm1::TForm1(TComponent* Owner) ' x4 X, P' p0 ]/ p6 Y& c e
: TForm(Owner)
3 M! L* a6 M/ |! Q3 {" f- J& N{ # l# N% I4 j- W6 G( z
} 9 J G1 J6 }" a6 G8 Q7 G
//---------------------------------------------------------------------------
3 d6 B- H; @: J2 l# m8 v3 ^ s; g2 k* }% V3 _8 r8 @
void __fastcall TForm1::Modify(TMenuItem *pMenuItem) y& Z* W& u9 G
{//修改缺省属性
- [0 g) o# w5 b, p9 s7 r) M# ~$ w# Efor(int i=0;ipMenuItem-Count;i++) : a D* b" _, d7 v8 U
{ 2 r; t9 o8 @ d& n% N3 n
MENUITEMINFO mii=
0 J+ X5 G( N. j0 h- I{
5 a# E& ^/ L6 j9 h2 M% Y/ ?3 \sizeof(MENUITEMINFO),
8 }0 N7 w9 s* `3 Z6 [1 m3 pMIIM_TYPE|MIIM_DATA ,//改变类型和数据
( G7 k. k! `0 u7 Z. `' b4 X" r& ?1 IMF_OWNERDRAW,0,0,0,0,0,DWORD(pMenuItem-Items-Handle),
6 e& Y- F! t$ |//把菜单项的句柄赋给32位数据 . M7 D3 l# W6 }2 Y3 C, h2 P
0, - ~7 r- g& I* `, a4 g& p1 o
0,
: W% g) A! V5 U( C}; % Z! z. o& z0 g3 t J l- g
if(pMenuItem-Items-Caption!=-)//如果不是间隔线 ) r7 r( g1 i( c0 O+ Z: @
::SetMenuItemInfo(pMenuItem-Handle,i,TRUE,mii);
8 P: x/ \$ Y( F0 R! uif(pMenuItem-Items-Count)//如果含有子菜单
. _/ w( I$ }/ m( a% `" _6 dModify(pMenuItem-Items); 7 S' K; T' F* C) _
} ( `7 A0 @) F) {
" c# I+ @8 c! |/ I' s& @7 x
} % `0 H& p% Q) M7 ?8 d
void __fastcall TForm1::FormCreate(TObject *Sender)
5 r; s7 r& {2 c; F5 ^{
% \9 j/ k$ ^& P9 m$ Lfor(int i=0;iMainMenu1-Items-Count;i++)
; D- n$ m$ v5 B4 x+ N{
/ e: [+ Y1 M8 q: P" N: g/ }( jModify(MainMenu1-Items-Items); ; [! m2 Z% V( y! ?9 J% e- S! E
}
; V! B2 u& P$ ?DrawMenuBar(Handle);
' }: X: i: x# K# ~! C o) q} ' H2 ^+ C9 P9 G) }' |) [! W
//---------------------------------------------------------------------------
+ a. L. r0 W- m" U5 K2 ^" A8 c3 \void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg) 7 K0 K% A) o: D5 Y; m2 J
{//设置菜单大小
7 }9 i( f+ u/ K! jTMenuItem *pItem=MainMenu1-FindItem(Msg.MeasureItemStruct-itemData,fkHandle);
0 |+ w' T' G) G2 W3 C7 KMsg.MeasureItemStruct-itemWidth =pItem-Caption.Length()*8+40;
6 H) f( p$ R* B6 O3 w5 AMsg.MeasureItemStruct-itemHeight = 20; ) r- q, s# |5 [" H L8 u
} ' Z. ~" c8 S3 D% L- G' H
void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)
5 H2 R$ V. X1 E{//画出菜单 # K U; ^( G/ D# D7 y
TMenuItem *pItem=MainMenu1-FindItem(Msg.DrawItemStruct-itemData,fkHandle);
9 }! `, M8 V2 r) Q6 WTCanvas *pCanvas=new TCanvas;
0 O9 ^" H" P* F! SpCanvas-Handle=Msg.DrawItemStruct-hDC; 8 @. u3 _4 B* B
RECT r=Msg.DrawItemStruct-rcItem; ' V4 {* |$ W9 c$ {9 z$ `, |
pCanvas-Brush-Color=clBtnFace;
; f, H: t9 Y0 H) v" n, |5 S u: VRECT r1=r; : }6 q m( ]! i! g) D
r1.right+=1;
~; i$ w. ]; {+ i+ Or1.bottom+=1; 4 R" ~: g, E9 W3 |, G* C: Y
r1.top-=1;
# V2 h3 T) b& `r1.left-=1;
, b+ B: p. c: NpCanvas-FillRect(r); 2 h7 R, H+ t9 \6 z) E( K. o. `8 D+ k
::SetBkMode(pCanvas-Handle,TRANSPARENT);
7 ~; p& x# S2 V" r4 tpCanvas-TextOut(r.left+10,r.top+2,pItem-Caption); 3 P! ?. A' p2 V1 h; {8 y
r.right-=1;
. I" A5 Q( B1 U6 O$ or.bottom-=1; 6 ?2 U& R8 y+ Q1 i' I7 ` L# `
if(Msg.DrawItemStruct-itemAction == ODA_SELECT
& g0 r$ U' g1 P0 k0 YMsg.DrawItemStruct-itemStateODS_SELECTED )
- z- Q% Z0 _, [/ W' k{
% {7 a4 G* A" \+ WpCanvas-Pen-Color=(TColor)(RGB(255,255,255)); v! |; Y4 r8 \$ q9 y& z
pCanvas-MoveTo(r.right,r.top); $ @0 Y, l/ x% H9 Z
pCanvas-LineTo(r.left,r.top); 0 ?: V! K/ y' Y# A2 Y0 j
pCanvas-LineTo(r.left,r.bottom);
0 @6 [, m1 m, P3 _6 XpCanvas-Pen-Color=(TColor)(RGB(128,128,128));
$ I6 ]4 v3 J( u/ W1 }7 \( EpCanvas-LineTo(r.right,r.bottom); 1 [; o! H* A g6 b- r( z5 t8 u% i
pCanvas-LineTo(r.right,r.top);
1 d, l1 t0 B! U} 2 t% R' f; b+ r/ E y
8 w5 V# @- ~( `: F0 s7 x} |