数学建模社区-数学中国

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

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

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

O# |$ P& ~7 e! j% S

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

, B: U* F# _+ c- r+ {9 [: e* A

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

4 a6 r1 a5 |3 E, r

x! a" ~9 \+ d: M# I4 e

//头文件

& Z/ A$ e8 P0 [4 _2 i, `: W

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

$ b* W. | [1 w9 C1 S3 ~, l

#ifndef TestMenuH

8 N3 d! J( g; S$ \) _7 f! G

#define TestMenuH

. J3 J* [/ _, `& `+ ]. l4 L* M

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

, D" Z5 |- Z; P* F9 M' Z: z7 K: v

#include Classes.hpp

% p3 A7 C9 Q& y9 h

#include Controls.hpp

: o% w f1 X# f- q1 I! ^" Q, |2 {

#include StdCtrls.hpp

* I5 I3 P' \1 L* M. {

#include Forms.hpp

) _3 c, v6 g; h! n1 K

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

# ~* j& j/ B8 f# F

# K* p. Y+ b% G F* d$ s: `2 E

class TForm1 : public TForm

% Q3 v, C- v# [

{

1 ^ G$ M I0 U& q2 l

__published: // IDE-managed Components

0 r% P. t. l0 L/ A" V5 C% j

TMainMenu *MainMenu1;

2 H" m5 I) @* S

TMenuItem *aaa1;

. {( S6 ]6 A9 ~4 G0 |; C

TMenuItem *aaaaaaaaa1;

) m0 n- W" [( M7 d' U% \

TMenuItem *ccc1;

2 s; q2 O( `8 r" n

TMenuItem *ddd1;

# y. Z: R( _4 _/ ?2 y( y9 c, k

TMenuItem *eee1;

- p/ C, q5 n4 `0 k7 H! n

TMenuItem *ddsds1;

) S# K- D Z/ \. p5 O7 ~( A

TMenuItem *fcdfsss1;

' {" e% v0 d8 _4 D9 ?; R; @

TMenuItem *dddddddd1;

) r, D' f( d9 S) |

void __fastcall FormCreate(TObject *Sender);

& G9 N# v2 E1 j4 S5 r

private: // User declarations

0 M3 o# B0 }% N- w& h

void __fastcall Modify(TMenuItem *pMenuItem);

0 L' S; s3 Y u

protected :

5 K, |# b" T" u( I) c2 O

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

: ^5 ]8 Y; b* q0 _/ I

MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);

2 ^# o6 }, }* `4 _

public: // User declarations

' F1 R A2 r: N4 ~5 P; m7 z5 z

__fastcall TForm1(TComponent* Owner);

5 i' n& q% q3 |: d: z

BEGIN_MESSAGE_MAP//添加消息映射

* y9 {' `; r) U6 g6 X

VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);

! g2 f3 k2 Y7 { V4 W0 S& ~

VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);

. @- x) A r0 A# e5 S: R! O$ \

END_MESSAGE_MAP(TForm);

* P" e3 a0 W2 h: q+ }

};

# y' e9 o q' n" r

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

( e' e1 R( I4 s2 [# Z r

extern PACKAGE TForm1 *Form1;

$ ]9 V4 _# p# V. w

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

# }8 r9 N/ N1 j4 G$ j- b2 Q

#endif

1 O- o7 s; \3 I9 z

: U" D* H+ W, S; i0 X

//实现文件

! y# f. J' j6 o! v# m: g

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

4 Q' O Q3 G' y

#include vcl.h

; c6 s+ O. f. ?

#pragma hdrstop

9 v5 _* l/ w y$ ^6 ^6 X& ]

+ T& K# H) c5 {$ z' z/ X& [

#include TestMenu.h

: u( ^8 h( d. ?% n3 y* N2 R

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

1 D/ u6 d8 Q* h% z

#pragma package(smart_init)

, n; x1 C& c0 x5 d! Z

#pragma resource *.dfm

6 g8 c5 `; Y9 d

TForm1 *Form1;

' z+ s) a0 ], V

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

# u( m8 A, T! h

__fastcall TForm1::TForm1(TComponent* Owner)

, T, f. `7 l# k2 G

: TForm(Owner)

3 ^3 w- J, A Y% j

{

4 X8 g" S) Q7 }5 p, ?

}

3 N3 h9 e+ R8 z" f) N. h

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

: [" C6 q9 f+ B; B- U. R, l4 m$ I

) O- a! C+ s$ ^

void __fastcall TForm1::Modify(TMenuItem *pMenuItem)

! D& J8 o% r9 Q; p! L6 z# x

{//修改缺省属性

0 K0 T( N$ F9 X8 t- g

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

- a. K% M0 a( g- I1 Z

{

1 I2 J1 `3 W2 M2 d. k+ t7 z

MENUITEMINFO mii=

4 k7 ]6 `0 E. g0 ?) @+ q/ Y) d) }

{

" Z9 @2 Q4 m& u4 q; w

sizeof(MENUITEMINFO),

; P! R3 R0 `; Y+ s7 e; H

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

- o# G/ g- D( B, b

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

3 g4 Y$ H4 {3 h

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

% n _# S, a$ Z

0,

; z8 x b r3 U: E$ W

0,

; Q$ f- \6 ^; Y; ~* c) d5 G

};

* `7 W5 H2 u; c: Y

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

$ Z$ `. y0 W7 d: l0 h

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

4 K w, x3 X" C; `! Z6 Z

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

0 E. H9 Y+ D4 E4 u

Modify(pMenuItem-Items);

! j2 a3 y& Y! {0 Z% P1 Q/ n" V

}

0 D: |4 m3 o- r' A! K. c1 e) H

7 c; L6 h# H2 D; I& h

}

$ o; L0 K3 f u9 Q# l1 G3 g2 T

void __fastcall TForm1::FormCreate(TObject *Sender)

0 z( d6 W# a# G! d* r

{

- c& w4 t3 a* K6 v; |$ {* _

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

) @3 R- E- V1 S4 B5 V" b

{

; ? I% A% I4 f

Modify(MainMenu1-Items-Items);

6 Q$ \6 S" q$ T( w3 N( [- ] B: W

}

2 l" t4 @% g% V0 R& t* o1 W

DrawMenuBar(Handle);

% L) u. Q! @& j$ B

}

; o. D6 V9 w$ p8 h, w0 ?

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

( A3 D4 E* f8 R+ Q, x

void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)

& h, Q0 a, a5 V$ X, P* ~) z

{//设置菜单大小

. p% g9 x; @% P

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

, _+ a& ~, J* H/ n4 M

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

, ^+ J( F. K% G7 `6 \3 d

Msg.MeasureItemStruct-itemHeight = 20;

( v* i+ C) j6 N' ]

}

+ E5 t( U5 K* o1 C5 K7 w

void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)

8 \8 t% r$ Z4 ] y$ b0 D

{//画出菜单

) j3 b/ n8 X5 d

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

4 z3 `, D# @8 @. V

TCanvas *pCanvas=new TCanvas;

9 C0 P3 D* a" w( Q' H0 [

pCanvas-Handle=Msg.DrawItemStruct-hDC;

$ i& D* {, k9 h4 I$ g$ F+ H

RECT r=Msg.DrawItemStruct-rcItem;

, j* h3 r/ l# ^1 v* D& P; F, Y& ?

pCanvas-Brush-Color=clBtnFace;

2 }) a9 v" S% @* X: p k( P

RECT r1=r;

' C- c# ~5 k2 a. j

r1.right+=1;

) Y( ]- E( A( |; A o# M8 \

r1.bottom+=1;

2 c6 ^" f( W" V6 o4 E+ C1 }

r1.top-=1;

7 B/ o5 B# \8 ~

r1.left-=1;

! V5 i$ o1 `7 R- {4 A9 z

pCanvas-FillRect(r);

r0 J' m1 d: ?1 C0 P. H- R; I

::SetBkMode(pCanvas-Handle,TRANSPARENT);

/ l6 G- ?, \, p( f' Q6 `3 I: G

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

! e% M, }, c u; F7 ~4 Z, W5 X2 ~8 W# G

r.right-=1;

: d Q6 N! m0 h, R5 R

r.bottom-=1;

8 A; P) o' |1 z5 X5 ] y D8 _

if(Msg.DrawItemStruct-itemAction == ODA_SELECT

4 q8 R" \0 t2 Z% F& Y3 o

Msg.DrawItemStruct-itemStateODS_SELECTED )

0 n- x$ m* r: m5 ~) V8 H

{

0 ^: w8 Z; C9 B" L

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

2 }1 _# X* ]5 P

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

; P9 m ^- N1 w3 t' g* J& F: B

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

) E& y+ T! j8 n) j# ^' Z \

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

2 ^& E7 A' M+ t# {& m: F

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

( E; S% Y; F$ u: w$ [2 ^

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

& l# k; Y$ V6 a! L8 X; r. e3 b- q

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

4 o; ~: T) o, i( p7 d

}

- Y5 P K) y3 N$ l 3 q# L5 `3 C$ p8 ?. N

}


作者: 凼凼    时间: 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