QQ登录

只需要一步,快速开始

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

如何自画菜单?

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

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

9 E7 M0 _1 r3 X4 [! A! z- E' g/ t9 ^

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

N; B" K/ t7 Y0 i! N) C6 J

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

; I( j4 q K: m7 Q0 ?; R# U

7 `0 i7 E* j6 s

//头文件

7 [) v5 j/ p- B3 p) d* U- o

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

) l% V2 m5 c1 w3 U8 p" v

#ifndef TestMenuH

W9 [9 x! K9 g0 @% N r

#define TestMenuH

8 n2 q( k: q. l8 T

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

4 Y" |8 r4 A! v5 Z. @" e3 [

#include Classes.hpp

' x. {; g9 d: w+ |9 e0 c1 w( c

#include Controls.hpp

3 q, s3 P3 Y! b6 O9 Q

#include StdCtrls.hpp

% c% {, }: ~- r; N, e. C4 @8 V

#include Forms.hpp

/ w. v+ a# U- m7 C/ ~% {5 X* B0 G& K

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

& u8 I* {6 |/ Y) J* e

" M3 ^1 h r2 \+ q) ^) Z/ a

class TForm1 : public TForm

; z: ?' {3 p4 Q! ~+ ?3 j

{

; R0 a- y1 n% L3 H& f' x( ~) L

__published: // IDE-managed Components

: M9 e8 W. `/ U' C$ k3 D8 \+ A

TMainMenu *MainMenu1;

. l( X/ C5 t" G k% p* d! J3 L4 W( ^

TMenuItem *aaa1;

+ T, U3 _4 K7 Q0 H: A

TMenuItem *aaaaaaaaa1;

* p0 w, ]4 R5 a, C( B# C$ S6 ?& I

TMenuItem *ccc1;

8 ~, ?! p# E; a( G6 q+ t& y

TMenuItem *ddd1;

! C. N9 k" a) C% c

TMenuItem *eee1;

1 b* `( |" V) L# Z

TMenuItem *ddsds1;

+ K' o3 t) ?$ z: B; Y$ n h+ X

TMenuItem *fcdfsss1;

: K) i3 R, O6 w7 G G

TMenuItem *dddddddd1;

9 W: T9 l* b/ U N

void __fastcall FormCreate(TObject *Sender);

5 L# |3 \9 z" B1 t& K& }: A# |; ~

private: // User declarations

" M: ]1 h+ ^* { T( \% I2 c

void __fastcall Modify(TMenuItem *pMenuItem);

5 x5 c* N2 k! g% M. I

protected :

. \' V# _$ O5 C* @

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

, E$ j: B/ s+ o

MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);

, F( t, `4 z/ m5 I& m

public: // User declarations

t* Y. a3 `9 |9 y- y' |

__fastcall TForm1(TComponent* Owner);

7 ?# l- O- T; h$ ]8 S' i, T+ V, h( P9 ] o

BEGIN_MESSAGE_MAP//添加消息映射

0 e0 Y" B6 z2 h) |8 Z4 C. P

VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);

; H6 w7 h/ Q9 V

VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);

+ S: L9 K9 N" H' c& i7 k5 y$ u

END_MESSAGE_MAP(TForm);

* W6 f$ H2 A ~8 J* N

};

: j n. K6 q" U5 O2 w, R8 x {# a

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

( g: {5 q9 y1 p/ h; `$ u( L

extern PACKAGE TForm1 *Form1;

7 x4 ^) L2 \) g

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

# j- E8 R8 t3 @- @: D

#endif

' L# x. B+ ^; Q% Z

. y& S1 |$ Z. V4 r7 A5 i

//实现文件

$ A, `% z9 j8 L4 i- ]

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

4 G5 Y/ f: G( X& @2 a9 {8 S/ Y

#include vcl.h

4 r, R0 h5 V& |7 Y

#pragma hdrstop

, T7 ~+ z5 N0 c1 B" l' b

' W$ C+ ~/ k! o. G7 c9 r7 b' l$ h

#include TestMenu.h

6 v$ C( @! h; y7 S% N9 X' |

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

1 Y: Q% ^% F( Z5 V2 s

#pragma package(smart_init)

% ?2 R6 Z: ~9 Y4 A# r7 t- G

#pragma resource *.dfm

% e3 }/ ~8 o) }

TForm1 *Form1;

4 x" a4 {4 U3 O7 X4 r/ R

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

1 F+ I: D) z/ P! d& m! U

__fastcall TForm1::TForm1(TComponent* Owner)

+ ^; Z4 q, u' \8 E

: TForm(Owner)

7 R: z0 {% B$ D) y: r8 }% k

{

4 a4 r- a7 v f v) t4 Y

}

: [: s+ r1 p# F* ?# [3 O

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

- N# t8 `- j3 X4 |0 a. k

4 v5 O* b+ I0 q; U# Q' m

void __fastcall TForm1::Modify(TMenuItem *pMenuItem)

% ~6 w/ y' [9 R5 y \

{//修改缺省属性

9 ^/ \/ s6 l2 C; A( v

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

& o. m8 H M1 @8 g) g

{

! |9 w! q4 w7 k9 p

MENUITEMINFO mii=

7 }; a @) {7 X0 q

{

6 ` s; R$ G- b& p0 [

sizeof(MENUITEMINFO),

5 C8 h/ G4 k/ B, R0 b; t5 T

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

$ o4 c1 A3 J$ S& m

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

+ l% y+ q8 ?8 }

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

6 z. Z& X& u6 E U/ f! [/ ]) q M

0,

+ o0 V% p; V, I `

0,

1 f3 i7 e$ i! e; x! ~3 S

};

7 p$ s1 I' U2 \! |' s/ Z

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

; M- ~" X9 o ]

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

( D0 ]+ v. m! y# e S6 y& X/ `

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

5 |! ]" T [+ V7 n' Z* u% Z

Modify(pMenuItem-Items);

( b! S, x' Q5 X0 j/ e( @# B1 [. _+ o

}

/ E3 E2 h& v, [$ {& S+ w; S

P6 a5 H/ q. J( Z ]! O5 j* _" I; T

}

$ R5 k9 m4 P! X1 G5 Y+ O d8 Y

void __fastcall TForm1::FormCreate(TObject *Sender)

: ?2 H! J( z) i% b; k& C O1 o0 O

{

9 q2 h0 ] `4 c- x v

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

2 e8 q! q. J0 _

{

: [# v3 u8 i' H! ^0 G9 h

Modify(MainMenu1-Items-Items);

. K) G( M# W0 J0 P* E

}

% D, |4 T$ }1 @. ]) f& z

DrawMenuBar(Handle);

! \- v6 \3 ?; V$ |+ u u; Q

}

0 l/ k; J) g: R& y( q) l- k, D- t- G

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

5 m' g3 \9 p* f) T+ @4 _

void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)

# Z$ Z& V( g' d- K# ~6 u! }# {: m

{//设置菜单大小

- i! N$ u/ u% h' C# [4 F

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

2 L0 s& d, G" _( a0 c

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

6 T# R& Y' U8 N% ^

Msg.MeasureItemStruct-itemHeight = 20;

* R3 f) k1 k6 v3 H

}

4 H8 Y7 @% O6 c

void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)

; d9 Q5 s3 U4 v6 R, d

{//画出菜单

* }+ W" {2 T6 ]1 i

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

' B1 \! e A0 N. H

TCanvas *pCanvas=new TCanvas;

5 J$ S1 Q- r1 \9 q

pCanvas-Handle=Msg.DrawItemStruct-hDC;

* L+ ]8 i6 ~/ J) [8 y$ B, u4 n0 o

RECT r=Msg.DrawItemStruct-rcItem;

( t6 g5 s( w) N7 c

pCanvas-Brush-Color=clBtnFace;

) B# P- W. B5 B

RECT r1=r;

) g* S8 K5 y$ c0 [

r1.right+=1;

/ U9 A9 p- _6 j3 v" D9 f

r1.bottom+=1;

& s7 O" ] M, m1 e) ?0 c

r1.top-=1;

" O2 K1 T: A( K$ O L2 G

r1.left-=1;

6 [1 P4 z9 a! q. ^% l

pCanvas-FillRect(r);

" l4 u ? h! _4 A1 b

::SetBkMode(pCanvas-Handle,TRANSPARENT);

7 c+ \$ D9 o% g& ^: e1 R( A

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

: l h( P7 e. j

r.right-=1;

3 w2 I" R2 W/ T& [. p

r.bottom-=1;

6 I( m6 ~% a" {* D, l( l* y( p! \

if(Msg.DrawItemStruct-itemAction == ODA_SELECT

' P6 T9 p6 O: |

Msg.DrawItemStruct-itemStateODS_SELECTED )

]. M, P0 G6 U) A

{

) O* e8 _6 a$ S

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

" p& H- Y, ?3 g% u+ I) Q; W' g

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

" a ]! g# C# C, @3 @

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

- H) b9 l8 j& _- J" I* [3 ?9 B

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

$ y: `# }5 P$ ?* K

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

6 T3 [) ?3 l/ ` Q5 \. }0 ~6 u. V

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

9 m4 g5 k) \5 O2 h+ m) X

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

7 U0 G) {, b* b3 @! w1 |8 l+ Y- ~

}

6 k c- E6 U: h/ j d o) D3 C# [3 n " K. x. L n/ i- ?$ S1 {, Z0 E

}

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

0

主题

0

听众

4

积分

升级  80%

该用户从未签到

回复

使用道具 举报

lynli 实名认证       

17

主题

4

听众

266

积分

升级  83%

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

    [LV.3]偶尔看看II

    回复

    使用道具 举报

    Z7XOB        

    1

    主题

    4

    听众

    411

    积分

    升级  37%

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

    [LV.6]常住居民II

    群组Matlab讨论组

    群组数学建模培训课堂2

    群组学术交流C

    回复

    使用道具 举报

    凼凼        

    0

    主题

    4

    听众

    64

    积分

    升级  62.11%

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

    [LV.4]偶尔看看III

    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-6-14 12:12 , Processed in 0.462778 second(s), 80 queries .

    回顶部