QQ登录

只需要一步,快速开始

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

如何自画菜单?

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

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

1 m4 |/ H5 S5 j8 ~8 I" G# s( s5 g, u

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

0 e4 [7 B3 i# w

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

; R/ |! O: Y5 d* O( M

$ c1 H. \& c; J) V- A8 i, x5 q* h

//头文件

/ _/ g+ z/ J( l5 Q4 _8 C/ d b# G

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

) j- o! C! A" J( @

#ifndef TestMenuH

7 T9 r8 I8 x: f$ t9 |/ \

#define TestMenuH

1 L0 r) u- g9 V

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

5 {" b/ B9 k3 C1 Z/ _

#include Classes.hpp

: l( A& ^# j- @4 }7 P* `3 l2 z

#include Controls.hpp

, |, w3 j3 _% h3 p& P

#include StdCtrls.hpp

8 Z# a2 e2 v4 P) B: v

#include Forms.hpp

' X3 E& c3 i7 J/ {- q4 ^

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

8 L! t# Y! q3 H- q9 t$ P

4 h0 H. J; @. U5 ]" }

class TForm1 : public TForm

. m" O Y, u0 f0 X) O( c) ] X

{

" ?. Q0 u7 F8 o4 o6 S% x' ^9 d

__published: // IDE-managed Components

$ u/ t, b* Z. |) ?( K

TMainMenu *MainMenu1;

! q; T' k: H+ _ A( @" X

TMenuItem *aaa1;

+ K( K- h/ z& p. I$ |. Y

TMenuItem *aaaaaaaaa1;

' z, ` u0 S7 s

TMenuItem *ccc1;

7 E: o- }. W4 S5 t- r6 K+ H

TMenuItem *ddd1;

! L6 q7 C, i: ^) i1 v0 {

TMenuItem *eee1;

5 y; t8 y8 n# l, p

TMenuItem *ddsds1;

0 d" ~7 M$ v! a4 m2 c; ]

TMenuItem *fcdfsss1;

0 M& i9 d, i* a" I i5 Q7 Y+ K1 |

TMenuItem *dddddddd1;

2 [* x2 M; B' X( ]% [

void __fastcall FormCreate(TObject *Sender);

" d' x. J8 Z9 w: d

private: // User declarations

- V$ `0 B4 n; ~2 o/ v4 K+ e* R

void __fastcall Modify(TMenuItem *pMenuItem);

+ m2 C: `1 a4 o5 A

protected :

6 J3 D8 H( z; K$ P- M, I

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

* Z( G8 C& c) d+ u T

MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);

) K: G: [: C! t& j

public: // User declarations

9 c: z( j! W/ S0 E9 V) {- l

__fastcall TForm1(TComponent* Owner);

# S- A- n# M0 `1 H) x6 K# y$ ^! l4 H

BEGIN_MESSAGE_MAP//添加消息映射

+ h" A: C q. R& b

VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);

/ t: |8 D4 G; f$ o* K; C6 E; q+ `

VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);

2 d) C0 U3 H' I$ a2 Y. F

END_MESSAGE_MAP(TForm);

8 n. {" N7 h( d/ l( v9 W; d

};

4 \ Q6 j0 A9 H. C x

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

* Y8 M7 f4 b: k& g4 {% i

extern PACKAGE TForm1 *Form1;

; U# Q- \0 E0 u) f

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

% x! P( s9 _) W# f- u" o

#endif

7 G) u: D5 j% ?) X, c( V& F' d6 I

: ]: d6 `, }3 H. G! Y! Q1 r5 X

//实现文件

( G0 G- [8 Z3 h; n+ s6 l* }

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

3 l9 Y: o. {7 q! c

#include vcl.h

7 x7 r8 @6 x& _9 }' a1 ^

#pragma hdrstop

) }% X+ P$ |5 g. c4 u% k/ d7 T1 M

$ R( s& ^1 \% ?

#include TestMenu.h

: M/ o' k' A d! d) @

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

5 W. o) e9 C5 z0 g

#pragma package(smart_init)

E1 t+ }4 q. f# `0 R' r

#pragma resource *.dfm

% y5 U; v. H: g8 E: M& M2 o

TForm1 *Form1;

; W7 E K& a: q6 J m3 B

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

. _2 W# L# R# C; L& n3 ]

__fastcall TForm1::TForm1(TComponent* Owner)

* k8 R* D( q7 V1 }

: TForm(Owner)

& j+ s0 O# @: p: B* J1 d

{

( w3 U4 V8 o4 Q2 }" ?8 C' @

}

`5 F* q, ]' v9 k1 {( G

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

$ c* o* H4 e' N3 a v

) @. l; l! b5 J& m3 P$ b3 W" {4 Z

void __fastcall TForm1::Modify(TMenuItem *pMenuItem)

4 F' c2 m( I) e8 J- {5 T" c6 }

{//修改缺省属性

' W9 B' Y4 @ r- Z. ~# ^! [

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

4 w% H. d5 h9 k- ~# G" q4 o

{

7 h; s& g3 K! ^, D H

MENUITEMINFO mii=

, }3 o: S5 N" O6 ~3 _

{

/ ]3 x( r0 k) a0 k& t$ B& d$ `$ `

sizeof(MENUITEMINFO),

5 \0 @+ P1 V7 X5 o' s% P/ y

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

4 N$ y. U' ~' y6 S5 o# R9 L4 s: |

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

' W0 b; k' g. h0 m3 e

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

+ H# f! V" w% Z& |. O) U

0,

7 k9 H3 {0 Y8 w' S7 z, w+ f7 r! w7 k

0,

/ y' R* N. b) b

};

- ~9 {1 |* s7 I" N1 h/ M

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

8 d$ e" ^5 m3 @9 a' S

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

5 [; z1 b k/ }4 H; i5 o( f+ ^

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

: f6 o; E2 }( v) z% r

Modify(pMenuItem-Items);

/ K. W4 z* v/ |& u/ ?* V2 _; B

}

# \( ^1 i2 n: ?: b6 v& q

: p0 w5 N( e$ h U4 c+ b

}

0 n$ e: P; T+ r) a/ ]( t0 v( M

void __fastcall TForm1::FormCreate(TObject *Sender)

/ |8 o) o) `& l9 c

{

" Y. _6 D* u! X5 p& B

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

* e4 @' d( }1 y' M, X. {0 n

{

1 I8 k1 ]/ p2 b* w4 K% J; H

Modify(MainMenu1-Items-Items);

5 \1 Q0 z6 o$ Z1 j' m

}

! G8 b! k$ {& i9 k" I) b& ]( h; e

DrawMenuBar(Handle);

* q' }5 g$ e$ |. q3 e

}

! x! w% J0 L3 j# u7 T

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

' f' i5 f7 Q) U6 V" X

void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)

% i6 T2 ?! l' r; G3 t

{//设置菜单大小

+ a: N; Q! x/ U( i2 U

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

) F& R& B% r" {; r" V

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

- P+ M8 V2 n5 T5 R3 g1 r# G2 }

Msg.MeasureItemStruct-itemHeight = 20;

1 ^4 N5 A5 v- H0 d) F

}

3 J e ?- N% Y- m

void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)

' R) ]& s1 B. W- q: y6 E# I

{//画出菜单

3 B! a/ a3 a' m

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

0 M, R4 f4 r. _

TCanvas *pCanvas=new TCanvas;

) v7 e# B0 o) }2 ?3 R

pCanvas-Handle=Msg.DrawItemStruct-hDC;

+ u Z; h( q3 X8 d0 J* a

RECT r=Msg.DrawItemStruct-rcItem;

: |& r4 ^3 A% K2 D$ a

pCanvas-Brush-Color=clBtnFace;

. A# N' t, T. d+ Q6 x, l

RECT r1=r;

. [: c! L* Q& D( b7 b0 Z& D( @

r1.right+=1;

" t) X8 L, u3 k6 G9 A& D# W! u, Q

r1.bottom+=1;

2 @) m6 P% w4 R

r1.top-=1;

% \& b; t' @8 U; k

r1.left-=1;

0 W {( ~. J6 L( a7 Q4 P: D

pCanvas-FillRect(r);

2 i, S1 T& ~/ r& C

::SetBkMode(pCanvas-Handle,TRANSPARENT);

1 Y4 t( [9 \& B! s

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

% d! @! l7 O' w- |5 z

r.right-=1;

# l+ V# d3 d- b6 L

r.bottom-=1;

9 Y: C( i% s8 Z. i+ c* d' k G& ^$ ]

if(Msg.DrawItemStruct-itemAction == ODA_SELECT

( f+ ?: S# {' ~( b2 f- k, b

Msg.DrawItemStruct-itemStateODS_SELECTED )

& I& m) I6 \' ~+ h

{

6 t' e7 x' Z3 S$ ~3 K2 `& q' M* o

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

& j9 a7 n- R ?4 Q

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

# F1 \, _( z5 ~8 q; i$ b

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

# d$ Z* B2 X; d/ ?0 P: S8 H8 U

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

+ ?. D1 n/ O8 c+ Z

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

; a9 g4 ^& T0 p$ _; h1 d' B2 N

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

$ O) j* |6 B/ G

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

) E) H% ? r# }7 {- e8 W0 z- e

}

9 d+ f* X8 J( A1 i4 s- E , O3 {6 ^+ M, U; ?6 l! A3 G

}

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-10-17 09:04 , Processed in 0.670664 second(s), 82 queries .

    回顶部