|
我们知道,C++Builder没有自画菜单,但可以调用API函数::SetMenuItemInfo()来改
1 O- C' I5 D8 J! G3 z, c0 O. M) x6 _变菜单类型,达到自画菜单的目的。下面的例子演示了如何使用自画菜单。当鼠标位于菜单
0 H' n) B( ~& G# _上拾,菜单项将凸出来。(黑体字为添加的代码)
+ J/ B+ t& O7 G7 X: ] 1 g4 M2 p* q% `( d
//头文件
% R0 w9 _: ^/ `' K//------------------------------------------ ; F( D4 |# J3 A- J& W6 i. \
#ifndef TestMenuH ; v; C1 L# o3 S% a2 R4 S5 T \0 r ?
#define TestMenuH 3 t* _' H! Q; |7 ^$ @
//----------------------------------------- / a6 H/ Z. \) r$ D; N5 N* o6 L2 }
#include Classes.hpp $ b' W2 U4 w! o# f% c
#include Controls.hpp . t- h' s+ {2 K N! k0 D5 N
#include StdCtrls.hpp
8 f0 n* a+ e k#include Forms.hpp ' W$ n. T. l9 T/ `: T7 n8 x& F
#include Menus.hpp//--------------------
7 B3 u7 x& v0 [% @: {% `
; J8 [# A, ~; P, y& T3 jclass TForm1 : public TForm
/ k) @" `$ d/ O0 ?{ . I, e/ K. h2 X" t# @7 o
__published: // IDE-managed Components
$ \9 _9 |3 k/ p# lTMainMenu *MainMenu1;
% W! B, z. l* t% t8 J6 s+ S: D" |% ATMenuItem *aaa1; . X7 E" Z* {) y" v' g. v% |3 h: h
TMenuItem *aaaaaaaaa1; 1 F9 D w: ?6 z" J
TMenuItem *ccc1;
) g0 H& J- v- @! T# CTMenuItem *ddd1;
% i" ^* u% P3 p% BTMenuItem *eee1;
) H8 g. \6 F6 _" H9 q" y, T! hTMenuItem *ddsds1; 8 S# `8 W- o; I: R! T" z% S
TMenuItem *fcdfsss1;
% z$ h3 |, z6 w5 GTMenuItem *dddddddd1;
) T7 Z8 u' Z9 H2 avoid __fastcall FormCreate(TObject *Sender);
% V4 n% G9 n5 A, u. O' }) Wprivate: // User declarations ; S6 @2 [* f/ \! ]2 d
void __fastcall Modify(TMenuItem *pMenuItem);
! D' R# v5 \2 q# p7 Q$ s5 b2 B e7 u$ \protected : - d1 [8 z. x+ b* n* F% H
MESSAGE void __fastcall CNMeasureItem(TWMMeasureItem Msg);//增加响应消息
0 T! i- Y* S, `$ t! h7 E& j- OMESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg); / o% H1 d( O; s( z p; u2 v
public: // User declarations 7 D5 _$ r; k& h3 v3 H5 g
__fastcall TForm1(TComponent* Owner); / _ \. n- A& _7 C. j5 j, @* t+ w/ h/ |
BEGIN_MESSAGE_MAP//添加消息映射
' E4 C+ d3 \7 N* w3 V6 hVCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem); # ]1 s2 g/ G* {6 _4 L |
VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem); 8 e" x; n# U4 a( h0 w( y% y
END_MESSAGE_MAP(TForm); + j, D+ U( L7 }" |) o
};
, l) ^' c' k. E, e) F$ @( F//--------------------------------------------------------------------------- 9 o5 f4 L, q0 y% r, x0 z% q" m& J
extern PACKAGE TForm1 *Form1;
! B& n% C* O" W( S/ p: N//--------------------------------------------------------------------------- . T; p5 R. G% Q+ j
#endif
9 {/ t: g- p' j3 k
% j5 q) K% k! s8 _8 D) v//实现文件 $ w- t4 e' [ C
//--------------------------------------------------------------------------- 0 x; G3 v9 v! H1 E3 J& N5 N$ P
#include vcl.h " o5 P4 ^1 Z7 _$ w- U+ x& [
#pragma hdrstop 6 G% y+ B, R: U6 `
* ?8 \6 N# d3 B( _* `; @: ]#include TestMenu.h
" L' `$ }% r& |8 `/ `* i7 Q//--------------------------------------------------------------------------- 0 v- g- w7 P/ `) d
#pragma package(smart_init)
! Q2 s3 U# \* w% \) j& Y+ u; h#pragma resource *.dfm
8 I) \7 r7 t/ R$ j$ rTForm1 *Form1;
4 n3 {0 {/ v8 n4 v7 s& f+ C9 a: [//--------------------------------------------------------------------------- 7 f1 k. y' P5 P$ V* ?
__fastcall TForm1::TForm1(TComponent* Owner)
8 i: O$ r, h" f S0 N# Z) E: TForm(Owner)
; C; h: r1 B2 n1 A3 B3 Y( J' f{ ' t+ M' ^# x' L
}
" X& `& g! A. T4 B$ a, l//---------------------------------------------------------------------------
) ^& H1 |0 @5 k! j1 r) R8 l; Y ( x, P) Q3 z6 g' N1 U4 M6 d. I
void __fastcall TForm1::Modify(TMenuItem *pMenuItem) . R* j3 x, S7 }2 D; S) n6 w' _* b! Z/ P
{//修改缺省属性 $ j/ K6 d5 R' x: S& ~
for(int i=0;ipMenuItem-Count;i++)
- E% H. M+ S+ n; O0 q, `{
' f+ w# t9 O* R& YMENUITEMINFO mii= 9 j: o4 F+ {2 r
{
/ p8 K# f* T* P. d, k3 \sizeof(MENUITEMINFO),
! r$ f7 v; H* e7 A4 XMIIM_TYPE|MIIM_DATA ,//改变类型和数据 4 g j- L' B2 ^
MF_OWNERDRAW,0,0,0,0,0,DWORD(pMenuItem-Items-Handle),
* c/ A- V% k" d! j6 c//把菜单项的句柄赋给32位数据 ( X" ]0 Y8 S: k y/ |
0, " _& ], ?" A' s# i$ |6 z
0,
6 B6 a( }$ g/ `& R' ^/ N}; 0 u" x8 c. H; J( b4 I
if(pMenuItem-Items-Caption!=-)//如果不是间隔线 0 N0 q6 e5 H" z( @! h( M; Z
::SetMenuItemInfo(pMenuItem-Handle,i,TRUE,mii);
+ ` i: s" a" Q* K8 k; E; Kif(pMenuItem-Items-Count)//如果含有子菜单 ! Y$ s5 ~: ~# A3 c& I L ^
Modify(pMenuItem-Items);
, ~% x5 l3 M# Z2 W& G" {}
2 E3 [! Q: k9 A7 h9 j# ~) D3 V' a
9 I; C3 v' d- d6 b! j}
( p5 N* y- c* a% p& f2 mvoid __fastcall TForm1::FormCreate(TObject *Sender)
6 \6 X7 \8 p) T7 \% T2 h( |! w{ ) \0 r9 i' N: `( @
for(int i=0;iMainMenu1-Items-Count;i++) 7 g1 o. g) I" Q5 Z
{
: J3 g# u4 w( q @% cModify(MainMenu1-Items-Items); # S) C" n$ Z& t7 P# D
}
% f' C0 ?- F" _3 q6 E8 S/ `3 Y/ u! JDrawMenuBar(Handle); 0 A1 V( a0 P/ l8 V8 e {7 W) B# [& j1 S- [
} . C: j& u: w+ N( n2 ]
//--------------------------------------------------------------------------- ' `9 T$ C/ {3 i5 Z/ _
void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg) x" O6 C9 e. \! `& n& ]# a
{//设置菜单大小 9 D8 `1 l8 ^2 J$ V0 E- C
TMenuItem *pItem=MainMenu1-FindItem(Msg.MeasureItemStruct-itemData,fkHandle); % V5 e3 |- V4 ?9 K
Msg.MeasureItemStruct-itemWidth =pItem-Caption.Length()*8+40;
* k4 O2 ~3 F- S- ^/ d% gMsg.MeasureItemStruct-itemHeight = 20; " R& `: X1 {, J2 l9 p* ^
} * \/ j* S# ?! P0 z; ~; r
void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)
( W; s! H2 C) P* y{//画出菜单 5 w. E) ?: g) [6 L, a
TMenuItem *pItem=MainMenu1-FindItem(Msg.DrawItemStruct-itemData,fkHandle);
) w. B2 z4 B8 G! I& H; q' w6 gTCanvas *pCanvas=new TCanvas; ( c6 _' L$ Q( z% S& t
pCanvas-Handle=Msg.DrawItemStruct-hDC; ( l; m6 c+ q3 k( ^3 y2 r
RECT r=Msg.DrawItemStruct-rcItem; 5 J' f' W7 W! Y& ^1 j) b- ?
pCanvas-Brush-Color=clBtnFace; 7 F4 P- Q) U" C I' Y D1 m# W
RECT r1=r;
( Q2 `1 h$ y9 Sr1.right+=1;
2 U0 b' g. s# Zr1.bottom+=1;
& e$ B [3 F# H, ]# Ur1.top-=1; 8 P" |9 s9 H- N" h' y
r1.left-=1; 0 x; J1 r+ _# Y0 e+ D/ f: q2 z
pCanvas-FillRect(r);
5 y- A; P$ M5 j) P# V::SetBkMode(pCanvas-Handle,TRANSPARENT);
' _. o' w( f' M% l- w% {pCanvas-TextOut(r.left+10,r.top+2,pItem-Caption); ' O# X" G( O) H, g' X% ` W% n
r.right-=1;
( ^' D7 v9 u) H4 e8 `7 w& f! F. xr.bottom-=1;
3 F* ]0 M" a( U" l$ X1 `! d; G' Vif(Msg.DrawItemStruct-itemAction == ODA_SELECT " J' V/ g! ]6 {$ M& R* C
Msg.DrawItemStruct-itemStateODS_SELECTED ) 4 L A' R) l- I. b! a
{
: k7 u7 A x. H* _& MpCanvas-Pen-Color=(TColor)(RGB(255,255,255));
5 w% M Z! C7 Q9 fpCanvas-MoveTo(r.right,r.top);
- z7 E" b" R8 a R8 \" P. z- @pCanvas-LineTo(r.left,r.top);
& {5 ? J- }- L( p3 b" apCanvas-LineTo(r.left,r.bottom); ! v, v& ^+ u9 P3 x& k$ r
pCanvas-Pen-Color=(TColor)(RGB(128,128,128)); ( X: s4 r" Z1 j* s
pCanvas-LineTo(r.right,r.bottom); $ a1 [; U' Q$ E7 O6 I
pCanvas-LineTo(r.right,r.top);
6 W. ~2 b$ ~- q0 Y, g} . r6 ]6 X2 J7 C' N3 N6 l% J/ ?
% K1 u- g9 s0 x
} |