|
我们知道,C++Builder没有自画菜单,但可以调用API函数::SetMenuItemInfo()来改 5 _. g3 G4 a9 c( m x4 u$ |! v, B
变菜单类型,达到自画菜单的目的。下面的例子演示了如何使用自画菜单。当鼠标位于菜单
! p3 r8 r5 o/ @- X ?% I8 E上拾,菜单项将凸出来。(黑体字为添加的代码) + r! C% G& O( T6 ^
4 L6 V3 X7 e7 ]3 }" L
//头文件
( I4 t& r6 q/ H$ f3 O' J6 F0 x//------------------------------------------ ' T$ |2 I ]) H. u7 ]5 o3 Y$ S. t6 f5 @
#ifndef TestMenuH * h9 O/ L5 H5 f- ?
#define TestMenuH # J' z+ K- ]% [! R% W
//----------------------------------------- : o7 d) r* F- J! D5 M
#include Classes.hpp % l1 [9 M, Z3 J# |3 v* p- `
#include Controls.hpp
0 h" K/ ^7 J5 D& z" H1 b/ L#include StdCtrls.hpp
( _) n' {/ W/ e6 e$ ]- F! h#include Forms.hpp $ B7 _- a$ S, V* ^8 L
#include Menus.hpp//--------------------
- ]: H) u5 \" m5 F# H* i5 T* b9 v
- W ]7 g; l* u# c+ ?, G9 l1 Cclass TForm1 : public TForm ( h, v; l' M8 N
{ ( I0 b* |4 s; M P
__published: // IDE-managed Components % `1 l" ]; p7 j% ?: X/ R; m
TMainMenu *MainMenu1; 3 V( f" h) D2 k+ h
TMenuItem *aaa1;
/ M" |7 R. P Y7 \% DTMenuItem *aaaaaaaaa1;
; v' o/ u6 ?( F; o. q8 X* Z5 eTMenuItem *ccc1; 2 k4 t/ A e N7 f# ?6 |0 ]
TMenuItem *ddd1;
8 a$ m7 F7 E: I5 l0 p1 f8 rTMenuItem *eee1; 9 f1 o! j3 \. ?+ |0 g) ^- ?
TMenuItem *ddsds1; / h' e4 H; k$ j7 y$ x1 v j
TMenuItem *fcdfsss1;
9 h, W2 p- u$ H- f/ {/ CTMenuItem *dddddddd1; * u3 H" a, P3 L p* Q
void __fastcall FormCreate(TObject *Sender); " f# b' E) E8 c) f$ t
private: // User declarations
) V9 R% C/ C4 R+ j" B( @% a* Gvoid __fastcall Modify(TMenuItem *pMenuItem);
* s8 Z, j) ]0 X' Tprotected :
5 ?8 t8 E% {9 m9 ]& c3 w; T# JMESSAGE void __fastcall CNMeasureItem(TWMMeasureItem Msg);//增加响应消息 I6 a2 Q, F/ r0 t1 }2 v
MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg); 2 z4 a: f5 C; ]# R. A z) }
public: // User declarations 9 w; u8 Z: L2 b7 C- `% f
__fastcall TForm1(TComponent* Owner);
7 N, D' U3 r6 B) u6 h' P+ O% DBEGIN_MESSAGE_MAP//添加消息映射 1 N3 T- I) n, u q) l
VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);
1 b, E1 y( @& F. \' }. {VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem); . l& ]" p) p: r8 i: X/ h; K x
END_MESSAGE_MAP(TForm);
/ s9 S5 j% y1 O+ S" h1 l; r- u};
) W" R; {0 ?4 a1 O \//---------------------------------------------------------------------------
9 b K* m/ t, R. X- j+ }extern PACKAGE TForm1 *Form1; / l: B$ V9 N( B0 |, p2 C
//---------------------------------------------------------------------------
9 B% v# R! l l& k#endif
7 F- Y* |' M4 i4 f- X , O' x# G& h; L) F
//实现文件 ( o% l) x* f+ F
//---------------------------------------------------------------------------
* p, x) N, q% ]. ~% m5 s#include vcl.h * P% E# a# \ E! W) ?' J
#pragma hdrstop 9 P0 A% L' c5 @) l5 @# ?
" o1 A+ O5 W# ^5 g% i- K#include TestMenu.h
q# @! e2 Q: t" H5 g0 T: b( D) L//--------------------------------------------------------------------------- 3 k& c3 [5 S6 M) l! p% ?1 Z
#pragma package(smart_init)
: Z! S% r6 m ?6 ~0 e' ?#pragma resource *.dfm
5 @: ~2 l! x7 u K+ _- V2 mTForm1 *Form1; 1 Z: f7 _# z$ p" x# V3 E8 q
//--------------------------------------------------------------------------- 5 _: P& a. x9 `4 z/ Q+ P
__fastcall TForm1::TForm1(TComponent* Owner)
' M r6 e. {$ ~6 P" ]* P: P: TForm(Owner) 7 B! b1 V" Z, P( R1 I
{
3 \. J0 T% k8 D+ o; h} 5 F: ?' y+ \8 E( B7 q* s
//---------------------------------------------------------------------------
8 r- |8 g# |' H
; N, m" }# Z' yvoid __fastcall TForm1::Modify(TMenuItem *pMenuItem) + g$ A) G7 A/ s2 c& q8 |
{//修改缺省属性
1 m+ a, V8 S7 X; {for(int i=0;ipMenuItem-Count;i++) $ w% y6 E F% k& V+ f; o
{ 9 n( j# U( C* [! h
MENUITEMINFO mii= / Y$ g4 z) k/ E
{
5 h+ `% h( R7 Nsizeof(MENUITEMINFO), ; B6 d1 G( w% W8 S0 U! ^
MIIM_TYPE|MIIM_DATA ,//改变类型和数据 - w# b4 J) X+ r ?# B7 y3 M4 N
MF_OWNERDRAW,0,0,0,0,0,DWORD(pMenuItem-Items-Handle), . C$ F. J; ^; s
//把菜单项的句柄赋给32位数据
( r) p3 W- @0 J& E8 D! a4 M0,
) D) b: X% q" M8 a% d0,
9 _" i* Y- O3 r};
& E' x" _+ @8 n6 tif(pMenuItem-Items-Caption!=-)//如果不是间隔线 - |/ T/ N# `3 h& v& q+ L
::SetMenuItemInfo(pMenuItem-Handle,i,TRUE,mii);
2 L3 a; L$ {/ E1 kif(pMenuItem-Items-Count)//如果含有子菜单 + e- V* ^$ l/ E M7 {2 V
Modify(pMenuItem-Items); 3 D* {' h/ ~1 j
} 4 _7 }8 H( R$ u0 D% B. ]: r
4 @# g) y) f; y: e1 E9 c}
: e( {) c' y: X) e) B8 q/ [void __fastcall TForm1::FormCreate(TObject *Sender)
/ D/ `1 {/ v" W5 s( ^* v0 O{ " h$ j1 J' P: {! @' f
for(int i=0;iMainMenu1-Items-Count;i++)
1 G; M5 q5 i+ i& [6 \{
# c, h$ |1 L* D5 |1 w8 O+ mModify(MainMenu1-Items-Items); ; ~& y, m$ o- c) }4 v h
} ' w# F5 z* y- ^5 O7 ~; h9 `
DrawMenuBar(Handle); : M( }$ f. T& k6 ?. G
} % m; X$ X& U. _' K& s) b2 g0 U) ^
//--------------------------------------------------------------------------- ; v* i& v; G' c! {
void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg) % \8 o, P# Z9 l+ D
{//设置菜单大小
1 t/ f7 P! ?6 W$ H0 JTMenuItem *pItem=MainMenu1-FindItem(Msg.MeasureItemStruct-itemData,fkHandle); 5 x# R k$ x: z6 Q4 G5 _
Msg.MeasureItemStruct-itemWidth =pItem-Caption.Length()*8+40; 1 [8 t; q( z0 r' {1 c$ h
Msg.MeasureItemStruct-itemHeight = 20;
# j/ F) A, M9 o/ C} ' Y! J3 T& h* \
void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)
2 v9 g( A! n5 X7 P4 X- D( ~" A- I{//画出菜单 & R7 q! e: W" F* ?& u5 p
TMenuItem *pItem=MainMenu1-FindItem(Msg.DrawItemStruct-itemData,fkHandle);
2 e, ]' u u7 h! ?& X7 P% x2 {TCanvas *pCanvas=new TCanvas;
" T7 [9 L8 ?2 O* W* LpCanvas-Handle=Msg.DrawItemStruct-hDC;
7 a* S8 J- {) ]1 pRECT r=Msg.DrawItemStruct-rcItem;
4 |% Z! W( I$ o: r/ a0 ^; NpCanvas-Brush-Color=clBtnFace;
( K6 n0 _- G" d+ X* r3 ?5 rRECT r1=r;
* t6 g7 I f G* D/ E8 Q& D( Nr1.right+=1;
4 {* l2 K9 ?/ o( |7 hr1.bottom+=1;
* l G7 V8 J4 C* r! {r1.top-=1; : [) v e7 M; N7 [% ~" W I
r1.left-=1;
1 ~! H. i4 S1 M/ _% B* [pCanvas-FillRect(r);
" P* C) P+ s. [. g::SetBkMode(pCanvas-Handle,TRANSPARENT); : j5 N9 O# ^/ E9 a
pCanvas-TextOut(r.left+10,r.top+2,pItem-Caption); 6 R/ L5 ^( [, a C2 B" k7 F- K4 ?
r.right-=1; 1 v6 m& P; c; z. K" ]9 I$ U
r.bottom-=1; . j# w/ [. |+ k( X+ z
if(Msg.DrawItemStruct-itemAction == ODA_SELECT 4 u7 M% k" t8 P8 ^# Z* n
Msg.DrawItemStruct-itemStateODS_SELECTED ) ! ^0 `- n8 w5 M, \
{
% y# N% k( \6 S F6 r d2 cpCanvas-Pen-Color=(TColor)(RGB(255,255,255)); : T& W, J% s0 A% G
pCanvas-MoveTo(r.right,r.top); - T7 o- |9 @) R7 s. \
pCanvas-LineTo(r.left,r.top); 9 i# l% n; _' K1 L) h6 _
pCanvas-LineTo(r.left,r.bottom);
9 a: O- u3 c! s& g% I8 HpCanvas-Pen-Color=(TColor)(RGB(128,128,128)); 4 F& Z% J+ d& ]7 e( g
pCanvas-LineTo(r.right,r.bottom);
* \$ d$ o2 ^- D* ApCanvas-LineTo(r.right,r.top); 9 v+ ] L5 E" L, F( G; A& h
} ' X, O9 B3 j* n$ [& D
- K$ m# S( k3 D2 o' D) A+ S! ]} |