|
我们知道,C++Builder没有自画菜单,但可以调用API函数::SetMenuItemInfo()来改
1 m4 |/ H5 S5 j8 ~8 I" G# s( s5 g, u变菜单类型,达到自画菜单的目的。下面的例子演示了如何使用自画菜单。当鼠标位于菜单
0 e4 [7 B3 i# w上拾,菜单项将凸出来。(黑体字为添加的代码)
; R/ |! O: Y5 d* O( M $ c1 H. \& c; J) V- A8 i, x5 q* h
//头文件 / _/ g+ z/ J( l5 Q4 _8 C/ d b# G
//------------------------------------------ ) j- o! C! A" J( @
#ifndef TestMenuH
7 T9 r8 I8 x: f$ t9 |/ \#define TestMenuH
1 L0 r) u- g9 V//----------------------------------------- 5 {" b/ B9 k3 C1 Z/ _
#include Classes.hpp
: l( A& ^# j- @4 }7 P* `3 l2 z#include Controls.hpp , |, w3 j3 _% h3 p& P
#include StdCtrls.hpp 8 Z# a2 e2 v4 P) B: v
#include Forms.hpp ' X3 E& c3 i7 J/ {- q4 ^
#include Menus.hpp//-------------------- 8 L! t# Y! q3 H- q9 t$ P
4 h0 H. J; @. U5 ]" }class TForm1 : public TForm . m" O Y, u0 f0 X) O( c) ] X
{ " ?. Q0 u7 F8 o4 o6 S% x' ^9 d
__published: // IDE-managed Components $ u/ t, b* Z. |) ?( K
TMainMenu *MainMenu1; ! q; T' k: H+ _ A( @" X
TMenuItem *aaa1;
+ K( K- h/ z& p. I$ |. YTMenuItem *aaaaaaaaa1;
' z, ` u0 S7 sTMenuItem *ccc1;
7 E: o- }. W4 S5 t- r6 K+ HTMenuItem *ddd1; ! L6 q7 C, i: ^) i1 v0 {
TMenuItem *eee1; 5 y; t8 y8 n# l, p
TMenuItem *ddsds1;
0 d" ~7 M$ v! a4 m2 c; ]TMenuItem *fcdfsss1;
0 M& i9 d, i* a" I i5 Q7 Y+ K1 |TMenuItem *dddddddd1; 2 [* x2 M; B' X( ]% [
void __fastcall FormCreate(TObject *Sender); " d' x. J8 Z9 w: d
private: // User declarations - V$ `0 B4 n; ~2 o/ v4 K+ e* R
void __fastcall Modify(TMenuItem *pMenuItem); + m2 C: `1 a4 o5 A
protected :
6 J3 D8 H( z; K$ P- M, IMESSAGE void __fastcall CNMeasureItem(TWMMeasureItem Msg);//增加响应消息
* Z( G8 C& c) d+ u TMESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg); ) K: G: [: C! t& j
public: // User declarations 9 c: z( j! W/ S0 E9 V) {- l
__fastcall TForm1(TComponent* Owner); # S- A- n# M0 `1 H) x6 K# y$ ^! l4 H
BEGIN_MESSAGE_MAP//添加消息映射 + h" A: C q. R& b
VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);
/ t: |8 D4 G; f$ o* K; C6 E; q+ `VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);
2 d) C0 U3 H' I$ a2 Y. FEND_MESSAGE_MAP(TForm); 8 n. {" N7 h( d/ l( v9 W; d
};
4 \ Q6 j0 A9 H. C x//--------------------------------------------------------------------------- * Y8 M7 f4 b: k& g4 {% i
extern PACKAGE TForm1 *Form1;
; U# Q- \0 E0 u) f//---------------------------------------------------------------------------
% x! P( s9 _) W# f- u" o#endif
7 G) u: D5 j% ?) X, c( V& F' d6 I
: ]: d6 `, }3 H. G! Y! Q1 r5 X//实现文件 ( G0 G- [8 Z3 h; n+ s6 l* }
//--------------------------------------------------------------------------- 3 l9 Y: o. {7 q! c
#include vcl.h
7 x7 r8 @6 x& _9 }' a1 ^#pragma hdrstop
) }% X+ P$ |5 g. c4 u% k/ d7 T1 M
$ R( s& ^1 \% ?#include TestMenu.h
: M/ o' k' A d! d) @//---------------------------------------------------------------------------
5 W. o) e9 C5 z0 g#pragma package(smart_init)
E1 t+ }4 q. f# `0 R' r#pragma resource *.dfm % y5 U; v. H: g8 E: M& M2 o
TForm1 *Form1; ; W7 E K& a: q6 J m3 B
//---------------------------------------------------------------------------
. _2 W# L# R# C; L& n3 ]__fastcall TForm1::TForm1(TComponent* Owner)
* k8 R* D( q7 V1 }: TForm(Owner)
& j+ s0 O# @: p: B* J1 d{
( w3 U4 V8 o4 Q2 }" ?8 C' @}
`5 F* q, ]' v9 k1 {( G//--------------------------------------------------------------------------- $ c* o* H4 e' N3 a v
) @. l; l! b5 J& m3 P$ b3 W" {4 Zvoid __fastcall TForm1::Modify(TMenuItem *pMenuItem)
4 F' c2 m( I) e8 J- {5 T" c6 }{//修改缺省属性
' W9 B' Y4 @ r- Z. ~# ^! [for(int i=0;ipMenuItem-Count;i++) 4 w% H. d5 h9 k- ~# G" q4 o
{
7 h; s& g3 K! ^, D HMENUITEMINFO mii= , }3 o: S5 N" O6 ~3 _
{
/ ]3 x( r0 k) a0 k& t$ B& d$ `$ `sizeof(MENUITEMINFO), 5 \0 @+ P1 V7 X5 o' s% P/ y
MIIM_TYPE|MIIM_DATA ,//改变类型和数据 4 N$ y. U' ~' y6 S5 o# R9 L4 s: |
MF_OWNERDRAW,0,0,0,0,0,DWORD(pMenuItem-Items-Handle), ' W0 b; k' g. h0 m3 e
//把菜单项的句柄赋给32位数据
+ H# f! V" w% Z& |. O) U0, 7 k9 H3 {0 Y8 w' S7 z, w+ f7 r! w7 k
0, / y' R* N. b) b
}; - ~9 {1 |* s7 I" N1 h/ M
if(pMenuItem-Items-Caption!=-)//如果不是间隔线 8 d$ e" ^5 m3 @9 a' S
::SetMenuItemInfo(pMenuItem-Handle,i,TRUE,mii); 5 [; z1 b k/ }4 H; i5 o( f+ ^
if(pMenuItem-Items-Count)//如果含有子菜单
: f6 o; E2 }( v) z% rModify(pMenuItem-Items);
/ K. W4 z* v/ |& u/ ?* V2 _; B}
# \( ^1 i2 n: ?: b6 v& q : p0 w5 N( e$ h U4 c+ b
} 0 n$ e: P; T+ r) a/ ]( t0 v( M
void __fastcall TForm1::FormCreate(TObject *Sender)
/ |8 o) o) `& l9 c{
" Y. _6 D* u! X5 p& Bfor(int i=0;iMainMenu1-Items-Count;i++)
* e4 @' d( }1 y' M, X. {0 n{
1 I8 k1 ]/ p2 b* w4 K% J; HModify(MainMenu1-Items-Items);
5 \1 Q0 z6 o$ Z1 j' m}
! G8 b! k$ {& i9 k" I) b& ]( h; eDrawMenuBar(Handle);
* q' }5 g$ e$ |. q3 e}
! x! w% J0 L3 j# u7 T//---------------------------------------------------------------------------
' f' i5 f7 Q) U6 V" Xvoid __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg) % i6 T2 ?! l' r; G3 t
{//设置菜单大小
+ a: N; Q! x/ U( i2 UTMenuItem *pItem=MainMenu1-FindItem(Msg.MeasureItemStruct-itemData,fkHandle); ) F& R& B% r" {; r" V
Msg.MeasureItemStruct-itemWidth =pItem-Caption.Length()*8+40; - P+ M8 V2 n5 T5 R3 g1 r# G2 }
Msg.MeasureItemStruct-itemHeight = 20; 1 ^4 N5 A5 v- H0 d) F
} 3 J e ?- N% Y- m
void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg) ' R) ]& s1 B. W- q: y6 E# I
{//画出菜单 3 B! a/ a3 a' m
TMenuItem *pItem=MainMenu1-FindItem(Msg.DrawItemStruct-itemData,fkHandle); 0 M, R4 f4 r. _
TCanvas *pCanvas=new TCanvas; ) v7 e# B0 o) }2 ?3 R
pCanvas-Handle=Msg.DrawItemStruct-hDC; + u Z; h( q3 X8 d0 J* a
RECT r=Msg.DrawItemStruct-rcItem; : |& r4 ^3 A% K2 D$ a
pCanvas-Brush-Color=clBtnFace;
. A# N' t, T. d+ Q6 x, lRECT r1=r;
. [: c! L* Q& D( b7 b0 Z& D( @r1.right+=1; " t) X8 L, u3 k6 G9 A& D# W! u, Q
r1.bottom+=1;
2 @) m6 P% w4 Rr1.top-=1; % \& b; t' @8 U; k
r1.left-=1; 0 W {( ~. J6 L( a7 Q4 P: D
pCanvas-FillRect(r); 2 i, S1 T& ~/ r& C
::SetBkMode(pCanvas-Handle,TRANSPARENT); 1 Y4 t( [9 \& B! s
pCanvas-TextOut(r.left+10,r.top+2,pItem-Caption);
% d! @! l7 O' w- |5 zr.right-=1;
# l+ V# d3 d- b6 Lr.bottom-=1; 9 Y: C( i% s8 Z. i+ c* d' k G& ^$ ]
if(Msg.DrawItemStruct-itemAction == ODA_SELECT
( f+ ?: S# {' ~( b2 f- k, bMsg.DrawItemStruct-itemStateODS_SELECTED ) & I& m) I6 \' ~+ h
{
6 t' e7 x' Z3 S$ ~3 K2 `& q' M* opCanvas-Pen-Color=(TColor)(RGB(255,255,255)); & j9 a7 n- R ?4 Q
pCanvas-MoveTo(r.right,r.top); # F1 \, _( z5 ~8 q; i$ b
pCanvas-LineTo(r.left,r.top); # d$ Z* B2 X; d/ ?0 P: S8 H8 U
pCanvas-LineTo(r.left,r.bottom); + ?. D1 n/ O8 c+ Z
pCanvas-Pen-Color=(TColor)(RGB(128,128,128));
; a9 g4 ^& T0 p$ _; h1 d' B2 NpCanvas-LineTo(r.right,r.bottom); $ O) j* |6 B/ G
pCanvas-LineTo(r.right,r.top); ) E) H% ? r# }7 {- e8 W0 z- e
}
9 d+ f* X8 J( A1 i4 s- E
, O3 {6 ^+ M, U; ?6 l! A3 G} |