|
我们知道,C++Builder没有自画菜单,但可以调用API函数::SetMenuItemInfo()来改
" X3 F, T7 k9 C4 g变菜单类型,达到自画菜单的目的。下面的例子演示了如何使用自画菜单。当鼠标位于菜单 / f1 b- _% W5 q) I# _
上拾,菜单项将凸出来。(黑体字为添加的代码) l8 n0 |5 K' x' y8 J) |
7 h( ?6 z) T8 P. v/ A//头文件
( W& l) H+ H& h. S2 e) h//------------------------------------------ ( H/ N! U4 _3 ~) B$ O/ d
#ifndef TestMenuH 2 W7 E/ I, ]8 c" C& b% f R
#define TestMenuH % n8 ^: @ A: l7 f- X! R, O _
//-----------------------------------------
! a3 t0 E+ c! ~4 v R#include Classes.hpp
- T% R/ _0 J5 ]# R#include Controls.hpp
2 [ x1 x4 {+ f; W, L. Q1 _#include StdCtrls.hpp ! K/ {' i/ E/ o
#include Forms.hpp + w4 j" K; L5 q: f& e
#include Menus.hpp//--------------------
$ D% m0 D+ N0 }* j& [; P # G. A3 q! r+ k' u" z# f
class TForm1 : public TForm
9 @$ z# R2 q( K8 u! n' A4 Q{
0 r9 f4 y; A. H X__published: // IDE-managed Components
% `8 f9 F' R& {; e+ V6 r5 x% \& i `TMainMenu *MainMenu1; ) Z# A: t% W1 I1 F. f" K% F3 A
TMenuItem *aaa1;
, n0 R9 `: z8 U: fTMenuItem *aaaaaaaaa1; & t, |5 P+ {; F% e9 F
TMenuItem *ccc1;
) {5 i( ^( D5 L% mTMenuItem *ddd1;
\% Y) g' G/ z3 eTMenuItem *eee1;
5 K* ?; T f! I* Y: N$ J4 MTMenuItem *ddsds1;
' ~5 J s4 {5 ?3 s. d) [/ ^TMenuItem *fcdfsss1;
# o) B* {- {5 k5 a9 r3 f: QTMenuItem *dddddddd1; * `0 i- V9 a! }( A
void __fastcall FormCreate(TObject *Sender); \* x/ e5 r9 E- h
private: // User declarations
0 P1 H; V; S* b: [void __fastcall Modify(TMenuItem *pMenuItem); 5 E1 v3 \) T0 p8 |9 O
protected : : G$ [& N5 O' V1 a" v/ g
MESSAGE void __fastcall CNMeasureItem(TWMMeasureItem Msg);//增加响应消息 " R' K6 L, v8 `* L$ \, m+ ]6 b" d
MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);
# N9 |, [ Z; K1 E8 e& B9 R( ]/ Qpublic: // User declarations
6 q1 [* b" Z0 R7 S* r__fastcall TForm1(TComponent* Owner); 1 W7 O+ Q) \- z3 V. h
BEGIN_MESSAGE_MAP//添加消息映射 / t# h: R6 E \8 @& a% `% }* r
VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem); 1 ]: }: o/ R1 U8 T- a% `8 B
VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem); + E p1 Y; |! v# y6 s4 s5 c
END_MESSAGE_MAP(TForm);
1 e5 h# R4 y8 _2 M};
! t% M: ~! h+ D3 i; ^% I: u- @//--------------------------------------------------------------------------- 6 `) m' s5 R/ S1 u2 ]. X
extern PACKAGE TForm1 *Form1; & w( f! z. w3 O {' u
//--------------------------------------------------------------------------- ! `, r8 g1 S) U5 ~% L
#endif 3 g9 H! k0 z6 j ~0 ?3 o* D
8 G* ]( ^9 p! A' ^//实现文件
4 U* e% e4 s4 d. h3 e8 Y//--------------------------------------------------------------------------- * K' V* Y0 p! \9 U6 v
#include vcl.h
8 W3 x: d6 N" e: I5 a* |5 y3 J#pragma hdrstop
0 H# [) a1 J! N7 \! Q
% V5 |+ E, w+ F; g( m+ S* G3 P#include TestMenu.h - u! Q$ T9 g+ C. {+ ?+ Q
//--------------------------------------------------------------------------- & O2 u' t( q( G$ V3 F# Y2 M- `
#pragma package(smart_init) & s. ]" t. w1 f2 r1 y
#pragma resource *.dfm $ Z# j+ G0 T0 ^- I
TForm1 *Form1; 4 w2 z2 J* y2 w) c& Y; E
//--------------------------------------------------------------------------- & z% W' b _. i2 a6 |- V0 H8 R
__fastcall TForm1::TForm1(TComponent* Owner)
7 V- s" K, e ^# G: TForm(Owner)
% J1 V4 d* ~0 u/ K% ?+ t{
9 p M4 P: u8 h" Q1 j} 5 F; O2 ~5 N1 w6 {% y$ y9 T
//---------------------------------------------------------------------------
# W" X& t/ h# Q8 F. o5 J0 u$ q * B2 e. H0 r: ]1 P$ C2 _
void __fastcall TForm1::Modify(TMenuItem *pMenuItem) - @" W* J3 t+ f. T" r) K% ^
{//修改缺省属性 % B$ s: H, P7 h, v
for(int i=0;ipMenuItem-Count;i++) 7 h7 r& _% R! m, t+ j9 b2 a
{ 2 T/ V3 l9 {9 Z, P" }9 w& i Z
MENUITEMINFO mii= & S! @, @+ B0 Q4 L r; ?
{
4 N8 l# k E; U9 Q* csizeof(MENUITEMINFO),
4 |9 s Z' g WMIIM_TYPE|MIIM_DATA ,//改变类型和数据 7 e+ w5 \# f& B! e" O0 J
MF_OWNERDRAW,0,0,0,0,0,DWORD(pMenuItem-Items-Handle),
! L1 G8 l2 m* g t//把菜单项的句柄赋给32位数据 {; f) ]8 m2 k# q, G2 D
0,
# i! ~; }1 x5 b. N0, 0 Y6 q4 D& f* E. \
};
3 \% e. U3 z6 c! v4 e- a7 k% wif(pMenuItem-Items-Caption!=-)//如果不是间隔线 2 r6 A& ~) W% b! T4 r* K- f# w
::SetMenuItemInfo(pMenuItem-Handle,i,TRUE,mii);
% h* Q6 A+ z; p9 Vif(pMenuItem-Items-Count)//如果含有子菜单
) G0 f7 d' Q! @7 v- S T! MModify(pMenuItem-Items);
8 L. E, O, n2 O" g( G/ u} / Z& @9 h6 A+ q3 K: ^1 L% U
% l) B& Q& A7 A/ |% Y6 H
}
. X h0 o+ w. f0 Q0 qvoid __fastcall TForm1::FormCreate(TObject *Sender) : C- J9 p- D/ X
{ 3 r/ q5 S2 \* {8 [9 l
for(int i=0;iMainMenu1-Items-Count;i++)
9 f) u& W) q. G2 F2 E{ ! B: R8 J0 g3 L: V4 v
Modify(MainMenu1-Items-Items);
2 p G4 s9 o2 \! Q}
2 B# b, E$ [- i9 @( JDrawMenuBar(Handle); 2 C) a9 k& w9 \+ l& ^0 s( p, f0 Q5 W
}
) q) y/ B8 k5 P//--------------------------------------------------------------------------- & J: F4 Y6 a5 @- N: g1 w
void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg) ! C/ r5 R7 |* s: k( n8 s
{//设置菜单大小 ) v0 G& T4 ~. i1 T- c
TMenuItem *pItem=MainMenu1-FindItem(Msg.MeasureItemStruct-itemData,fkHandle);
/ P" U( L7 v! T( ~, n9 s$ @Msg.MeasureItemStruct-itemWidth =pItem-Caption.Length()*8+40;
) G9 _3 F$ C; `3 wMsg.MeasureItemStruct-itemHeight = 20; , `# X/ o( ]0 V* H) `( E
}
( j& o# M) M! c) |void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)
! B4 L! R1 N' t+ l{//画出菜单 / P/ l+ A9 V$ a, j
TMenuItem *pItem=MainMenu1-FindItem(Msg.DrawItemStruct-itemData,fkHandle); 9 D/ K; D! J \% o& x) C& i8 Y
TCanvas *pCanvas=new TCanvas;
7 ?7 K+ j: O, q9 MpCanvas-Handle=Msg.DrawItemStruct-hDC; . ]/ |8 K3 p. ?4 F$ h
RECT r=Msg.DrawItemStruct-rcItem; 0 m6 H' b% A7 D6 K) R( I$ e4 i4 l
pCanvas-Brush-Color=clBtnFace; 7 h; B, c' [" A+ V7 B3 h4 j
RECT r1=r;
1 }9 k5 i" ?6 o& p* a- Sr1.right+=1; " t, n0 [; R9 D9 |$ K7 E
r1.bottom+=1; 4 A, K, f* H0 `: s8 _5 D
r1.top-=1;
; f/ `" w) G: sr1.left-=1;
) D! X7 ?$ Q! T: SpCanvas-FillRect(r);
1 K* x7 A* {8 |: X9 i$ } C::SetBkMode(pCanvas-Handle,TRANSPARENT);
* A; f( U: R: j( n: H7 I9 \# RpCanvas-TextOut(r.left+10,r.top+2,pItem-Caption); ! i5 B8 o1 T' L% Y9 U% e( `; j
r.right-=1;
, G4 n1 ]* G6 r5 u8 L& q; Kr.bottom-=1;
; E1 y( w) K# c# e$ cif(Msg.DrawItemStruct-itemAction == ODA_SELECT
! F; ~" H9 A- \. O) S7 \Msg.DrawItemStruct-itemStateODS_SELECTED ) 8 |, x' U/ I- C2 W0 p
{ # z# Q; z# V0 N* N* s3 r! f
pCanvas-Pen-Color=(TColor)(RGB(255,255,255)); ' t/ o+ s: l. @, v( g2 |( f* |
pCanvas-MoveTo(r.right,r.top); : y4 f0 }' k" m
pCanvas-LineTo(r.left,r.top); ' p1 u) T0 e* i$ q4 @
pCanvas-LineTo(r.left,r.bottom);
' |# `' t: [! H3 x5 s& ?pCanvas-Pen-Color=(TColor)(RGB(128,128,128));
" Q7 o( Q& G4 @5 C5 {% [/ g8 RpCanvas-LineTo(r.right,r.bottom);
]: N# @5 ?" B7 `pCanvas-LineTo(r.right,r.top); 5 G" Q G9 B- {& b/ M5 d7 _
} # n' t3 H1 @2 }3 ~8 n
# k7 T; S4 @) }( o/ ]. `3 v+ V} |