数学建模社区-数学中国

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

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

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

* F6 E N; I* |

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

7 Z0 w3 X3 }1 G T D8 N0 A6 c

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

8 H2 _' n6 n1 v2 m' C

, j4 V- Y7 q' z, J, ]

//头文件

/ U0 e2 j) I. x) u) w! M

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

3 B% Q& Y! U1 g

#ifndef TestMenuH

' }: p. c* |. _7 v' Y" ^+ M* F

#define TestMenuH

9 N- c# {* z7 ~4 b0 P& m4 b9 h

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

" }: P. `2 O. v7 Y) [8 V; N

#include Classes.hpp

! [3 @! C7 o, u; j, x0 }

#include Controls.hpp

! c1 d3 o- @" S9 V) Q

#include StdCtrls.hpp

3 w8 x% e, H1 |6 h4 f

#include Forms.hpp

1 z6 V: I7 P0 \ E: G5 p

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

6 U6 w0 s/ ^) F; U% M0 j: O) \

. N+ f$ h. G9 J* a9 P% @3 Z! o# L

class TForm1 : public TForm

" E$ g- d, \; t0 S: S9 h! e* o. E

{

* f$ P; o' P" \+ A# U: Z

__published: // IDE-managed Components

: w( {; f, C, P& t. D3 x

TMainMenu *MainMenu1;

( C" V% r: u2 f O" p0 v

TMenuItem *aaa1;

3 X! ^% E Y2 T0 S6 F

TMenuItem *aaaaaaaaa1;

7 ` n* y& d& F" c: W

TMenuItem *ccc1;

; t$ P% h# ]% } j8 L# Z1 ?" f2 Z

TMenuItem *ddd1;

2 C- t0 K: ]! k" x

TMenuItem *eee1;

, V7 u; d) a" h6 M9 M

TMenuItem *ddsds1;

& k* V+ \- W' l2 T* P% N6 L; W+ s

TMenuItem *fcdfsss1;

) R2 x5 `& h# {9 m2 x1 e

TMenuItem *dddddddd1;

3 Z. t# E* s5 F5 r

void __fastcall FormCreate(TObject *Sender);

) t1 S8 L6 `) N$ W

private: // User declarations

8 O( a4 h y( i! }3 }+ E

void __fastcall Modify(TMenuItem *pMenuItem);

6 z" H; i G- E, o5 ]

protected :

/ [& r8 S: N. b

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

9 L/ t0 K7 |0 [+ K, K

MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);

/ U6 k+ E: y0 D( O9 k

public: // User declarations

7 Q0 H5 w/ y- g7 W5 Z+ \. \5 g

__fastcall TForm1(TComponent* Owner);

4 @! g( D! a- g7 ?' h8 N

BEGIN_MESSAGE_MAP//添加消息映射

* n" ?& O- a- ~6 k9 w- Z8 H

VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);

7 D S7 X" d6 R& Y8 n

VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);

* k& p2 _8 x& f

END_MESSAGE_MAP(TForm);

1 w1 T( z3 o, b' w# Y) w& z

};

( d- [9 D9 `7 E9 r) b/ z

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

9 K% }: r8 ]5 b

extern PACKAGE TForm1 *Form1;

' O$ r! E4 _8 h2 s- h

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

; I. r. B' a7 L- T0 t* j* l

#endif

7 T( X1 i4 R. w# \6 e

8 z; Q2 l) C1 i

//实现文件

& Y$ n. R$ f: F

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

6 q4 k, I$ e# L. b. ]4 `

#include vcl.h

: C4 l5 H( ^& C3 [- C# L2 a% o9 r

#pragma hdrstop

8 U/ D: R; M6 B

2 v+ H0 L2 B) K$ u

#include TestMenu.h

2 P0 v/ F" M# ]

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

, M2 F4 V! i0 m4 `; E% p7 ]$ l

#pragma package(smart_init)

, p l4 G/ P. ~% K

#pragma resource *.dfm

9 J1 ?! w J5 i* Y# r7 t1 V

TForm1 *Form1;

# f( w0 L# A# ~

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

7 K! W( a$ c3 N3 O8 Y" P1 O, o

__fastcall TForm1::TForm1(TComponent* Owner)

, o5 @- w& U8 n, ]# d$ t9 ?

: TForm(Owner)

* D5 ~( q* }' q9 ^7 T

{

! j9 q7 s% U4 f, I |8 x0 E$ n

}

" C8 T. @0 |" Y6 o8 ^9 ^) l7 F% H( E

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

4 ?1 z$ ?$ e" |; U" t+ D

; Z8 ^0 a/ Y V1 y

void __fastcall TForm1::Modify(TMenuItem *pMenuItem)

! ~2 o# j: s: N+ u7 w

{//修改缺省属性

6 U: C/ U) z- ^5 Z5 v8 T* F

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

( ~' G% q8 ]8 W7 o6 @" L- Q* x8 W/ V. j4 x

{

[ ]; Z4 q2 j* I D0 a3 Z

MENUITEMINFO mii=

8 D( F0 P% h. n, I! {

{

' C( Q8 D! E# E! i2 J

sizeof(MENUITEMINFO),

& F/ z: x# X. u3 D0 N# p/ c" {. g

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

5 y8 r: c/ o% }# s3 [: s# x' F( \

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

- N' r& n# ?; a D/ _

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

! P1 s* K4 S' n3 a$ y* x! }* Y

0,

) }% l, c, g. t- p

0,

4 X" P0 _; z, }6 y3 s# ^6 _) m

};

( `' D& V5 t5 z, q

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

+ o( ]! b" a* I, i8 J- W! t& c

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

, @& F, r* P. h5 @

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

. n5 l: U, K$ N

Modify(pMenuItem-Items);

3 r% c. M; Z2 I+ @

}

( }$ W9 O, _& e# R. E, \

8 j: l6 Q3 P1 }! p

}

4 P B) a0 C5 N

void __fastcall TForm1::FormCreate(TObject *Sender)

. j' u9 H2 h: _

{

4 F; J4 `- q, p" {! q8 I# i$ O

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

6 }9 G9 g A. R# W8 k

{

: Z% \" m9 \; g/ M" D, B

Modify(MainMenu1-Items-Items);

/ s$ j0 e: F7 g3 j; H- |' \

}

# X9 ?8 A3 t4 m$ c

DrawMenuBar(Handle);

9 u' Z& r' V! E. g, a. O

}

7 ?8 v; C( Y; [- @

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

8 G9 y1 L7 D* V" C# G* H0 _+ t$ [

void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)

. x. Y0 y3 @4 q& V0 Q" Y

{//设置菜单大小

3 L; ?( ~/ G) ]$ o' K- K4 a

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

2 q# `' P- \4 J; N

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

0 }' F: ?1 r4 `% z

Msg.MeasureItemStruct-itemHeight = 20;

' O2 `+ H' P9 u2 {' l" I( v' I

}

% h) a6 D0 @, s( |3 c# Y) K

void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)

" \) Y* X. d* E& }. _

{//画出菜单

) X: Y2 Z% j5 W$ v4 P2 n/ \

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

$ ?5 Y2 J) U S7 N9 S+ w

TCanvas *pCanvas=new TCanvas;

, z7 h' n9 j% `* a# d6 e5 y

pCanvas-Handle=Msg.DrawItemStruct-hDC;

7 f: S8 D) L$ f" E

RECT r=Msg.DrawItemStruct-rcItem;

1 z$ p+ H& E8 m

pCanvas-Brush-Color=clBtnFace;

& R& A, c4 E# ?% ^! m3 F

RECT r1=r;

( r' E/ O3 J/ u& Y( r+ d

r1.right+=1;

3 m6 C! {! z# @* ^; T9 p

r1.bottom+=1;

: t$ L- B8 f$ k, I, d" [

r1.top-=1;

+ U3 E9 |8 Y3 N9 M+ C

r1.left-=1;

/ m# k, }1 c3 ~6 u5 @8 ]1 o" V/ ^- }

pCanvas-FillRect(r);

8 o& \) o% ] G

::SetBkMode(pCanvas-Handle,TRANSPARENT);

' P5 M( C0 d- `2 Y

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

+ J, M7 K: [, M2 F9 b

r.right-=1;

( ]& K; _- z# D8 S+ d: O# T l+ i

r.bottom-=1;

* [$ E8 w0 F5 f3 {9 j

if(Msg.DrawItemStruct-itemAction == ODA_SELECT

2 {5 _5 M1 B4 y. |/ c

Msg.DrawItemStruct-itemStateODS_SELECTED )

4 e* n5 G9 U( h b

{

" Z, J$ l" x- b0 ~7 A* O! D

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

; s" y0 l2 L# @. u) ~

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

2 f$ l" _0 ]$ }" m D1 c4 _

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

$ K# K2 m4 e8 C" s- | m1 U. p+ k

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

4 ^, d# @) b- N, o! m/ c# M" B

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

1 i' c, _. Q% g+ O! w7 S- ]

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

; I, |" y' O& M- a* v: B

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

4 R! [9 `! P, D- l7 i

}

" P/ O, s2 ?: t5 O$ q2 v' x; | # h4 H7 z+ E6 j

}


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