|
我们知道,C++Builder没有自画菜单,但可以调用API函数::SetMenuItemInfo()来改
. p. J4 [ B( B" `变菜单类型,达到自画菜单的目的。下面的例子演示了如何使用自画菜单。当鼠标位于菜单
, _8 @3 M/ h Z6 A0 O' |上拾,菜单项将凸出来。(黑体字为添加的代码) + h" v Q/ o/ O1 U: \: \5 Q
% T7 r& p& L) b" O/ j% Y# n. d# P
//头文件
, e0 \! `. B5 E* l8 {//------------------------------------------
) s! [$ d! r+ {* N! a' H#ifndef TestMenuH 0 |8 @8 A" w/ }, F! |5 [
#define TestMenuH : T3 Z5 o& Q& Q) U% P; c
//----------------------------------------- 2 Y4 R, o* c9 f7 P
#include Classes.hpp 5 f* J' Z& F0 G+ w+ s
#include Controls.hpp 1 m% l( k9 z% I; S
#include StdCtrls.hpp
. q1 m1 `' q3 b+ S5 R# ]& e0 a& e#include Forms.hpp
2 @% e, r2 ]9 V" S2 q$ X#include Menus.hpp//--------------------
" b; ^. P% H* Y5 O+ o5 {8 R0 C6 h
* Y) ]( A6 ]+ c2 \* n, j4 h) L ?9 Sclass TForm1 : public TForm
/ T( r K# i0 m% m, u$ @{ 1 |. s" B. d" R$ \$ _, l- o
__published: // IDE-managed Components 9 a1 g# Z, n3 S6 J
TMainMenu *MainMenu1;
, m: |0 `$ w6 [ O( n+ ATMenuItem *aaa1; 6 U: C* r2 V* s; H
TMenuItem *aaaaaaaaa1; ; L- P( H: R: Z" {& u
TMenuItem *ccc1; ! G- |9 W6 F! G# P5 m+ \4 Q
TMenuItem *ddd1;
; g; x2 M- t% L1 xTMenuItem *eee1;
% k0 ^: q, ]( l: N" cTMenuItem *ddsds1;
9 z- U4 k; A4 d4 e' N4 mTMenuItem *fcdfsss1; , }6 g$ T: ^) b; j8 q/ w" y
TMenuItem *dddddddd1;
1 b9 [2 d4 M1 r2 T9 e D: yvoid __fastcall FormCreate(TObject *Sender); # H1 c! H) Q6 J
private: // User declarations 4 E4 B7 T8 _' \! T1 P
void __fastcall Modify(TMenuItem *pMenuItem); " X6 f/ [9 f# |' |
protected :
7 ~# G: r3 T, a. PMESSAGE void __fastcall CNMeasureItem(TWMMeasureItem Msg);//增加响应消息 : G: e# k- Y, c" p( \+ ^1 Q
MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);
3 A5 x6 C6 V0 B0 k+ F9 Q5 G& s% Upublic: // User declarations
% y* ~- y( D5 }) f+ q+ z, X+ V- P9 b1 n__fastcall TForm1(TComponent* Owner); % h0 K. g) O0 ^$ N' \9 o
BEGIN_MESSAGE_MAP//添加消息映射 % I. E9 _; O( s) Y# V: V
VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem); ' L+ [( Z# s! D
VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem); 5 V, ?8 x- S4 Z0 N6 |9 j
END_MESSAGE_MAP(TForm);
5 i4 h* z( Z, J% f8 H6 K};
/ {/ F: x4 C5 L! P' u//---------------------------------------------------------------------------
4 O" L) q. o& T" q1 W' Iextern PACKAGE TForm1 *Form1;
; K W( T9 Z. ^# ]" ^' a8 S( D//--------------------------------------------------------------------------- 3 b3 J% j) Y* Z9 c6 {: q
#endif
% g5 D: m9 |2 m. |
2 y; h. F7 O- R: z: ]6 i//实现文件 + E& r! R0 g2 G) b1 n
//--------------------------------------------------------------------------- 2 }# b- D7 \. ?" g A) u
#include vcl.h
) \, ?. T2 f$ f7 k#pragma hdrstop
6 {- Y2 s! N4 G) J
2 V& h+ M) @. A, a& q#include TestMenu.h " b7 c2 U5 F2 A5 p6 L
//--------------------------------------------------------------------------- I) ]2 S& p1 G7 o1 E ]) V
#pragma package(smart_init)
' _! x3 D6 @: g* M4 X/ ?#pragma resource *.dfm # E3 L8 H n* t
TForm1 *Form1;
0 o( o y7 u- a% Q1 n//--------------------------------------------------------------------------- 3 I! U; N9 Q' g/ ~
__fastcall TForm1::TForm1(TComponent* Owner) ( s/ C' k2 V1 P! T: B
: TForm(Owner) 9 p/ y( Y7 U* H, x. o) E$ V
{ 6 _& R7 [( o M! x- g5 z1 J3 X7 p
} " n# v- X& X9 N
//---------------------------------------------------------------------------
9 K& ?5 [$ X1 Q" u, z1 a I 6 c0 `* e' X% a. j
void __fastcall TForm1::Modify(TMenuItem *pMenuItem) 4 M- p7 p% M' v% a1 v1 X
{//修改缺省属性
( ~6 X2 ?# {" N0 Hfor(int i=0;ipMenuItem-Count;i++) : @8 d2 e/ n, h4 a0 B1 ^. ^* `
{ ; X x! x7 ^/ q' z' ~0 O
MENUITEMINFO mii=
, n# [9 B4 j: A6 V8 V; \{ ! j% A W0 n! C3 L* q- l% }
sizeof(MENUITEMINFO),
2 `4 q$ W3 X9 U- u, Q; ^MIIM_TYPE|MIIM_DATA ,//改变类型和数据
" U, u; @5 B+ FMF_OWNERDRAW,0,0,0,0,0,DWORD(pMenuItem-Items-Handle),
+ [: `) u9 ]9 `2 s, F- l) A//把菜单项的句柄赋给32位数据 / P E2 k0 \& }' H( C: n
0, 8 z# j$ `8 J% z5 x5 X5 z% \* c
0,
" _ e& s6 Z. c1 n9 a}; , K7 i3 ~' O. ], i
if(pMenuItem-Items-Caption!=-)//如果不是间隔线 7 Z+ V8 x5 F& J8 g: Z3 W- M
::SetMenuItemInfo(pMenuItem-Handle,i,TRUE,mii); 3 A3 K0 D7 q: ]/ u4 z) F1 C8 k
if(pMenuItem-Items-Count)//如果含有子菜单 0 d# O, ]! s9 n- d7 [
Modify(pMenuItem-Items); ' W8 o' i7 y/ c$ F' ^
} 3 r# `5 D5 C6 |% O+ t$ ^# _
* b1 ^4 m& k# [' U7 Q" t3 l8 _5 P
} ' }) K2 y& ?, b
void __fastcall TForm1::FormCreate(TObject *Sender)
) k# S" V' {& [7 _* |# w{
3 X6 _1 l3 a6 D4 T$ ~4 Y) Kfor(int i=0;iMainMenu1-Items-Count;i++) / L. x7 k5 T! {# _, h
{ 4 K9 U7 t$ P" i
Modify(MainMenu1-Items-Items); Z7 E% T* ]8 a+ x
} - n$ N `9 M& ^
DrawMenuBar(Handle); ( `% Q4 L" W1 A* k
}
, i7 N2 U4 H. i- ?3 q# g//--------------------------------------------------------------------------- ) {$ o# |- R& r2 B6 T; N
void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg) % w) |' m2 e, ?9 a+ f! a1 w
{//设置菜单大小
$ m3 e9 W9 l5 uTMenuItem *pItem=MainMenu1-FindItem(Msg.MeasureItemStruct-itemData,fkHandle); & y( e5 S( u! t
Msg.MeasureItemStruct-itemWidth =pItem-Caption.Length()*8+40;
3 |+ A8 C' y! F. d7 N8 vMsg.MeasureItemStruct-itemHeight = 20; ; A- F7 T" T& K9 o2 u
}
+ y% q* j- D2 Gvoid __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)
/ l6 m# q2 R, I1 m{//画出菜单 7 X# e) s- T) a' s' V9 t
TMenuItem *pItem=MainMenu1-FindItem(Msg.DrawItemStruct-itemData,fkHandle);
7 ]) |- } K; ? H6 f$ ~TCanvas *pCanvas=new TCanvas; 6 _1 j' w/ K5 o( O/ j1 y
pCanvas-Handle=Msg.DrawItemStruct-hDC; 3 v4 ~) }( h) f- ~' M
RECT r=Msg.DrawItemStruct-rcItem; 2 a: U: N0 ?/ E, e
pCanvas-Brush-Color=clBtnFace; . t; [/ R. e a/ m" r: o8 g
RECT r1=r; & B* n7 {8 o9 x2 k! y; `9 l# Z( D
r1.right+=1;
g: L' Y# B1 d" J8 a. Yr1.bottom+=1; % e: v% A/ U6 \) x! L, w5 k/ I# h: }' z
r1.top-=1;
4 v) @5 k! {$ |6 J& ur1.left-=1;
1 M* r. P6 V/ q4 Y; s7 K8 rpCanvas-FillRect(r);
& A3 x/ Y! ~0 G7 f2 ]* M9 b::SetBkMode(pCanvas-Handle,TRANSPARENT);
! f* J# o( A% T- m! ypCanvas-TextOut(r.left+10,r.top+2,pItem-Caption);
1 v" N# q( z" b; O* K+ yr.right-=1;
3 U ?: Y) r3 D) [* jr.bottom-=1;
3 `7 r& ^2 {5 H D& o& ^if(Msg.DrawItemStruct-itemAction == ODA_SELECT
$ a( ~1 L+ B/ a6 ?Msg.DrawItemStruct-itemStateODS_SELECTED ) # }* m8 K$ h2 X% c; i' n# t
{ " {7 ~6 I% a2 r" N
pCanvas-Pen-Color=(TColor)(RGB(255,255,255));
1 K( `& E* _6 j* vpCanvas-MoveTo(r.right,r.top); ' B! f( R: a6 B3 ?
pCanvas-LineTo(r.left,r.top); , W; _4 @+ C; X; K" q+ ]
pCanvas-LineTo(r.left,r.bottom);
1 D |0 g2 K0 U3 S9 n# o. ]- [, WpCanvas-Pen-Color=(TColor)(RGB(128,128,128)); ) C7 r) [) h& v
pCanvas-LineTo(r.right,r.bottom); / }9 i9 c5 w% k, E
pCanvas-LineTo(r.right,r.top);
/ R+ K. ~" p+ @% w}
- ^& X6 ~* o O, c a" }' p' ^) R* G3 V6 b( z4 g$ m, T
} |