|
我们知道,C++Builder没有自画菜单,但可以调用API函数::SetMenuItemInfo()来改
. Z2 Y3 J, @3 Z# `. ^变菜单类型,达到自画菜单的目的。下面的例子演示了如何使用自画菜单。当鼠标位于菜单
0 e& n: y4 W- k9 w5 m: @上拾,菜单项将凸出来。(黑体字为添加的代码) " F0 o2 U( \4 n
( `5 L+ Z4 c& @& t7 u" n$ h//头文件 5 { |( q2 G& K1 L) k
//------------------------------------------ : C' }7 Q/ d6 P: P
#ifndef TestMenuH
1 F- l) b" i8 }% P. `, q#define TestMenuH 2 j4 l1 A+ g* Z
//----------------------------------------- ) H+ N$ }$ G4 x1 S! F: K% n' d/ m0 l
#include Classes.hpp
8 N2 {, u& S" d+ T2 Y/ I* w' S#include Controls.hpp
K9 g# H ^* Y' K" {#include StdCtrls.hpp 1 t, m6 T/ m, P& p; ^1 E
#include Forms.hpp
8 j* b6 u5 X, i#include Menus.hpp//--------------------
% _/ L* @$ _3 J" M' }( p) j ; E( b/ ^6 V1 X& s0 ?! g
class TForm1 : public TForm - z0 r- E$ G2 m5 R8 x
{ % D; n, Y- m2 `; L% l
__published: // IDE-managed Components
" j+ [' y! D) [" a. qTMainMenu *MainMenu1;
: t+ B. R: q/ ?. ?" C* }& _TMenuItem *aaa1; % F+ @8 |) ]/ q$ g
TMenuItem *aaaaaaaaa1;
" C6 |2 M0 I3 O8 e4 ~TMenuItem *ccc1; # ~+ c$ L) r: m
TMenuItem *ddd1; - P- R9 T* c1 @
TMenuItem *eee1; # A+ N9 z. @( V1 \) d
TMenuItem *ddsds1; ) r+ u& a0 I f2 A
TMenuItem *fcdfsss1;
1 B0 d. l4 b7 m1 KTMenuItem *dddddddd1;
2 [! T. D) D* C% ?% wvoid __fastcall FormCreate(TObject *Sender);
6 x; g( Z/ C* E+ A% Z( eprivate: // User declarations 1 Y( u; Z0 C1 U6 J! U. ?
void __fastcall Modify(TMenuItem *pMenuItem); ! _4 y+ e F7 ^9 r
protected : : d. [& [2 b5 `0 G, q. ]# ~3 O
MESSAGE void __fastcall CNMeasureItem(TWMMeasureItem Msg);//增加响应消息 % u$ ]; K& ` `7 b0 K- M
MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);
4 y/ [( b8 {" ]* {* Ypublic: // User declarations
# g# i( `2 E. @& ?3 b4 s__fastcall TForm1(TComponent* Owner);
4 a, e6 I7 c7 q: g2 jBEGIN_MESSAGE_MAP//添加消息映射 : n$ j+ a4 u" m
VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);
. y$ p- b3 |1 T: m2 @% CVCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);
9 ?) ^# j: _# Y5 cEND_MESSAGE_MAP(TForm);
- X& A, f$ c; @8 T3 m- E0 ?}; 8 w. R- n4 X# Z8 Y, Y
//--------------------------------------------------------------------------- ' f- Z' ~( T8 m$ H4 h
extern PACKAGE TForm1 *Form1; $ p: `8 [3 x* ^, B
//--------------------------------------------------------------------------- 2 X" ? w8 D% u" Y
#endif
( k! z% k C5 x& k
5 K% v' h! T5 o8 c, C9 B//实现文件 3 N+ W, h6 a. Q& H$ H
//---------------------------------------------------------------------------
! z3 t: y4 l/ @: y* B# p#include vcl.h - y6 l4 l; C( A, J% W
#pragma hdrstop - A7 d. X5 z+ j/ v# I; k; Q+ _
* g( o# Q, L# l7 R
#include TestMenu.h 8 L7 s/ C! T h
//---------------------------------------------------------------------------
; b9 ?/ n1 w" E& c. x8 C: M#pragma package(smart_init) 9 v, v) _% a6 G& |$ F
#pragma resource *.dfm * b8 u! }) k, D$ T
TForm1 *Form1;
# `3 }1 H; r% H//--------------------------------------------------------------------------- & F+ ~: y, |% @6 K# ]
__fastcall TForm1::TForm1(TComponent* Owner)
5 e% b$ A1 {& [% R: TForm(Owner) 6 \! X$ ~: m) I
{ 1 ? j- L; T( n1 d! B/ H
} ! T; m6 \4 q: ]( ?# s( g; f
//--------------------------------------------------------------------------- 9 q! }% m" i4 b, a+ j" A1 `
7 Q- b1 T0 b4 ?! W7 |- B* ~
void __fastcall TForm1::Modify(TMenuItem *pMenuItem)
1 r/ y; I8 d, S/ P! E9 I5 y1 P{//修改缺省属性 * T4 E- |2 C0 j# d$ {
for(int i=0;ipMenuItem-Count;i++)
L3 y5 x1 R* H0 l{
: J8 Z: C; L, w8 C# i* vMENUITEMINFO mii=
B3 q6 c2 I7 m) x: d4 Q" b& y{
' W) z& _' f! x8 qsizeof(MENUITEMINFO),
5 s. c' P, z* l eMIIM_TYPE|MIIM_DATA ,//改变类型和数据 5 {: p. l( h3 l8 ]% c& \
MF_OWNERDRAW,0,0,0,0,0,DWORD(pMenuItem-Items-Handle),
3 G U" V4 e1 i//把菜单项的句柄赋给32位数据
C, ^& @8 ~3 m: A, |& W* k0 b0, 3 `3 T* D' h+ ]7 y5 X
0,
, D$ R' X8 g u}; 1 |9 G/ f& Q( }2 R- \* P
if(pMenuItem-Items-Caption!=-)//如果不是间隔线 ! }' |8 O2 E/ q! Z
::SetMenuItemInfo(pMenuItem-Handle,i,TRUE,mii); ! Z0 M6 I: @) W8 }
if(pMenuItem-Items-Count)//如果含有子菜单 7 R+ M1 r2 j" ~
Modify(pMenuItem-Items); 1 O N- r3 @* t7 p+ t$ w( J
} 2 r9 Z" ^9 z( q9 D! i
/ q5 C: f, J% o' B' l}
" I9 r3 ^+ ?7 {' s" h kvoid __fastcall TForm1::FormCreate(TObject *Sender)
3 O" t4 @( m5 W{
6 D( Z& R, d" I# Afor(int i=0;iMainMenu1-Items-Count;i++)
1 R4 j$ n' T j{
) Z0 d% a. j% U, MModify(MainMenu1-Items-Items);
# x" I' m. N5 j; H* f- Y8 p7 J} r( R- R# m$ ?
DrawMenuBar(Handle);
6 T: A$ U o/ y& I D} " `2 H- J$ q/ H1 X
//---------------------------------------------------------------------------
; h% z# v3 M: _1 dvoid __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)
+ r. v( t4 R0 @{//设置菜单大小
# H% N7 t J! Z4 y6 W% b8 r7 m( RTMenuItem *pItem=MainMenu1-FindItem(Msg.MeasureItemStruct-itemData,fkHandle); b0 q! V$ |% n2 B$ r) d. ?
Msg.MeasureItemStruct-itemWidth =pItem-Caption.Length()*8+40; ) J/ ^, y1 f7 T( G2 Q- |
Msg.MeasureItemStruct-itemHeight = 20;
- l* d$ p/ @( k( `& e p}
) l1 }3 z' @) Q5 J0 U- u1 Dvoid __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)
) S8 V9 ~ f" A/ l% W{//画出菜单
- p, F* [ c4 UTMenuItem *pItem=MainMenu1-FindItem(Msg.DrawItemStruct-itemData,fkHandle);
- ? Q8 \# A* r# E" H. Z6 {TCanvas *pCanvas=new TCanvas;
4 z7 d! `) t) W5 V& QpCanvas-Handle=Msg.DrawItemStruct-hDC;
+ c; X) C/ N# R$ VRECT r=Msg.DrawItemStruct-rcItem; $ L9 M8 ^/ R$ o: `. l, N9 Z, R( O
pCanvas-Brush-Color=clBtnFace; 2 c- w# x! l2 |& q T+ H
RECT r1=r;
6 X) |: E+ r. Zr1.right+=1;
- t' X* B9 Q9 @r1.bottom+=1;
+ Y; @/ [3 b) a7 U8 L* ~3 Q( `r1.top-=1;
- o- i; d$ X8 a+ t$ O& cr1.left-=1;
( R3 B; c2 ]2 y/ v1 m apCanvas-FillRect(r); 1 V' v3 @( O8 E( C" H4 r# a5 f8 x
::SetBkMode(pCanvas-Handle,TRANSPARENT); & ^- P2 @, ]* K
pCanvas-TextOut(r.left+10,r.top+2,pItem-Caption);
6 i9 P ~0 n! N3 | y0 \3 Gr.right-=1;
7 ^1 S1 ]& D0 Rr.bottom-=1;
3 N9 ]! N9 O2 T( q1 Yif(Msg.DrawItemStruct-itemAction == ODA_SELECT ) d; |% h6 e" x1 V a$ E) u5 Z! u
Msg.DrawItemStruct-itemStateODS_SELECTED )
U- f9 z$ c4 F' g( v: J8 G `{
. w4 s" `2 M( A! o$ w7 epCanvas-Pen-Color=(TColor)(RGB(255,255,255));
+ G2 x I* J) E% v) M) [) l! l# PpCanvas-MoveTo(r.right,r.top);
6 B- H. N4 N% R/ ApCanvas-LineTo(r.left,r.top); # u$ v* C# z! [# a5 t) l/ Q- Z
pCanvas-LineTo(r.left,r.bottom);
! n2 p# R7 ]+ `3 y) LpCanvas-Pen-Color=(TColor)(RGB(128,128,128));
' s0 a, x7 P3 upCanvas-LineTo(r.right,r.bottom); 4 ?( R; a7 j- U, H1 h9 H
pCanvas-LineTo(r.right,r.top); 2 M$ ~- N* `2 ~5 D* ^
} , q/ O. J0 s: o- |' ~+ w
, C; e7 N7 b2 o, Q4 u, a, G+ r. c- ~
} |