数学建模社区-数学中国

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

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

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

' a6 F3 Z: m- k- w1 A4 Y; S: p

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

5 }8 M9 S$ O% k2 @1 A4 h" }+ g- L

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

4 j2 b1 \6 V- F6 I7 X& I' C8 a: z

d+ ~" M ]( p+ h7 U5 J# ]- m

//头文件

& u; n; }; C4 D; B; B$ U

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

! W- Z, I2 a" h' V

#ifndef TestMenuH

3 o2 ]$ S/ a0 Q+ b

#define TestMenuH

$ r" n4 m9 o1 `) @) ?9 V! D, S

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

5 K+ q/ z) m3 @3 l

#include Classes.hpp

& H( N [* ]4 W: d8 A' {5 B6 V

#include Controls.hpp

5 a" I" ?6 @, f

#include StdCtrls.hpp

* O0 m, }+ `- H* ?/ h

#include Forms.hpp

3 q" R( n2 F& X4 |6 K8 x

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

/ n' V$ {. L/ v

$ a9 V! l5 a7 A1 ]# P0 Y* P, J

class TForm1 : public TForm

+ n: D, u' J* h

{

3 l' i5 t3 q- H% _* Y" Z" w+ Q4 o! U

__published: // IDE-managed Components

/ j" E# }4 x# ~1 y- k

TMainMenu *MainMenu1;

, E: I9 t1 P+ J5 |9 b

TMenuItem *aaa1;

) O5 w- b+ j9 i4 Q: ~

TMenuItem *aaaaaaaaa1;

0 [# X0 u# u; g" z

TMenuItem *ccc1;

" }5 L( E0 A" i2 ^

TMenuItem *ddd1;

, ?8 ]6 l; v5 W6 }, O

TMenuItem *eee1;

3 S, w3 o6 D- g/ E

TMenuItem *ddsds1;

$ [$ A: |4 Z, D+ C0 @! ]4 p

TMenuItem *fcdfsss1;

8 C# Z! I" o% K

TMenuItem *dddddddd1;

) S) {7 N. E% {. K0 [* ^* W

void __fastcall FormCreate(TObject *Sender);

1 L! j0 l" a; B: F" b4 t+ N% x

private: // User declarations

& d( X; w& Y3 S6 B

void __fastcall Modify(TMenuItem *pMenuItem);

1 q- V/ p8 X. |5 {/ q1 ] t) k5 [: [

protected :

3 `" X: W o+ f& c, L0 s+ b; j) ?

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

/ b# i3 q+ g& }, r8 q* R

MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);

& L+ b& M7 V; b

public: // User declarations

1 u' Q! F$ W" ]; j3 r. E3 ?

__fastcall TForm1(TComponent* Owner);

* A; Q, T: d) I: H2 Y9 {5 O

BEGIN_MESSAGE_MAP//添加消息映射

+ ^7 A$ M- P) Y; o) s3 U) g

VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);

( a2 A, l; Q; r) E; S

VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);

3 U" Q2 i7 i @) r

END_MESSAGE_MAP(TForm);

- w) R& k% p- A4 [( {

};

; i4 m! ?& P9 [; [+ ~

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

7 c P$ I N% {& ]3 L7 b/ A

extern PACKAGE TForm1 *Form1;

a8 R5 t+ R. I

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

/ I5 F+ U5 J4 \% k7 v1 [, w

#endif

3 b' \1 V- g3 a' d; K& d# r

( s4 [: i& r8 a" N4 ?9 z1 [, H& T) d2 Y

//实现文件

" } I- l# t* n" ^

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

9 t' S( N; G* ^5 R! \

#include vcl.h

3 g$ N- |0 M2 r8 h1 G

#pragma hdrstop

; B& q* P. K( T6 J

; J, e+ e! c0 r& P- b

#include TestMenu.h

6 A$ y# `) V2 A( E+ \

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

* r" U" U6 N8 s) t

#pragma package(smart_init)

1 O' H% S T R& q6 h

#pragma resource *.dfm

7 w4 g5 Y& e8 @% v" W. h* m

TForm1 *Form1;

& V' U* V' o, m3 U! q: R, f

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

( {. u* r5 F w; N

__fastcall TForm1::TForm1(TComponent* Owner)

, J+ ?/ G0 h; F+ y; `" e: x! H$ _

: TForm(Owner)

. l, u+ ~$ w; ~5 j5 P% D" U

{

7 E- c& n2 c* v3 \! U$ Y2 x

}

# l8 t! Z1 y: u/ M: S# v

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

+ X. k- P5 z: D" N

/ C/ c0 Q7 ]9 Y/ j6 n- H( |

void __fastcall TForm1::Modify(TMenuItem *pMenuItem)

- a3 o& P' ]2 z0 z5 ~( I/ l

{//修改缺省属性

* G' t u4 T7 N; N; M3 |& X

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

$ r1 u9 v# ^3 r. q/ z1 r

{

; L6 U& s7 e) s3 f; ]4 U

MENUITEMINFO mii=

5 T n: P" _/ o% E: Y

{

9 Y3 [# G6 U, N/ g- j

sizeof(MENUITEMINFO),

; [, v; d3 O. g

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

& B+ I/ C; I) j8 r0 c. n

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

$ L+ J* o* V6 V9 g! D$ O# v% f

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

5 o/ E. n5 M3 o% @# c

0,

p( \ c; l- z+ }! z+ b

0,

- z: y2 h- L6 o2 D' Y

};

% C1 C" D' e& c* x) E* i6 J5 X- l

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

) M( O6 ^( p' `( |: L u' o

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

/ b. T% Q: x7 {! J6 Z

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

( ^; M' r0 s% P9 L: Y4 I

Modify(pMenuItem-Items);

- R5 Q5 `* A. g. u' `

}

% v; V& H! b/ q3 ^

, x! {1 w2 o+ }# _0 _( j0 A2 H

}

, e0 N/ ?& V2 T& A

void __fastcall TForm1::FormCreate(TObject *Sender)

z; e7 |; {- x! ~/ Q2 B4 \

{

1 Y- f: @; h* {% m: Q6 y `/ U

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

1 K# i2 ]. V D5 J5 M8 U" ^: P3 B/ B

{

# C% z6 P* I0 O& I

Modify(MainMenu1-Items-Items);

4 V- k; t, ]* y9 b. j7 I- @! u8 m

}

, Z2 k6 ?3 w7 d3 H! G/ B# Z5 ]

DrawMenuBar(Handle);

$ J# ^2 R) V! e/ {) w) o/ @: L9 }

}

6 a* g# ?6 p z

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

: S& K/ g2 q$ X* R* F0 a

void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)

* Q. k+ G. ]7 e' t; d T

{//设置菜单大小

, t% P0 e6 q, ?/ ], k. z' M) ?7 _

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

2 Z U/ _" W. m( y; E$ c) V* i

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

( I7 ?: j5 d- C$ H% u: |1 M7 q

Msg.MeasureItemStruct-itemHeight = 20;

6 B F" D0 Q7 n+ q4 B8 f& @) H

}

: J9 ]( K$ u& A3 n% V+ I

void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)

2 y) w/ o9 e$ e

{//画出菜单

6 ?2 W3 E, w* m8 Y, b

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

* H- a# D& Y3 B5 s- X2 Z/ U

TCanvas *pCanvas=new TCanvas;

' G- J" V7 A. ]- o

pCanvas-Handle=Msg.DrawItemStruct-hDC;

+ ?, W; M; B J0 X7 t9 l& h

RECT r=Msg.DrawItemStruct-rcItem;

% G1 n1 L7 X& h: x0 @

pCanvas-Brush-Color=clBtnFace;

3 ^. q% X8 ~" i, Q

RECT r1=r;

0 R) X% T; L( P# s

r1.right+=1;

3 T/ T1 Q9 T+ ~4 A" q5 P! }) A

r1.bottom+=1;

+ C9 \3 I. x# }- z, H

r1.top-=1;

% T; H' h" c/ C: ~( n* g- S

r1.left-=1;

* I! L, X; [# c v l3 m

pCanvas-FillRect(r);

$ ~& O4 p# V9 v1 Z2 P

::SetBkMode(pCanvas-Handle,TRANSPARENT);

$ _. s8 n+ o8 {% s1 ]4 F; }

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

/ Y6 l4 d( h6 q

r.right-=1;

! q% t( y! l. l/ ]

r.bottom-=1;

8 r1 {; N2 r1 w4 [' P

if(Msg.DrawItemStruct-itemAction == ODA_SELECT

" R$ T1 n. D0 Y

Msg.DrawItemStruct-itemStateODS_SELECTED )

& k, U2 l0 a" F8 P6 Z; Y" ^

{

' K. g+ W( A- e, y0 o

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

/ l# P, F/ y( |& Y# d5 Q2 d; O

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

" ~3 v' \2 c0 v. X% D

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

7 K( Q# z! n6 [" Q3 P

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

: y3 R' c: c0 S( c5 |1 L7 K! a+ X

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

0 F4 U$ i" e1 }2 j+ h% ~' |4 |; K

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

) H! ?, c! r5 u- i. D0 Z

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

' Y" K2 c5 C) q

}

# h' H; A7 H# e- j* @ 1 U Z( T6 A( H

}


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