|
我们知道,C++Builder没有自画菜单,但可以调用API函数::SetMenuItemInfo()来改 # n1 e" H' c' G; ]+ Y1 E4 ^$ V$ x
变菜单类型,达到自画菜单的目的。下面的例子演示了如何使用自画菜单。当鼠标位于菜单 & S# m8 f5 i5 g! z8 \9 s
上拾,菜单项将凸出来。(黑体字为添加的代码) 1 B* ]; ^% x5 ~- J- z% q8 S
$ P% N6 K9 w- E9 j/ r; A# u1 w//头文件
* g( B+ ?9 [- K$ _//------------------------------------------ : e! Q2 H( d: `2 E* o/ E! }
#ifndef TestMenuH
* @' r& r5 y" k! f) Z#define TestMenuH ! }7 ^2 q$ O' \8 b
//----------------------------------------- 7 E4 e9 r; \4 e$ w' N! B
#include Classes.hpp
& G q% B) c3 V" x/ a: [( ]& z- U( R9 H#include Controls.hpp , \& Y9 W0 x: F
#include StdCtrls.hpp
9 r, m- W' J* _6 F0 w L E& ~#include Forms.hpp . g! U/ N: |6 q
#include Menus.hpp//-------------------- $ m" P1 {5 ~3 m) `+ S
U! x+ j- l% W+ s; W
class TForm1 : public TForm
0 |7 c' l9 W5 x! O{
: M f& R* C3 @4 X' s4 w, o__published: // IDE-managed Components
" b: u. u1 v$ B0 E4 v9 E; X6 @. D4 tTMainMenu *MainMenu1;
$ N( v! o4 y* L c6 O/ jTMenuItem *aaa1;
. [5 ~9 w' n& X/ i2 y$ M( ]2 gTMenuItem *aaaaaaaaa1;
$ Q1 F7 t' {1 D/ R8 N/ p- oTMenuItem *ccc1;
/ r: C! I# U/ w) {' e$ RTMenuItem *ddd1;
% B- A' e3 D( O: J& l" T! pTMenuItem *eee1; 5 j& r9 T4 n9 n4 H A
TMenuItem *ddsds1; : }. U) g: c4 m5 Y* j; A5 Y
TMenuItem *fcdfsss1;
% p* z0 V4 ^! JTMenuItem *dddddddd1; 8 ]& o6 w n: U) B
void __fastcall FormCreate(TObject *Sender); 5 ^1 `4 x& g& D$ i
private: // User declarations
0 ?. {8 I+ d C0 m( Pvoid __fastcall Modify(TMenuItem *pMenuItem);
7 u; c$ y" s+ {) K# Wprotected : 0 e3 g m. z: S3 P7 @" D
MESSAGE void __fastcall CNMeasureItem(TWMMeasureItem Msg);//增加响应消息
- O) N0 M5 Z6 K3 HMESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);
" J9 v8 T& U% s" mpublic: // User declarations 6 L. e l8 j5 `8 V
__fastcall TForm1(TComponent* Owner);
& r- [5 `5 t- t, R* vBEGIN_MESSAGE_MAP//添加消息映射
5 l* c% Q) V. l8 W$ g- IVCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);
' k! E* [; X4 R3 V+ JVCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem); 8 u8 A" Q8 [- M# A) W! f3 s
END_MESSAGE_MAP(TForm); $ _4 b8 a9 I' o; J) z2 B6 a2 E0 F
};
% K- p/ P: u. s, d6 F4 l//--------------------------------------------------------------------------- 6 O1 s8 F) s: B# m) G0 h
extern PACKAGE TForm1 *Form1; 1 I6 o$ T$ h7 r' L' [9 d
//---------------------------------------------------------------------------
3 j' \( Z, Y% R#endif
; P5 J; _. x$ o; f* T0 j
m" H1 @3 S8 B" T- P//实现文件
+ O* b- K4 G" T: T//---------------------------------------------------------------------------
' u, H; C5 i6 y) ^3 C#include vcl.h - u# r8 Q0 T9 t) i9 ?
#pragma hdrstop
% p Y y; {2 A9 e ; P' R; b# k8 c5 G5 ]/ x
#include TestMenu.h
4 z. W, L0 {& m6 V//---------------------------------------------------------------------------
. K- W/ x8 G) `/ t8 X' O5 W2 x& ^, _#pragma package(smart_init)
4 [1 L4 A K5 ~( d/ @#pragma resource *.dfm
5 D4 ], P7 I, Z+ r$ b0 S B) CTForm1 *Form1;
5 y* [4 N) K1 G _//--------------------------------------------------------------------------- & t' `$ a. c; O6 B* b3 ?+ ~# |
__fastcall TForm1::TForm1(TComponent* Owner) ' C& z3 W1 x; m
: TForm(Owner) 9 W$ q* o. j& A8 H/ t3 S
{ . B. t2 a5 l# |! B/ p2 E2 C
} - `2 B% F, }* Z
//---------------------------------------------------------------------------
( u7 S9 e; F$ w+ S& ^* J/ r( U" X 9 j6 \0 q0 R. ?( M1 S5 P8 `
void __fastcall TForm1::Modify(TMenuItem *pMenuItem)
6 ]7 k: F- h: l- I0 u{//修改缺省属性 # U4 S) c; u& H7 j+ _$ w3 t
for(int i=0;ipMenuItem-Count;i++) ) |( _# \) C1 g$ ]3 {
{ 0 K4 \+ t* A1 P. g2 Y
MENUITEMINFO mii=
# z6 C0 L5 W- o1 s( j& I/ m{
( `) Z8 N: P' N( ?6 O, Jsizeof(MENUITEMINFO),
6 K! g6 I& \' R& o. lMIIM_TYPE|MIIM_DATA ,//改变类型和数据
7 n" J% v: M1 B: b' KMF_OWNERDRAW,0,0,0,0,0,DWORD(pMenuItem-Items-Handle),
! S# N8 M+ M" M4 \( B* ~//把菜单项的句柄赋给32位数据
! N0 |, c4 h. K! `0,
8 z& E" _) N5 G9 y3 ~. ]0,
4 ?3 D9 ~ G, ^2 o. C};
5 T& Q J' Q, d7 u' v gif(pMenuItem-Items-Caption!=-)//如果不是间隔线 5 ^/ I/ Z2 P( {
::SetMenuItemInfo(pMenuItem-Handle,i,TRUE,mii);
, \' y9 |1 B; G1 ]; }- Fif(pMenuItem-Items-Count)//如果含有子菜单 7 Z" T* j: ^2 }4 G
Modify(pMenuItem-Items); & x% n) g% I/ d5 u2 l7 z7 M
} , ?0 I* c& [8 j0 V" T3 ?
* |* c9 l3 i0 {( j7 ~8 v
} ' o% }/ r C$ [5 u1 \4 W: N) v
void __fastcall TForm1::FormCreate(TObject *Sender) : l G9 Y$ ~1 ~" o( l. C; `
{
5 @& T, K# `, `' zfor(int i=0;iMainMenu1-Items-Count;i++) , t0 H3 s5 Q2 a& y2 w
{
* `4 L6 p8 Z5 z/ T! zModify(MainMenu1-Items-Items);
% s/ f* c3 R! t" ~ P1 E9 ^}
! H! V/ L* _0 ZDrawMenuBar(Handle);
/ Q) G8 n4 [! |: E}
- V, W8 x3 F5 B% q) \, I# }//---------------------------------------------------------------------------
8 v) Z5 P, l; ?- z# Svoid __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)
. U2 y5 p! r l7 c& [# ?{//设置菜单大小
8 N7 V6 B6 ]" e' N1 z9 G! G% cTMenuItem *pItem=MainMenu1-FindItem(Msg.MeasureItemStruct-itemData,fkHandle);
- v& i$ V& I7 B# b0 sMsg.MeasureItemStruct-itemWidth =pItem-Caption.Length()*8+40; ; _ r: H4 f$ D& h! ^
Msg.MeasureItemStruct-itemHeight = 20;
7 d7 T7 I8 |/ d} , a; {5 Q4 |8 `
void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)
. x4 H" _* Y0 _/ d2 B$ b{//画出菜单 * v' V( J0 w8 H3 n( k
TMenuItem *pItem=MainMenu1-FindItem(Msg.DrawItemStruct-itemData,fkHandle); & i& D8 B6 \0 @% S
TCanvas *pCanvas=new TCanvas; - c1 |1 V6 \' h$ E
pCanvas-Handle=Msg.DrawItemStruct-hDC; $ {* ^& j# d f
RECT r=Msg.DrawItemStruct-rcItem; 1 j& c( p! U( \9 i, l7 ~
pCanvas-Brush-Color=clBtnFace; q% Z9 F" ]; p% D& k
RECT r1=r; 6 X3 J& |5 a9 m. o$ S5 L% |
r1.right+=1;
* t2 s* x8 Q) m6 U7 Cr1.bottom+=1; 6 W: X( k% D1 U$ f% }/ d
r1.top-=1; ( J- N/ o% e0 j1 h1 r/ ?& A! q4 ?
r1.left-=1;
0 W1 H1 k9 D3 k) w. L) M6 {# f0 WpCanvas-FillRect(r);
* J" A' u1 J' Q( d" `::SetBkMode(pCanvas-Handle,TRANSPARENT);
) W @4 o" b" x4 P* t6 dpCanvas-TextOut(r.left+10,r.top+2,pItem-Caption);
/ S$ g- q5 N& x `* i: Z1 br.right-=1;
4 S6 y i; a- Z/ c. ~r.bottom-=1; " B' [! G) a* Z
if(Msg.DrawItemStruct-itemAction == ODA_SELECT
) e" Q: N- ]6 l% y( UMsg.DrawItemStruct-itemStateODS_SELECTED )
+ z7 X( r) `' |{
$ \5 f6 u, \8 y5 xpCanvas-Pen-Color=(TColor)(RGB(255,255,255));
- K; x, O/ C) {% X; lpCanvas-MoveTo(r.right,r.top);
: [, h+ b6 M c; ~% Q( }: YpCanvas-LineTo(r.left,r.top); 6 G+ u! s, D% a( L
pCanvas-LineTo(r.left,r.bottom);
' z7 ?3 k# i" V% Y; w+ V/ LpCanvas-Pen-Color=(TColor)(RGB(128,128,128));
5 P! ^# x# K" _1 w' U& [pCanvas-LineTo(r.right,r.bottom);
3 r' E2 Z6 ^" _* X9 b0 qpCanvas-LineTo(r.right,r.top);
, l5 W P# o3 e3 P) b7 C}
& F+ y! k7 [: E8 I) `& L( @7 Y/ G8 a8 V3 O: P
} |