QQ登录

只需要一步,快速开始

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

如何自画菜单?

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

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

0 N$ M2 \: n) Q3 f5 p

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

( d# E# E& D/ U3 E6 U

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

8 Y2 p4 [6 X8 S

6 h0 U# I' [% A8 z" t* L, s5 r

//头文件

2 r E y, ` B/ J& j

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

* h4 j U3 e5 _4 w9 i6 F6 A: c

#ifndef TestMenuH

/ C0 H, f/ D c

#define TestMenuH

8 x5 f; m. O. a% }. V

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

. ]9 |3 F: K {0 f; r

#include Classes.hpp

$ |# S; u, }6 J2 E3 s

#include Controls.hpp

. c/ v1 p n% o; Y/ g" B

#include StdCtrls.hpp

$ i% o7 `. U/ M( P$ Y

#include Forms.hpp

1 @3 M. m8 o& m; m, B

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

, C/ l1 L/ M4 E6 B

) d- J3 T3 u5 Y0 H/ I. X

class TForm1 : public TForm

% O' q, V0 C! E% Z- i1 |; ?) [

{

9 `$ v- f9 ]/ a2 P0 G- Q: j [

__published: // IDE-managed Components

8 h, T5 j9 N1 F# ]6 U, E

TMainMenu *MainMenu1;

3 ~$ H W3 _# X) r* K

TMenuItem *aaa1;

" |4 N4 T0 G* l* ^( ~8 O

TMenuItem *aaaaaaaaa1;

5 V# L' o8 _# e

TMenuItem *ccc1;

# g6 p- H/ N" @% ~! T- D

TMenuItem *ddd1;

7 x- ^$ U5 c4 b2 @

TMenuItem *eee1;

! s% P6 ?. ~+ h" T% N! [3 e

TMenuItem *ddsds1;

* V! p* h/ C o! Z4 T! M7 _

TMenuItem *fcdfsss1;

4 D+ G. }, Q P- E5 s, a. ]) x

TMenuItem *dddddddd1;

f. t/ i+ N! j3 p) n) [

void __fastcall FormCreate(TObject *Sender);

( {6 I+ N) G3 M3 j' H

private: // User declarations

" L7 r& J5 q3 T8 O' l& H

void __fastcall Modify(TMenuItem *pMenuItem);

) s+ Q9 A3 k2 L0 C8 i! S+ A

protected :

; F) u' ?* ]7 T. h

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

: t* `3 H ~# e

MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);

3 K5 t( @8 p" u4 `! _" v; n

public: // User declarations

* B6 X, J3 q" Z( M) q, M- l

__fastcall TForm1(TComponent* Owner);

' g' j/ M% L0 h& K# T

BEGIN_MESSAGE_MAP//添加消息映射

0 K/ o! f9 x6 r: V( p- M1 l

VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);

+ V' A4 h; G5 [/ \. X7 Q8 B

VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);

2 V$ B4 |3 v) b4 u: h) {

END_MESSAGE_MAP(TForm);

, C0 n5 N" M2 v# |5 y/ E

};

- y9 G5 q% d9 O, l9 O! O j4 @9 |

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

( b2 M9 i8 a/ x0 h! I( c# o3 G4 i& Q

extern PACKAGE TForm1 *Form1;

! x5 m' ^. s7 c6 E( ]7 P$ I I. `

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

a& `8 g; Q7 J1 {/ U- D

#endif

4 E. V1 V- ?0 o8 K

$ ?1 N0 e3 ~! ^6 y

//实现文件

/ c- ]* A: R F$ T( E

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

8 s7 N V- c, `0 X0 m

#include vcl.h

( o& k7 h6 {- F; s" G/ H3 n

#pragma hdrstop

& y. f" Q7 L2 \7 Z- h

5 r% w n8 ~7 }' W+ r5 k

#include TestMenu.h

7 Q( i1 Z7 m- K' E0 g

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

2 S. ]1 W. x. Z3 ]

#pragma package(smart_init)

3 ]+ }0 A. }& q* {3 ]# N* A

#pragma resource *.dfm

4 T, E4 a4 r3 m

TForm1 *Form1;

5 I5 X6 k/ j4 a$ q* e/ f

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

, M A2 Z5 z4 h3 E5 v

__fastcall TForm1::TForm1(TComponent* Owner)

6 z0 |+ f7 H, J2 { S

: TForm(Owner)

( l& h/ p* z R" v c- L

{

6 Z2 c8 _9 M: @

}

* ~2 j( z) Q, F. q" ]

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

; ^2 ~% C& L- W" y0 ]

A' ^5 ]1 ^ U- |9 z

void __fastcall TForm1::Modify(TMenuItem *pMenuItem)

3 D+ X9 @% ?* E0 ?

{//修改缺省属性

; f L7 d( I5 W, a5 J2 i

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

" J: { V3 n( T5 b4 T% R

{

+ P8 R- T# ?& Z5 a6 A' c; k

MENUITEMINFO mii=

8 V8 E( n9 B' j6 H7 a; y' `

{

; E0 y4 \/ i O8 E& I1 q

sizeof(MENUITEMINFO),

R, {# ` o8 R9 ^0 q4 }

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

! y* @9 W/ Z- P5 T9 O1 K- k

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

& O" F7 ?8 u( F& \0 r

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

0 B8 K1 x1 {. n% |

0,

7 n6 m3 X2 M* P1 h

0,

" k( X+ k" c: i6 W

};

, q9 G9 i- n6 r( X8 U9 l! \7 r; G6 @

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

$ n# W# {( h2 D0 Q1 _0 l9 f

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

N4 i& q/ h, h* y

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

) L, k& ~3 ], Q7 |- `

Modify(pMenuItem-Items);

+ ^* w5 y" v+ Y' p

}

4 }7 f. R; N" I, E* f

8 \( [$ v' X5 u4 _5 ?5 R9 J

}

8 v$ ?5 a$ Z y+ F, n" h6 c

void __fastcall TForm1::FormCreate(TObject *Sender)

! h% z" m" {) [' A! ^; j2 _ o( ]

{

8 _) {& m$ C& x+ V

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

8 u- h3 |0 V( a, k8 p! i

{

2 \; c8 `% E( I" L

Modify(MainMenu1-Items-Items);

& K" h4 u& d- s3 {# w- w. i4 _

}

1 u% y% Y0 F2 N2 J

DrawMenuBar(Handle);

: P: L6 a) F* f d9 y! d# H6 ]

}

( `& F( S, L" j2 q

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

) y j" t: b5 e6 [/ p) @

void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)

0 P6 X8 B$ t) T% z# u9 [ P

{//设置菜单大小

/ g7 [9 n. I f- q) {8 Y

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

0 U0 q7 K# s+ D3 H

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

! T3 T1 V$ k+ d3 W( B D

Msg.MeasureItemStruct-itemHeight = 20;

: i2 z6 g/ g4 e8 X

}

5 n9 W2 _/ P" ]- x( c- T

void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)

& ^% c% x* h# q8 R2 r% @

{//画出菜单

J" S2 I# g& d) Q" O; j( }0 p4 W

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

1 Y6 z! b. e- T* b' o8 r* w

TCanvas *pCanvas=new TCanvas;

, i/ l& c" m6 w- ~# T9 ~

pCanvas-Handle=Msg.DrawItemStruct-hDC;

6 V+ ~+ w9 n& L. y2 k

RECT r=Msg.DrawItemStruct-rcItem;

7 A+ e! o7 A' K8 P; M, N/ ~- q1 R

pCanvas-Brush-Color=clBtnFace;

0 r8 y/ \6 m- Z$ |/ N

RECT r1=r;

7 @ ~7 f3 z% O- r7 G0 h

r1.right+=1;

7 C+ h1 w; D4 H* h- E

r1.bottom+=1;

* ]3 m' f3 o2 t9 e' A6 r+ R

r1.top-=1;

6 P) o, O/ h4 m* O. E2 U/ S$ x! }

r1.left-=1;

6 n- B2 w' t* G7 G/ Y4 y

pCanvas-FillRect(r);

5 B! w9 N: T, B3 B

::SetBkMode(pCanvas-Handle,TRANSPARENT);

4 ]+ `( u5 N9 I+ \& \- W

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

' l, u4 \6 t3 O0 W

r.right-=1;

( i( e! o! I0 a" i1 q+ n

r.bottom-=1;

: |. H- l% y: u7 M8 l0 k, f

if(Msg.DrawItemStruct-itemAction == ODA_SELECT

8 y8 w( y0 H3 k( U* H

Msg.DrawItemStruct-itemStateODS_SELECTED )

& f! m) I3 C/ I& U

{

* o+ R9 J( M5 Q% c

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

$ s/ ~7 N3 p) [# V, {

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

( H4 c+ G, R2 Z

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

! ^ O0 }5 U4 R# A) C

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

4 ]/ c! D5 J% P* c$ r" @1 ~

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

& T& K4 R. _% i+ J$ R- v8 }- E

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

2 o9 C# j {9 c

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

' z% h: T( c# a: |8 V3 _7 H

}

5 ]/ X: R g( m! ?0 Y X # t# G, ?, f: 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-8-9 07:07 , Processed in 0.821669 second(s), 82 queries .

    回顶部