|
我们知道,C++Builder没有自画菜单,但可以调用API函数::SetMenuItemInfo()来改 4 r9 h( }: F3 a, H4 D' a
变菜单类型,达到自画菜单的目的。下面的例子演示了如何使用自画菜单。当鼠标位于菜单
/ t& }0 ?# G6 G2 R上拾,菜单项将凸出来。(黑体字为添加的代码) ) t" U0 s k' Y* Z m7 _" p3 [
$ P8 H* \/ x. n1 c! H//头文件 . |+ F9 [* S" Y7 u% J( ?
//------------------------------------------
8 n% y- K1 B3 x#ifndef TestMenuH
! q- M8 l+ F1 k+ r# n3 l#define TestMenuH ) s8 Y7 j; ~* W5 w7 T0 y+ `- }
//-----------------------------------------
W: R8 l0 \" p4 G" @' t9 m7 g#include Classes.hpp
, q. o! n( ?" d( H4 k) g+ L$ h4 Q; r#include Controls.hpp # p8 H+ x2 z1 g& I
#include StdCtrls.hpp 3 z: E8 o1 j3 B( `
#include Forms.hpp
/ d ~) e4 \- ?0 w#include Menus.hpp//-------------------- " v& b% Z$ r. p# \; M
% I' e! S* k$ F
class TForm1 : public TForm 7 K1 k% a. w1 }$ ]7 G% C8 ?
{
$ q; q1 q4 l! W, D+ Z5 h. R__published: // IDE-managed Components . l; d$ T& ^+ A* a+ F4 q
TMainMenu *MainMenu1;
2 ` s3 o" l5 z+ K& X; p- `; [TMenuItem *aaa1; : r/ v: k; N, M0 h( k( @
TMenuItem *aaaaaaaaa1;
/ P I* I: P: Q8 S4 H. G- `TMenuItem *ccc1;
. L9 f- J `8 u9 X: @& ]$ g4 \. b7 fTMenuItem *ddd1;
/ ?) s+ J! B" F- f( Z; |! lTMenuItem *eee1; " u# t. ]1 A( y- j5 w7 J s
TMenuItem *ddsds1; 0 y$ l* y0 k1 j; d w) {& k, X9 J1 }
TMenuItem *fcdfsss1; _0 x: A- T: O# ~
TMenuItem *dddddddd1; * o/ x5 B& a" |; `$ p' M1 y
void __fastcall FormCreate(TObject *Sender); , L+ I, o# D: U0 q
private: // User declarations 4 N; N9 I' s8 y, m& W1 ~
void __fastcall Modify(TMenuItem *pMenuItem);
6 D+ F% `$ y! U- R& d5 ~protected :
2 {$ o3 F1 a Z- E GMESSAGE void __fastcall CNMeasureItem(TWMMeasureItem Msg);//增加响应消息
/ K( M0 s& `: B; J) S/ ?+ RMESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg); 9 ]8 d/ u* P& t9 R
public: // User declarations - W% N" `; r2 K7 E# e, Y( C
__fastcall TForm1(TComponent* Owner); $ r! c& L d; g% r. c+ @
BEGIN_MESSAGE_MAP//添加消息映射
u& x) ~: h' o) b% wVCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem); 0 H' h7 z$ @+ w i5 e8 h
VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);
, M/ E; z1 K( q! x+ V$ G% ?+ \END_MESSAGE_MAP(TForm); k6 t1 R: {3 [) |, u
}; 5 f5 V! y9 i/ o z# ]: Z$ s+ n
//--------------------------------------------------------------------------- b& j* D3 v( N! u
extern PACKAGE TForm1 *Form1;
c& i L8 p+ w1 U2 E$ A//--------------------------------------------------------------------------- _4 _* S4 L. Y* y. @" }
#endif
# \( x: u# G1 }9 \- c" I; \/ ? ; x& P* A! ]* R1 ~/ Z/ @
//实现文件
# _) w6 [. `; H7 |5 u# a" @//---------------------------------------------------------------------------
. P$ k! K& _( q+ b. H/ P9 d9 [- H#include vcl.h
# J( X/ u h. n& [1 S#pragma hdrstop
( g' q J0 y+ t$ s6 s/ r
" |$ [ E: k8 J0 C#include TestMenu.h
! `" t3 a2 P$ m K& S//---------------------------------------------------------------------------
9 \0 [7 W7 C' f, g3 r7 f#pragma package(smart_init)
* D O+ i! J/ M+ {3 O& r#pragma resource *.dfm ( k9 |7 d. f. x
TForm1 *Form1; ~; h N. @) k
//---------------------------------------------------------------------------
; f0 y w: n) B+ i% q8 P' V4 ` _! X__fastcall TForm1::TForm1(TComponent* Owner)
+ s1 X3 J( [! x& F; X. X: TForm(Owner) 3 m" n+ P9 [2 m2 W f$ ^% O
{ ' b7 Y3 v3 h# S5 x K, V l7 C
}
4 x, o) q% o- Y1 X5 u7 e: p//--------------------------------------------------------------------------- 4 j8 K& e! p9 a: g
' ]# P* _9 M* R$ u8 D. a" M2 Ovoid __fastcall TForm1::Modify(TMenuItem *pMenuItem) ' N, i$ d2 {5 C
{//修改缺省属性 7 V9 ?$ }9 c) {( n8 ]& f
for(int i=0;ipMenuItem-Count;i++)
$ C4 O& r" b! w+ ?9 p& K8 R4 h$ x{ 4 U; c2 l; \; q
MENUITEMINFO mii= & F3 W3 {1 O+ R2 ^6 A/ F# \& X# A# \ Y
{
1 m$ [# r. T& p% f* P# Z$ psizeof(MENUITEMINFO), 3 L+ T# G5 Y) I8 P0 A
MIIM_TYPE|MIIM_DATA ,//改变类型和数据 ! ?* {; F' [$ S5 B8 |1 F1 }
MF_OWNERDRAW,0,0,0,0,0,DWORD(pMenuItem-Items-Handle), ! h0 h9 D( E/ a8 K
//把菜单项的句柄赋给32位数据
! B9 R+ v1 w2 x$ l& k7 }2 x3 B0,
1 t& l8 K9 h- {6 p0 T1 r& m0,
+ ~$ Z( ? ^, H3 @. w}; ( s U; n& w; O3 i
if(pMenuItem-Items-Caption!=-)//如果不是间隔线
# e. }' H: V. ? m" h: o::SetMenuItemInfo(pMenuItem-Handle,i,TRUE,mii);
: W7 N* h1 @4 J& K2 Eif(pMenuItem-Items-Count)//如果含有子菜单 * y, K- X: K# ?* J
Modify(pMenuItem-Items); ; Y% E- ?* i& F; x% T' C; N8 [
} ) I/ V, a. H7 C. c
! e& F& N2 U) [1 k& n
} * d$ G# t2 \0 ?0 b( b( q
void __fastcall TForm1::FormCreate(TObject *Sender)
4 z2 x7 s6 M# e4 A: n/ b# A) o9 t/ t{
5 i6 |! w+ R. G% |for(int i=0;iMainMenu1-Items-Count;i++)
3 W5 x8 Z( Q7 f7 j8 B$ {{
* [, L* q% Y. I% g, L* g! j( nModify(MainMenu1-Items-Items); ( r$ @9 I* @0 ?0 A9 G
} ; t; o: k7 p- w4 o
DrawMenuBar(Handle); X9 l; | n8 u2 z
}
* h/ P; T* P$ ]! U6 D+ U+ Q% @//--------------------------------------------------------------------------- / N9 ~% [) f8 x' x4 |1 V. J* Y
void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)
* [( a) }+ D- @3 }* M T- s H{//设置菜单大小 c3 |7 w' p" n: S$ J* _
TMenuItem *pItem=MainMenu1-FindItem(Msg.MeasureItemStruct-itemData,fkHandle); $ @. J4 i4 f1 q/ S& n/ r/ M! w8 D
Msg.MeasureItemStruct-itemWidth =pItem-Caption.Length()*8+40;
' [3 m' @1 ^3 a+ dMsg.MeasureItemStruct-itemHeight = 20;
' ?3 X3 N. r* S" t- D+ _}
$ I6 Y7 o3 r1 c( \$ {# b, ovoid __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)
/ b) m( I$ x' j: c" u{//画出菜单 - F, d! y7 l5 d9 F
TMenuItem *pItem=MainMenu1-FindItem(Msg.DrawItemStruct-itemData,fkHandle);
& j! _9 t* { hTCanvas *pCanvas=new TCanvas; * W" n4 ^6 J' B% F
pCanvas-Handle=Msg.DrawItemStruct-hDC;
% O8 _ U, b- A" G# CRECT r=Msg.DrawItemStruct-rcItem; 7 x6 j& e- D9 ~* y
pCanvas-Brush-Color=clBtnFace;
' c6 p( y/ r) V& A& Q8 pRECT r1=r; 5 c, ]) S7 F: J" x/ y- L
r1.right+=1; & W/ M1 ?0 q1 f- S( a( m( B
r1.bottom+=1;
8 C8 e/ l5 C- dr1.top-=1; # j3 M+ X$ K3 D4 M8 Q: ]
r1.left-=1; - `7 X7 x9 _$ x9 I6 m4 Z$ w
pCanvas-FillRect(r);
- y) L7 e8 r1 b7 s& D% ^0 @::SetBkMode(pCanvas-Handle,TRANSPARENT); ! w6 B# g7 G7 G) ~" r
pCanvas-TextOut(r.left+10,r.top+2,pItem-Caption);
! e* S0 y8 b, ?8 L% t# o5 Or.right-=1;
, w* X* s2 }0 r2 W: y) hr.bottom-=1;
$ x' w$ a! D: N2 m+ c* ~9 ?1 Lif(Msg.DrawItemStruct-itemAction == ODA_SELECT / i2 S) E1 k# e2 k) {
Msg.DrawItemStruct-itemStateODS_SELECTED ) 5 I3 Y6 q+ R. [
{
; @% b3 M; Z# v% B9 I. xpCanvas-Pen-Color=(TColor)(RGB(255,255,255));
3 G* x; f3 w8 Q) E" ApCanvas-MoveTo(r.right,r.top);
# P5 i; I% p- D# tpCanvas-LineTo(r.left,r.top);
4 Y r2 w" S4 m& ypCanvas-LineTo(r.left,r.bottom); ! W% {6 K- [9 r- j
pCanvas-Pen-Color=(TColor)(RGB(128,128,128)); ) {3 V5 l! K) F
pCanvas-LineTo(r.right,r.bottom);
K: c, M6 a; M) L# C: }pCanvas-LineTo(r.right,r.top); x0 [+ X% k1 I
}
9 m* f# n3 G! b0 h8 t
( F! u6 A! c3 t( c3 P Y6 M} |