QQ登录

只需要一步,快速开始

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

如何自画菜单?

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

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

; |7 A0 s6 w- X3 K$ h7 @3 i+ i2 c

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

8 \8 L: w2 e4 T

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

( n' S% o2 `1 k) ]

, O6 j' G% k) [% h; v$ U! ?2 [

//头文件

7 [& V6 S6 h' E& ]0 y

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

5 I4 j# C+ ~6 Q! I* {

#ifndef TestMenuH

9 i* N1 O+ d9 g6 m

#define TestMenuH

- R$ }( o% s* `# C

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

k* c0 t4 y1 U3 B

#include Classes.hpp

7 a* ^0 @* \8 D/ e! g T0 Z

#include Controls.hpp

% K; y9 U" Z5 X! x' _# \

#include StdCtrls.hpp

$ r' k) K5 U- l q: w7 O, C

#include Forms.hpp

& D( v R6 I! V) G1 v+ W

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

0 E3 ^, [/ \" b

, D" o# D: ?; E

class TForm1 : public TForm

2 N& v% ~9 z7 w7 S8 @3 ]

{

' v1 I$ \. o' `( h& A3 V' v

__published: // IDE-managed Components

+ c' u, y+ ~& ^8 p2 i; O9 U

TMainMenu *MainMenu1;

0 i1 b* R& N& g( H7 ?0 |7 G

TMenuItem *aaa1;

# x6 d( W, _) Z* O# r

TMenuItem *aaaaaaaaa1;

1 }6 \& N5 h5 ]

TMenuItem *ccc1;

; ?; m- a0 a4 u' m4 E

TMenuItem *ddd1;

8 L# H- z, @' x$ j

TMenuItem *eee1;

- n3 d6 i; t) g9 q l

TMenuItem *ddsds1;

" Y( M- w q9 I' T. }

TMenuItem *fcdfsss1;

. u: s8 E+ I% U# w8 R

TMenuItem *dddddddd1;

3 ]2 Q! g& b# J9 Z9 ~

void __fastcall FormCreate(TObject *Sender);

% m2 Y$ r& c* F& I' R. a! w

private: // User declarations

( V: L4 @7 Z% C- a; S

void __fastcall Modify(TMenuItem *pMenuItem);

* t- q. n& J0 u. h* \& a" }

protected :

5 ^" ^" T/ l4 L$ h9 u1 F& R% @

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

4 p3 J6 w) G$ }* r

MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);

" a$ F8 M' |6 L8 ?) b2 f

public: // User declarations

. `: `% ]* w+ C

__fastcall TForm1(TComponent* Owner);

+ k* m, L& G, F6 v j

BEGIN_MESSAGE_MAP//添加消息映射

* I! w+ a5 _1 F" ]8 y

VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);

6 q& p6 L/ Y8 }- ~% ^# }

VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);

/ P. L8 G `: A& d" H

END_MESSAGE_MAP(TForm);

, S# C$ i( C/ B5 d% N9 T

};

# K% g' I9 N" P/ e' X

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

7 U( Y) z+ P8 d* ], w6 {

extern PACKAGE TForm1 *Form1;

6 P/ d6 J" f, Q D

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

( r1 x% X4 V9 l9 @' l

#endif

1 @! ~! t* f% x# \& U$ s

! G& a2 l1 w) P& W

//实现文件

$ d5 ?+ S; A. \( T3 T* i) F, ]

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

K! P( p7 [: o4 S4 Z. O, S. {; U

#include vcl.h

9 D; ]$ {$ V4 }9 b, R' R1 m7 K2 q

#pragma hdrstop

" f- Z/ z8 w* e7 I2 Q9 c) L

& Y2 L" \+ j: n' Y9 w

#include TestMenu.h

" i1 m- d2 Z! p5 M/ t

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

: ?6 H0 a1 I8 p

#pragma package(smart_init)

1 K( A6 r2 F% k

#pragma resource *.dfm

5 n9 e1 K; z; r6 x' e

TForm1 *Form1;

" @& W6 z$ Q2 y) }' m, z& i

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

* m: P$ j- l5 t5 E( |+ Q& }

__fastcall TForm1::TForm1(TComponent* Owner)

! t1 h: @- C4 J) B. c

: TForm(Owner)

. s% i1 o Y: L7 I3 F- |# G( ]% z! t

{

6 `( L, u, E0 s% J, _; |1 o" U

}

6 Y! } O9 d* I- \4 ^2 h

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

- K9 k% S3 H0 k9 K( n5 E2 i

; @0 k; a# S/ X

void __fastcall TForm1::Modify(TMenuItem *pMenuItem)

. X# \# W' z. i, D: e

{//修改缺省属性

7 P& @' l9 d7 A

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

+ r) F$ m0 j1 }/ Y3 L' {

{

: s2 l/ K, M6 s- J

MENUITEMINFO mii=

( U3 Y7 n6 y- m% h

{

( }# ~" H; ^5 O' ?. ^

sizeof(MENUITEMINFO),

5 O7 g/ A" ? d: B2 l

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

" s& I$ v$ C2 H5 [+ l

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

+ U* u+ f$ ~& c, _9 K/ s

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

+ w4 X! t2 W& C7 X+ R

0,

# z- M- C5 s7 W- ?4 s, I; i1 l

0,

4 m* F" k. \( P' E

};

k- A ~! f- Y% d7 I

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

! N" t9 t$ ?# V9 Y/ ]

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

- B$ ] y+ c3 e! w

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

- Q, Z, ?8 N2 w# U

Modify(pMenuItem-Items);

8 p2 H# n: r3 p1 |5 E. I: {+ G

}

( O# l. O, z# P$ ?8 }6 B- r* J) ?

' A& E. Q7 {7 n2 `1 U

}

$ x. D; L( K7 I6 Q6 D

void __fastcall TForm1::FormCreate(TObject *Sender)

. u8 G* w5 _8 ^( q/ [! A$ W& s

{

4 R2 J2 D3 D# b9 \1 V" j

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

# ?- w: W9 U; t9 {# C

{

' C7 A+ @2 l! `8 V0 X

Modify(MainMenu1-Items-Items);

5 J8 ], c! z1 r0 y4 P

}

0 y5 ~/ f3 z# r

DrawMenuBar(Handle);

& N! ^! `* u, O8 j7 J4 Q4 B

}

' j T$ G- ^% q

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

' x- D1 M7 z1 n

void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)

9 m/ {) B$ S8 v* @$ W9 x( d! Y

{//设置菜单大小

8 |3 y; _; \3 y# i, A

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

: H5 C, Y8 k' N$ A1 c

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

4 }2 s0 M/ `9 H# b2 Z% J

Msg.MeasureItemStruct-itemHeight = 20;

5 E6 e3 O* W6 n4 [

}

/ w; S# `/ X2 A* X( U

void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)

7 }5 `* p" W( d0 }" n

{//画出菜单

8 y/ c( m) X r7 {. X% C2 S5 P% F

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

6 a. K! h/ ^0 c5 y ~1 Q* k7 |$ `

TCanvas *pCanvas=new TCanvas;

/ C( K) w4 V8 E

pCanvas-Handle=Msg.DrawItemStruct-hDC;

3 b/ _$ b7 e. L) G& x# }

RECT r=Msg.DrawItemStruct-rcItem;

$ }$ H. }4 W" g1 q2 }7 h

pCanvas-Brush-Color=clBtnFace;

! F; \' a8 j, y/ I9 q) d

RECT r1=r;

2 i3 h: P; U1 U+ Y! d" e& Q! U

r1.right+=1;

8 c) r2 f' v; m: f, R* H+ M

r1.bottom+=1;

v" h' r6 z" u' X* v

r1.top-=1;

5 [. m% c. n; A' Y1 K

r1.left-=1;

% j8 I s& _. S4 S; q9 O

pCanvas-FillRect(r);

. T9 `* e9 t) Z, ]) z) `$ \

::SetBkMode(pCanvas-Handle,TRANSPARENT);

# J' m+ ]- d% ?. W* Z& F/ S

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

2 f1 Y6 T7 L1 @6 ?5 J/ a

r.right-=1;

$ d4 S$ g, E; B5 A; f- ~

r.bottom-=1;

7 m& r9 W6 e/ |' d$ I

if(Msg.DrawItemStruct-itemAction == ODA_SELECT

7 W4 J2 J' l7 q3 L: B" s

Msg.DrawItemStruct-itemStateODS_SELECTED )

w; K' `6 w7 ?: P( _" c

{

# f. m, z& R3 G4 n

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

$ H+ R* o! W( T, ~- `" s

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

& {5 _: [4 I3 B# }/ k

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

3 p; Z3 i. L: Y* [

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

) Q: M0 `% u: X

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

. D" X. y8 O* B* }

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

9 s0 Q8 @# w4 o9 t

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

! D/ V2 }' V9 ~9 f

}

+ ~+ X3 z0 d* e8 g0 R0 A |, A8 t6 I% D9 N! ?

}

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-4-16 08:21 , Processed in 0.465374 second(s), 81 queries .

    回顶部