数学建模社区-数学中国

标题: 如何自画菜单? [打印本页]

作者: 韩冰    时间: 2005-1-26 12:16
标题: 如何自画菜单?

  我们知道,C++Builder没有自画菜单,但可以调用API函数::SetMenuItemInfo()来改

3 E: n. l# H% a. W

变菜单类型,达到自画菜单的目的。下面的例子演示了如何使用自画菜单。当鼠标位于菜单

) _$ Y* m2 {% Q/ a3 \8 w

上拾,菜单项将凸出来。(黑体字为添加的代码)

! R) J$ S; Q! ]/ E7 t

8 U1 _# m( B' z# s: ^) y1 g

//头文件

9 ^' ^1 K2 Y6 E) L0 q& w; g: [

//------------------------------------------

' x& X; t$ }' R! Y

#ifndef TestMenuH

d) l, \7 _4 `0 N0 e

#define TestMenuH

3 z) r/ u, O' b0 L# C$ ^

//-----------------------------------------

+ c: y; q5 u* M" o4 i! O: [

#include Classes.hpp

2 d, [( x4 C) V! q

#include Controls.hpp

2 o8 G$ V- ~5 G" E

#include StdCtrls.hpp

5 g/ G! e g; f L

#include Forms.hpp

: Z/ n0 L- N3 {3 @

#include Menus.hpp//--------------------

& z0 @# z$ T) O5 H7 F

) K! e% k& N+ }% X

class TForm1 : public TForm

2 X/ P8 z$ Q# J) I

{

! D1 H# w( _1 D7 f+ \% S+ Z# Y

__published: // IDE-managed Components

* A3 d; }& g/ A4 w+ y' _

TMainMenu *MainMenu1;

% m. n" t" x0 @' l4 R

TMenuItem *aaa1;

9 K1 `4 x* ~* a" b3 J2 R

TMenuItem *aaaaaaaaa1;

: o- j7 ^' _- [& i: O

TMenuItem *ccc1;

" U6 {3 u/ l9 @3 Y4 u

TMenuItem *ddd1;

q" m# S# k/ M0 f6 R6 M

TMenuItem *eee1;

% `& ?" \0 m8 N

TMenuItem *ddsds1;

+ @: U1 `& n' u" c; @9 d

TMenuItem *fcdfsss1;

' u2 T$ |6 Z% Y/ n$ l

TMenuItem *dddddddd1;

2 m9 y( p% w! D7 Y( Q: h( K

void __fastcall FormCreate(TObject *Sender);

2 k$ k7 D2 U0 s$ I: ~( i) e L" r( o( h

private: // User declarations

- l6 k, ?3 p# L

void __fastcall Modify(TMenuItem *pMenuItem);

2 ~9 [3 N% g8 c) B1 \

protected :

( |* m) L9 d# q" @1 | Y! Y

MESSAGE void __fastcall CNMeasureItem(TWMMeasureItem Msg);//增加响应消息

& m$ S+ k; e0 W% i# r# _# M I' G) A

MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);

/ I, `' C' ]+ o3 |- W- }* _

public: // User declarations

6 V' W$ [- J7 K3 R) w

__fastcall TForm1(TComponent* Owner);

' K: u, Y) o0 t o/ T

BEGIN_MESSAGE_MAP//添加消息映射

8 B' u7 I" ?7 n" _6 r3 d

VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);

: y+ ]; m" b* Z0 ~4 a0 y

VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);

2 M4 d. F/ {3 N, w- x2 I4 _) r

END_MESSAGE_MAP(TForm);

1 l4 m% w0 ]6 J

};

( h5 |# E8 w9 ~! g2 W

//---------------------------------------------------------------------------

8 Q. m8 l7 h, ^8 _

extern PACKAGE TForm1 *Form1;

/ N9 K* [% V" Q0 y8 @

//---------------------------------------------------------------------------

: c+ g& B$ u% e4 A q

#endif

K+ |% k: U7 A& v7 W

1 q7 |" a1 \ J! |

//实现文件

U8 I6 K4 S! |

//---------------------------------------------------------------------------

, r& Z* @+ K4 I, A7 C: a7 n4 T$ f

#include vcl.h

0 Y) F* z1 |; g+ x: R$ \6 d# U

#pragma hdrstop

% h6 v3 b/ T/ ]4 l+ I$ [

; b& M( `0 L/ p

#include TestMenu.h

& n1 ]" r: v& y

//---------------------------------------------------------------------------

* F) \5 z/ h& c: n, c n; I

#pragma package(smart_init)

9 S7 l/ x; Q% x6 P

#pragma resource *.dfm

) U: H6 T* O8 d; `

TForm1 *Form1;

& U5 C% {3 a& ]$ K8 F, X; k

//---------------------------------------------------------------------------

3 K+ q, ], b$ h; b: M- f: o

__fastcall TForm1::TForm1(TComponent* Owner)

, z" A! @/ }! _( H

: TForm(Owner)

G' h9 x9 l% ]' O5 S

{

% G7 j4 U. B. O2 E% D7 W

}

+ g( j! p* Y) l# s* i. p9 r

//---------------------------------------------------------------------------

0 W7 Y. ~0 d( @3 |2 k6 L7 m

( R3 ^ U* N7 S! T0 B) }3 f( u

void __fastcall TForm1::Modify(TMenuItem *pMenuItem)

* T$ k, Q1 D# e4 z4 ]9 r

{//修改缺省属性

- l3 U$ K6 B. H' p# B6 F& Q! L

for(int i=0;ipMenuItem-Count;i++)

( o- ^1 I2 R! S. T: I" {) \1 a; v! H8 v

{

; \: J x# _, V, z

MENUITEMINFO mii=

! U& t4 Y3 r D( }1 Q

{

; ^! q( O: m4 ~6 E7 V' u

sizeof(MENUITEMINFO),

' l t6 A; w3 \* Q9 O: d5 u8 I6 t

MIIM_TYPE|MIIM_DATA ,//改变类型和数据

3 P& ^. w) b" L, |0 T8 p# d/ V+ t* X

MF_OWNERDRAW,0,0,0,0,0,DWORD(pMenuItem-Items-Handle),

1 O% o2 ]) X8 k V: v8 e @1 y9 L

//把菜单项的句柄赋给32位数据

7 ^! a' b& H- f9 @ o- `* L

0,

$ h% ]1 K6 h, `# E% Q, w. O

0,

& \! P z/ p/ A2 S2 Q3 ?

};

" M) e e c+ S, J

if(pMenuItem-Items-Caption!=-)//如果不是间隔线

9 { _2 F& O" c1 `2 I A/ h

::SetMenuItemInfo(pMenuItem-Handle,i,TRUE,mii);

% v. L) R; X [1 q& S: E; F

if(pMenuItem-Items-Count)//如果含有子菜单

7 M5 u& _4 d0 c1 E7 m1 R

Modify(pMenuItem-Items);

. H' r1 z8 o/ R6 Z( T

}

* [: s3 `) g) e' ^, \

5 A. c$ h! ^* @) q. m; P# A6 E

}

- v# k j/ V/ l A* t

void __fastcall TForm1::FormCreate(TObject *Sender)

& f7 u5 [! g; M2 H! K

{

, a1 n: o3 e0 z

for(int i=0;iMainMenu1-Items-Count;i++)

% H. \& N1 \- T! G! e2 t" g

{

# @, k% m' d$ b7 r2 o6 Y+ ^ x

Modify(MainMenu1-Items-Items);

& p# {6 [4 W# k1 e1 l

}

8 a( _- R$ e$ y% ^; p8 n/ e' i( h

DrawMenuBar(Handle);

& D+ m& Z$ q+ k" l6 S

}

- C4 K) D/ Q, U/ d Y0 H

//---------------------------------------------------------------------------

' n% w/ z5 z& i

void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)

0 U b! \; A' t& C% c2 R v- d

{//设置菜单大小

$ n# P+ M& R3 ~! {) p# Q

TMenuItem *pItem=MainMenu1-FindItem(Msg.MeasureItemStruct-itemData,fkHandle);

- {: A r5 n' c* X/ H

Msg.MeasureItemStruct-itemWidth =pItem-Caption.Length()*8+40;

) R: J9 }: W8 u, c. W

Msg.MeasureItemStruct-itemHeight = 20;

. a" {+ |/ x( Q; ^3 k$ }

}

8 i( a2 L7 h+ c) y9 _

void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)

3 Q- w, e8 i% O# M* u

{//画出菜单

8 p2 O: ~ J' `4 H& s

TMenuItem *pItem=MainMenu1-FindItem(Msg.DrawItemStruct-itemData,fkHandle);

8 ~: j% ~' R) l3 B* ^+ k0 `0 @

TCanvas *pCanvas=new TCanvas;

: ?1 U/ y: w5 Q8 Q: b8 {% v/ Q

pCanvas-Handle=Msg.DrawItemStruct-hDC;

. b" B) H" v/ d$ R

RECT r=Msg.DrawItemStruct-rcItem;

4 j$ [# |4 W7 J0 i3 N

pCanvas-Brush-Color=clBtnFace;

" e. O5 P. q$ v( L: J! i! ~6 I& W6 G

RECT r1=r;

. _7 f$ e" G# `) e. a+ y

r1.right+=1;

/ P/ j3 f& L5 c8 q& m

r1.bottom+=1;

& Z; v |9 S {& L7 ~

r1.top-=1;

4 E* a6 Z" n7 z* S

r1.left-=1;

! Q8 ?3 J, b" b0 \# V: B

pCanvas-FillRect(r);

$ ^- J! _, X: b' r, s6 l

::SetBkMode(pCanvas-Handle,TRANSPARENT);

: D9 h2 E$ X4 L: v6 o

pCanvas-TextOut(r.left+10,r.top+2,pItem-Caption);

) Z0 g, B) ]3 H2 i6 o$ Q

r.right-=1;

2 k7 _- M- G( ] W

r.bottom-=1;

# z$ V2 t! V- {0 j6 k: n/ {: D

if(Msg.DrawItemStruct-itemAction == ODA_SELECT

7 ?8 ]" ~6 Y' p' U

Msg.DrawItemStruct-itemStateODS_SELECTED )

- \* b9 X% W% V& X

{

0 l3 E& _( m! d3 N; D+ k! N8 @

pCanvas-Pen-Color=(TColor)(RGB(255,255,255));

8 r1 o/ r1 y, K& v; j

pCanvas-MoveTo(r.right,r.top);

2 M( [4 c" P) b

pCanvas-LineTo(r.left,r.top);

; Z. ~1 A5 [* i. W! [: T- B* V! y

pCanvas-LineTo(r.left,r.bottom);

9 p! P4 r+ o. P: A9 |) @

pCanvas-Pen-Color=(TColor)(RGB(128,128,128));

+ L1 ~ w1 e5 q! U

pCanvas-LineTo(r.right,r.bottom);

$ f* i, q; I1 F; s$ O* K u. N) B

pCanvas-LineTo(r.right,r.top);

6 ]7 C* b! y) O2 ~ |

}

/ K; P/ A: i! i 8 O: Z) b+ G$ w% a& J5 w

}


作者: 凼凼    时间: 2012-1-19 17:31

作者: Z7XOB    时间: 2012-1-21 13:58
可以研究一下 !!!!!
作者: lynli    时间: 2012-2-1 18:54
这个不错。。。
作者: nishhao    时间: 2012-2-3 08:09
看了,感觉不错,谢谢您提供




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5