QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3854|回复: 4
打印 上一主题 下一主题

如何自画菜单?

[复制链接]
字体大小: 正常 放大
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2005-1-26 12:16 |只看该作者 |倒序浏览
|招呼Ta 关注Ta

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

6 d3 n5 U4 v5 s. D3 e& e

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

7 p& l: A4 {$ V: ?% C

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

: c5 o. m j+ `7 m. j, M# D0 }

* D" R2 }) v c# d$ \" ~% j

//头文件

8 U8 z5 | C& ~

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

/ R' F5 ]6 V, P' F

#ifndef TestMenuH

% f' o" d. J8 N

#define TestMenuH

. D0 Y$ Q2 ^( @) w, \. o1 B

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

, B! L) q4 H5 l, S( ]4 y

#include Classes.hpp

. r: j+ L& f/ c, _7 M0 V

#include Controls.hpp

* k- @# D! P9 j [' m6 g

#include StdCtrls.hpp

. k6 L7 ^& G) M/ p/ N, z

#include Forms.hpp

( p) Q( p) L4 s& m" v6 [) `3 `

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

9 q( S# }# _( m' U$ t

) n8 b, l$ z" h2 C5 u. w9 T' }

class TForm1 : public TForm

& ]6 F7 {+ c/ R3 q3 c# ^; u$ m

{

5 Z( k2 ]( A& {/ q2 e1 s

__published: // IDE-managed Components

. O$ q9 z4 ^8 g

TMainMenu *MainMenu1;

" {# R6 h d, P

TMenuItem *aaa1;

! f1 r5 g* c' F$ H8 r5 S

TMenuItem *aaaaaaaaa1;

, L; c4 l3 y+ f @3 x

TMenuItem *ccc1;

# ~1 D ]. ]/ @/ N0 a9 G5 a" C) c# D

TMenuItem *ddd1;

9 a! w0 h+ e; q/ G

TMenuItem *eee1;

+ b4 [ J9 o, y. N

TMenuItem *ddsds1;

C v: A: ?' b b

TMenuItem *fcdfsss1;

. ^/ A1 E, k: _5 [7 D8 W

TMenuItem *dddddddd1;

4 F$ d$ J0 G8 K0 T! D4 c8 @

void __fastcall FormCreate(TObject *Sender);

/ Y5 w$ L" t6 q/ F, j1 d

private: // User declarations

+ `2 V: p B% i

void __fastcall Modify(TMenuItem *pMenuItem);

5 W( {! H( x: h: ]- t5 m' y1 ~

protected :

m4 f& I$ `! z) ~3 C% y$ X

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

4 v; h" P! B3 g3 [2 E/ ?

MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);

- r# d. R( c) p- I$ H' V

public: // User declarations

" |1 c, b8 A0 S/ T

__fastcall TForm1(TComponent* Owner);

4 l* n2 @; f. ?: C5 [

BEGIN_MESSAGE_MAP//添加消息映射

9 m l) W% f0 m

VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);

. @! z5 ?/ {3 U- B

VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);

, b4 G7 t h$ t, |6 `

END_MESSAGE_MAP(TForm);

- \+ i7 E& O) k

};

* G' O. e$ S" l! r4 L

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

$ \; O h z. x" w) k

extern PACKAGE TForm1 *Form1;

9 B, J! n6 e$ d. q) X! w7 m( H# z* e

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

- s1 a% W! s$ u* e+ N# V5 s3 _

#endif

$ Z8 K3 z# A. [3 t

" }% R( t/ I/ V2 l8 ]. u c

//实现文件

+ E3 g4 P' m& a4 U( l( g8 {9 p

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

3 ~: B# H. O/ J# F) G! V

#include vcl.h

3 |1 h( i: a, d

#pragma hdrstop

8 b# O6 {6 f: E5 g

1 X8 f7 o4 D: p9 t

#include TestMenu.h

5 M5 @6 p) d/ U- y" j t2 N7 F

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

9 z6 {1 w1 e5 G! X+ z, L. w: K

#pragma package(smart_init)

) q! F5 Y5 [% V' ^- v; R& |

#pragma resource *.dfm

) V- b) u/ K. _$ g2 D; y

TForm1 *Form1;

1 N+ ]/ k4 \6 q9 t9 ?1 T

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

0 W( ?6 B% i/ i" l, J3 D) F6 }

__fastcall TForm1::TForm1(TComponent* Owner)

' i9 [ i2 A: P% ^1 O

: TForm(Owner)

1 R3 L& H! b- m% i9 W6 @' h* \

{

- R2 U* ~: G( e# e- h5 B& R4 A

}

9 n/ X/ Y* ?, {" a/ f

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

5 H# w& x/ ]9 a) O7 @

8 A1 u, ^. V& b- D

void __fastcall TForm1::Modify(TMenuItem *pMenuItem)

. D1 o1 L' }6 b. o% u7 t

{//修改缺省属性

2 e+ b7 U1 K* g' v$ t, ~ U

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

$ }1 ` L) ?7 ]% I

{

: K4 T6 y1 g. k( V) Y4 ?. E

MENUITEMINFO mii=

7 R$ m N; K" o# Q. p6 g, X! N- H

{

; e4 y7 K" d. ?% {& O4 D3 r

sizeof(MENUITEMINFO),

4 P3 D0 W, ~% s3 \3 o

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

, W1 B: F/ y' C8 B2 J$ u

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

* L2 z" }1 I4 y2 ~3 O9 k: a( n3 a

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

; r, A, F/ q. F( Z8 }

0,

- j: o( }% c3 G2 n ^# V* y" k

0,

% Q0 W/ ~6 y0 U7 s: u4 D$ N: B0 L( Q

};

; _- T4 L: q. i

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

' [5 T2 n* E6 ?4 X' i

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

/ a4 b3 w: P2 [* |

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

9 G4 m7 j- M9 z% f8 v* K0 x& E

Modify(pMenuItem-Items);

* W9 q) H/ N7 k7 M. g

}

. \/ j$ ~/ ^7 i8 O4 \% N% r

( N `! ^! b1 W; m) Y6 P: V

}

5 S- D5 f: h( W- l- J; z

void __fastcall TForm1::FormCreate(TObject *Sender)

+ {; S5 Z% k) {; t' a

{

) K4 J# x( V* }5 Y( d- Y

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

; P6 h; G2 Y9 d- \0 B3 u# d" \

{

# U5 H/ S( K: i g- O( u( d" z' g1 k

Modify(MainMenu1-Items-Items);

6 E2 j- o3 k; D- Q: N. E- H

}

% H! Y3 X2 U/ P1 _# {' {% x

DrawMenuBar(Handle);

9 r2 O2 x, x9 W+ J7 t4 _5 r/ J" j

}

) F6 U' Y6 T) c9 E% V, ^

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

2 h0 ?) s, S) h6 [) O

void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)

# _, n# V3 }& z5 o

{//设置菜单大小

& O" V) f4 [) s/ d! w/ D: y# E

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

3 Z( U7 [+ l1 m; d# k$ q

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

5 x8 W, `( `1 f, W

Msg.MeasureItemStruct-itemHeight = 20;

6 E) ~$ i% D8 z8 y

}

2 F" a; K6 q$ Q4 K

void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)

2 R, a6 \& d! @' z" _$ j# v, d, X

{//画出菜单

3 [5 p8 K' h& w0 e! P4 W8 |7 u: N

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

# O% |$ ` Q* V- m5 f4 c+ V

TCanvas *pCanvas=new TCanvas;

( `, [/ }) r; L2 t% s; |

pCanvas-Handle=Msg.DrawItemStruct-hDC;

& {8 C' r) h) F5 g

RECT r=Msg.DrawItemStruct-rcItem;

" ^8 h% G7 B, k( T5 b

pCanvas-Brush-Color=clBtnFace;

9 t, j1 Y$ D9 m* L

RECT r1=r;

' V D8 K' r. t

r1.right+=1;

1 f% W5 B7 A* s, Q" E1 B

r1.bottom+=1;

9 X+ `' L0 |0 ?) |1 }

r1.top-=1;

- }% X0 [. F v+ e R8 S6 X

r1.left-=1;

8 U3 X5 b& F& }- S2 R; }# v% Q* I6 F

pCanvas-FillRect(r);

; A% w( Y( r2 b9 n, L8 c& v

::SetBkMode(pCanvas-Handle,TRANSPARENT);

8 i5 K6 {. X2 \1 m

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

6 f; {) O! t# O d+ C2 Q' s

r.right-=1;

8 g+ F8 M% l6 W) h; h3 ~& P2 F9 H

r.bottom-=1;

) U9 j% f5 A" E: w# G! n% l

if(Msg.DrawItemStruct-itemAction == ODA_SELECT

8 ?4 J) |% O/ x2 r3 X

Msg.DrawItemStruct-itemStateODS_SELECTED )

5 Z& }; {; C; ^+ W. F: m

{

0 d. G: ~, _8 P6 {0 t. N$ a) _

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

, h4 P7 W1 u! d5 x

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

7 \. ^; q" w7 y& `. g; M! E, Q

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

3 V- m( n& ^/ j1 I5 t

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

. c9 U7 M U/ ]5 A! M' R) S4 F

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

! a5 V" Y6 H6 r, T0 n) v. M' x

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

" [5 b$ @' ]/ Q

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

4 s/ f) t2 m9 }; z$ Z

}

# h8 w$ E# p" C P $ P8 j3 V2 P$ k. x/ N' E9 p; W

}

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
凼凼        

0

主题

4

听众

64

积分

升级  62.11%

  • TA的每日心情
    开心
    2014-1-15 23:45
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    回复

    使用道具 举报

    Z7XOB        

    1

    主题

    4

    听众

    411

    积分

    升级  37%

  • TA的每日心情
    奋斗
    2019-7-19 16:15
  • 签到天数: 91 天

    [LV.6]常住居民II

    2012挑战赛参赛者

    群组Matlab讨论组

    群组数学建模培训课堂2

    群组学术交流C

    回复

    使用道具 举报

    lynli 实名认证       

    17

    主题

    4

    听众

    266

    积分

    升级  83%

  • TA的每日心情
    郁闷
    2012-2-11 20:32
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    回复

    使用道具 举报

    nishhao        

    0

    主题

    0

    听众

    4

    积分

    升级  80%

    该用户从未签到

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-8-9 06:06 , Processed in 0.496541 second(s), 82 queries .

    回顶部