|
我们知道,C++Builder没有自画菜单,但可以调用API函数::SetMenuItemInfo()来改
" W" N4 B# E; E0 ^变菜单类型,达到自画菜单的目的。下面的例子演示了如何使用自画菜单。当鼠标位于菜单
2 x ]2 K1 r9 F1 A& R, t' x1 X9 \( ^+ \上拾,菜单项将凸出来。(黑体字为添加的代码) / h. N$ |* P# \- _- p( S
4 e! J+ t( }/ I$ s' o. [: H1 p
//头文件
" F% s) H! v7 y+ M//------------------------------------------ 0 G) W9 D# x# W/ A, [8 y. A, f
#ifndef TestMenuH & T- s1 U w ]6 p* Q
#define TestMenuH & K$ J& }3 l$ L4 C. l/ V
//----------------------------------------- 3 a- q, k: Z% B! A/ R# P
#include Classes.hpp ^6 {# j5 x/ Y
#include Controls.hpp
1 K, E+ I4 f( U, S2 _! X/ e! L#include StdCtrls.hpp " G9 \( k I% I' ^; ?
#include Forms.hpp
$ s& I( p1 C1 Z: S1 ]#include Menus.hpp//-------------------- ; P( ^" [& G# z- a: J# a
& J# y# V5 {8 f: |4 kclass TForm1 : public TForm
5 _3 Y! S7 R: l+ `% W! E$ [{ 7 Z* Y7 O6 X- t8 K! x
__published: // IDE-managed Components
7 @" G7 n" E) c$ I# L& C, qTMainMenu *MainMenu1;
0 S4 ]5 X& A2 g# x- x; S6 ^$ o1 J1 a6 F% ITMenuItem *aaa1; ( B/ | M/ {, f( k; k1 b
TMenuItem *aaaaaaaaa1;
2 g6 y( Q, n/ JTMenuItem *ccc1; ; s5 i2 c/ F; k8 @. ], w# B
TMenuItem *ddd1;
9 p; M) f `' Y: V& U6 V! y/ G7 pTMenuItem *eee1; 0 v% r! ]' s6 h
TMenuItem *ddsds1;
/ t. _ Z) `& eTMenuItem *fcdfsss1;
! O: j9 D2 F4 w( f( H2 Z H9 I% mTMenuItem *dddddddd1;
, C- c- m9 E! X. b( |" x8 ovoid __fastcall FormCreate(TObject *Sender); 8 U( [ |+ u! z( L L1 f, t" C
private: // User declarations ; S. n9 m8 e2 k$ Y
void __fastcall Modify(TMenuItem *pMenuItem);
+ W- D1 n- L% \- gprotected :
5 L( Y- V9 W( |8 qMESSAGE void __fastcall CNMeasureItem(TWMMeasureItem Msg);//增加响应消息 2 C+ s" e, ?, U, g
MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);
1 \9 S; O, X9 f3 O; k0 v# tpublic: // User declarations # V$ Z1 C0 o* Y$ M) U0 B" f# D
__fastcall TForm1(TComponent* Owner);
$ N$ Y( U3 B! I5 lBEGIN_MESSAGE_MAP//添加消息映射 " C: B0 r" q `' B$ Q/ I/ {# V# B7 r
VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);
9 u& W! h7 O9 i& gVCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem); ) u2 s. V$ [, a, w& q( C, Z
END_MESSAGE_MAP(TForm);
6 R+ l3 c/ T$ }" R, _8 @/ W}; ( z3 o5 e& \ j5 {* Y# G. T1 _
//--------------------------------------------------------------------------- ! Q& ~/ c4 c. ?& G2 F
extern PACKAGE TForm1 *Form1;
$ `( b7 b5 `) C4 u6 J//---------------------------------------------------------------------------
( Y# Q6 q, }+ q0 ]+ ]! P#endif
, W7 `% O1 C! l! `- V
; S+ L, u$ O: v# H( o7 t//实现文件 8 w0 H. x2 \+ {
//---------------------------------------------------------------------------
1 B) I; f/ E K6 s& ?4 K% u y#include vcl.h 4 k0 D" k1 \! I3 L' M: P! S
#pragma hdrstop ( s! x s& A* o9 B8 j6 b
$ G1 m+ h! X4 H# H#include TestMenu.h # c' M7 n( M2 j
//---------------------------------------------------------------------------
$ }- _( G8 \5 x, {" O3 t6 n#pragma package(smart_init) / _7 A9 N! n2 u; b. I& j' K
#pragma resource *.dfm $ V6 t0 O2 u/ [' |6 O% Z
TForm1 *Form1;
6 b! F- @2 \7 Y2 [! E! j- x' I0 @# ^//--------------------------------------------------------------------------- 0 r9 P5 n6 o7 N6 J1 h
__fastcall TForm1::TForm1(TComponent* Owner) : M$ B# o4 Z2 V" Z; R' X
: TForm(Owner)
% Z' S& c/ L) y{ / Y" w! {" k" |
} ' \9 ^1 b6 H3 g/ g$ h- g2 j; f" R$ ?
//---------------------------------------------------------------------------
3 c7 E% T/ Q3 W! m% r / h" n: O3 T& l
void __fastcall TForm1::Modify(TMenuItem *pMenuItem)
8 V0 {1 b' L. I' |/ ^{//修改缺省属性 ! N. B% n& [) `
for(int i=0;ipMenuItem-Count;i++)
8 _6 M7 u- M2 D2 X* ^{ ! B' a3 T" L6 C/ l
MENUITEMINFO mii=
) J' z- U4 E4 |{ : f* H) p8 C f5 f- k# Q7 d# J
sizeof(MENUITEMINFO), ) ]# H+ D$ f4 {- N
MIIM_TYPE|MIIM_DATA ,//改变类型和数据
$ M( E; J# S( A8 Y8 q. d3 D% RMF_OWNERDRAW,0,0,0,0,0,DWORD(pMenuItem-Items-Handle), / f `4 b: d# e& z
//把菜单项的句柄赋给32位数据 % H, l% [2 i( A; [
0, 4 f; V( s. ], O& Q1 a D
0,
" _# L$ L$ I1 u) D$ y, i) ?};
% @2 C! \- n8 Q Bif(pMenuItem-Items-Caption!=-)//如果不是间隔线
+ R9 [. ~& y6 x. {9 @::SetMenuItemInfo(pMenuItem-Handle,i,TRUE,mii);
6 E) S6 r( c5 z. B% }/ L6 t3 mif(pMenuItem-Items-Count)//如果含有子菜单 ) {( K0 ^. W7 b8 M
Modify(pMenuItem-Items); M5 A' L8 b& X7 P* w9 X
}
, _5 q# X! Z+ h$ P" u6 G - @' Y8 i" g9 Y3 H
} + m9 U) J$ t0 {1 O
void __fastcall TForm1::FormCreate(TObject *Sender) ! { `/ s5 w, u8 j$ j" [) M
{
6 _& ?, R+ ^6 R& R! D0 A1 I" ]for(int i=0;iMainMenu1-Items-Count;i++)
) q1 { ]% T% H: b9 P3 }9 x{ 6 K) |( R ]2 u- j
Modify(MainMenu1-Items-Items);
# D0 I3 H! O" \) Q( D. N" S5 Q4 F}
5 n2 R+ r6 c' t9 Y5 @. LDrawMenuBar(Handle);
3 v, E, K5 O3 N3 |6 j, b} : R7 ^1 [& U; g; M, b
//---------------------------------------------------------------------------
9 c1 G/ u5 d" m. a; Cvoid __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)
, D# X. H1 o1 P: d{//设置菜单大小
6 c# t3 V' F, CTMenuItem *pItem=MainMenu1-FindItem(Msg.MeasureItemStruct-itemData,fkHandle);
3 u# E) Q( w3 E0 C* S( AMsg.MeasureItemStruct-itemWidth =pItem-Caption.Length()*8+40; $ D7 `' B, g0 d1 ?5 f) Z! O
Msg.MeasureItemStruct-itemHeight = 20;
0 W# @' q0 J: W% J}
t$ b3 m; E* W5 A. R- L$ Tvoid __fastcall TForm1::CNDrawItem(TWMDrawItem Msg) * x8 o; V# s$ h
{//画出菜单 # D3 v8 ^. C1 C9 f1 s1 r F
TMenuItem *pItem=MainMenu1-FindItem(Msg.DrawItemStruct-itemData,fkHandle);
$ a" g! j; h6 y7 eTCanvas *pCanvas=new TCanvas; * o5 b. F/ F* ]1 L+ m" K) T
pCanvas-Handle=Msg.DrawItemStruct-hDC;
9 S: w+ F- u7 \RECT r=Msg.DrawItemStruct-rcItem;
9 U" u. ^+ w0 z4 ^* ?/ I6 H F# _) JpCanvas-Brush-Color=clBtnFace; 2 p5 o! R4 B! ?* M
RECT r1=r; 4 j G3 S$ b+ h' U
r1.right+=1;
. `) o# I3 R' R4 pr1.bottom+=1;
0 }" v5 [, N9 u( B7 A+ Vr1.top-=1;
& J: g/ |: [( u4 `8 u+ Gr1.left-=1; 9 O E. q! P/ j7 ]! n
pCanvas-FillRect(r); . T7 H; ^& [4 Z# G* f) m& o3 B
::SetBkMode(pCanvas-Handle,TRANSPARENT); * q# Q; T% M- @" d# ^: k
pCanvas-TextOut(r.left+10,r.top+2,pItem-Caption); - K4 \* D* i$ r0 h
r.right-=1;
9 x! i3 [* ^2 d% r; A! V* Ir.bottom-=1;
6 s% H' \' C& H f) t* i5 sif(Msg.DrawItemStruct-itemAction == ODA_SELECT
- l0 v. B% \1 M( y$ k& E5 AMsg.DrawItemStruct-itemStateODS_SELECTED ) ; V( d" O N! ?8 S- D/ p& I
{
: W- U6 }3 {# cpCanvas-Pen-Color=(TColor)(RGB(255,255,255));
7 J, L3 Q# W5 @3 ?: }1 ?pCanvas-MoveTo(r.right,r.top);
1 U, t+ o$ I0 z7 L) I) ?% R( GpCanvas-LineTo(r.left,r.top);
; v% j1 m4 M1 n9 k& wpCanvas-LineTo(r.left,r.bottom);
! f6 @! Y6 ]- ?# MpCanvas-Pen-Color=(TColor)(RGB(128,128,128));
! @; `) S: M. z' e& s# E' x# LpCanvas-LineTo(r.right,r.bottom);
* P0 Z) ~' q; JpCanvas-LineTo(r.right,r.top);
6 [7 c, M0 \- j7 f! H5 u} U- M+ a% [: R% z
' }& f0 S2 V' V8 b. K0 V) \* B& W} |