QQ登录

只需要一步,快速开始

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

如何自画菜单?

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

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

$ D5 e& T" k9 x0 ]( V! G: L! w' a

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

! M' _6 z$ e# V5 ?

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

" Z% C2 c j D9 S/ _+ C

2 e( u; Q: L- ?0 G/ h

//头文件

1 p$ e1 Q# c4 x2 Q+ [; R+ u

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

( v( L3 P9 o5 v' B

#ifndef TestMenuH

$ ?, \7 ^$ s- g6 h( T1 R/ e

#define TestMenuH

3 ]3 ~4 r* _+ S8 H

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

* s6 c9 j* U3 y+ c: J, ~4 l# d& h

#include Classes.hpp

$ F5 x3 }: K" Q( o3 P

#include Controls.hpp

1 Q7 i: f( l( o6 c7 t& Q

#include StdCtrls.hpp

7 }$ R5 r; f: Q

#include Forms.hpp

" Z5 N: q% E; x T* Y

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

( N; L1 ~2 S1 q8 p" f9 D; g9 e9 Q

( D! [9 T, Y1 Z7 V) I1 Q+ Q+ S

class TForm1 : public TForm

0 l& K, z9 [, ~) R

{

8 `' q+ U/ c! e9 K! f: q+ U

__published: // IDE-managed Components

( }2 ?' y. Q K0 r U; z" W3 w

TMainMenu *MainMenu1;

, N$ R1 [ C# Z4 l4 q5 U# j7 i6 L

TMenuItem *aaa1;

" j T; q( I% _

TMenuItem *aaaaaaaaa1;

. @0 o# v5 s. z" [6 J2 i7 \: N

TMenuItem *ccc1;

0 u0 H* t5 t. \2 [4 ?

TMenuItem *ddd1;

/ l/ X6 x3 L3 Y3 u

TMenuItem *eee1;

0 t9 W. D7 f1 G1 T; `

TMenuItem *ddsds1;

( }9 M& Q. Z+ a7 T. n/ Z" N; S3 N" _

TMenuItem *fcdfsss1;

! F# m9 H! _* Q" Q1 k: I

TMenuItem *dddddddd1;

9 @: L9 ?$ ?6 ]- B- w

void __fastcall FormCreate(TObject *Sender);

6 b) X* ]4 ]! C9 S Q4 d

private: // User declarations

: _; s$ p9 H- [$ A& |

void __fastcall Modify(TMenuItem *pMenuItem);

6 v f( x' j7 m Z) f: ~7 |

protected :

: r$ M a: H8 Z; K) H

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

+ _! Z; O k; E

MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);

$ U0 M W/ U: z |* y) w

public: // User declarations

* M; D& x/ \9 l: c) `4 c, t

__fastcall TForm1(TComponent* Owner);

# A% O0 n/ s) K/ |8 v/ O* r

BEGIN_MESSAGE_MAP//添加消息映射

4 s# T/ M, p: }7 R/ @7 E( M

VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);

7 s, G9 [) K! s! k0 M9 t; g

VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);

0 [5 V& J9 E9 K/ u. C* s8 x/ }

END_MESSAGE_MAP(TForm);

- I- ~; D8 P ^" q6 g0 G

};

# Q+ \) Z! k6 J1 b G/ W% [

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

" a% T! u" q: U2 q s" J+ L4 ]4 j

extern PACKAGE TForm1 *Form1;

: V' }3 u; {% @9 F" A0 U: p) x

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

4 w) I+ {9 q; T

#endif

8 z7 ^( j8 S/ N. f1 ]8 v- F

0 ]$ S" @. d: j7 D0 [

//实现文件

5 {* c6 ^+ s2 d! ^# M

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

; @/ F8 p' p; L" E" z$ ^

#include vcl.h

* s" y4 h! R7 q

#pragma hdrstop

! Y& j4 ^/ n$ E, `, J

% B+ D( Y8 W; ^, P4 i8 i9 ^; F. n0 ^

#include TestMenu.h

9 G/ p' l3 u9 L

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

. V& s2 l% h; M

#pragma package(smart_init)

, n: {4 a( ^' j) Y& M

#pragma resource *.dfm

+ {& C G1 m. c% r: y8 `6 h, s: N

TForm1 *Form1;

- M. a5 U# z% f1 H$ X2 j4 c

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

- t0 h( c9 Z8 e/ X7 \ A H

__fastcall TForm1::TForm1(TComponent* Owner)

; o2 q9 U& b' p8 Z8 W" u

: TForm(Owner)

$ A+ O. k0 P1 J& L* V0 a# d$ n6 e

{

3 q' e8 K3 M% L( I; f' R6 g

}

$ H0 x+ u7 r3 R/ \ V+ j9 h/ G

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

* l: V) b8 m6 V7 e! P- }) N& z

) N) s L& C$ b# Q, m/ l/ S/ j' t

void __fastcall TForm1::Modify(TMenuItem *pMenuItem)

; L1 `0 Q* x6 I3 V# M5 C

{//修改缺省属性

# E$ K* U7 X% q$ [ e

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

& Z/ E1 d" n6 K; b

{

9 _6 _" E+ \4 _" A! v, l

MENUITEMINFO mii=

1 w: C+ h- T6 S0 _! |

{

, L- x8 f3 O0 g) F5 e4 [$ m

sizeof(MENUITEMINFO),

0 U# C2 D+ L' A/ W7 R5 G- O- {: ~

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

$ m" T9 D- D$ z) s( I; d

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

7 y4 ]6 _3 f% C5 M3 S

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

/ x+ ]2 F4 P1 u+ m$ _0 X* [: Z

0,

' y( z/ Y* b. Z7 |4 B* P. K3 K) r

0,

. `( R; a/ M% n

};

; p* m6 i! I" n4 `( F

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

5 }0 o. {& G6 M8 L/ Z% p+ m

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

- x9 D* B5 x+ I$ t2 [

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

& F/ A; y0 F% I: u) r7 Z

Modify(pMenuItem-Items);

0 V+ l* e: `4 k1 j% E

}

" U4 h ?% J. I6 c: v6 A! C

* g4 u7 |+ @" _' e6 `- S9 B

}

, w$ q- @3 f& O1 R0 ^

void __fastcall TForm1::FormCreate(TObject *Sender)

L2 k; { j' [" k! Y* E& F

{

y2 Y2 ^5 k! q. z6 k2 d1 c

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

7 v+ X! ~0 R* t. Y& H' u* @

{

$ h. a: v7 {& ]7 q5 n" u& d) M6 L

Modify(MainMenu1-Items-Items);

8 K3 C7 Y2 p2 J( R% V8 ?2 s* {8 `

}

8 j: A' ], F# l n! k1 d$ M

DrawMenuBar(Handle);

' o7 e. b4 F2 s7 {9 c# s

}

2 T2 w$ ^" R4 M6 E- Z8 n

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

5 \* r$ M/ ^% N

void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)

2 M3 U9 B9 b! ]9 x, w) u

{//设置菜单大小

/ u' n3 R( ^9 o' W* t* c

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

; F% r, T* ~' W- Y

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

+ m* O& h1 L3 f

Msg.MeasureItemStruct-itemHeight = 20;

$ n2 J5 v8 f8 I3 z# n( j7 u5 h

}

6 R6 r4 H; f" I4 n+ x3 l

void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)

* r9 G$ F, Y. C2 h1 j

{//画出菜单

4 ^8 u# Z! M9 b" Z, y# r

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

3 I, M( }# Z2 G2 W* l5 f2 z) d% `

TCanvas *pCanvas=new TCanvas;

& k3 S# K8 I( V4 z* Y& H7 }" U

pCanvas-Handle=Msg.DrawItemStruct-hDC;

, T+ b+ P, M2 [. ?# E- [5 }1 r6 }$ r

RECT r=Msg.DrawItemStruct-rcItem;

/ V; R4 \9 @( _. ?+ h% w

pCanvas-Brush-Color=clBtnFace;

+ T* n8 H# n7 q; V+ G8 _! v( S( ]

RECT r1=r;

' x! F: ^9 w& N5 S% ^7 K

r1.right+=1;

! |* W W6 i, W, b/ F

r1.bottom+=1;

5 H6 l- s1 N0 t& W# D3 A

r1.top-=1;

" g' B2 U$ m% i u. }# g

r1.left-=1;

1 \* _# b5 j9 J

pCanvas-FillRect(r);

& ^) r* S N* Q) F/ P& m5 ~2 ~3 h

::SetBkMode(pCanvas-Handle,TRANSPARENT);

' W- E0 u: `# t$ t; A9 |) s

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

7 y0 H9 L# _) o+ s+ I# m

r.right-=1;

) r; ]/ M% B# n

r.bottom-=1;

$ s! ~& z& ^" n& k6 o

if(Msg.DrawItemStruct-itemAction == ODA_SELECT

# M" u: r/ a8 I2 A

Msg.DrawItemStruct-itemStateODS_SELECTED )

9 \. t3 F7 ?+ B8 D8 `& v1 k8 ^

{

- D) G$ h: K% s0 @$ u+ Q. m

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

" Q0 p8 R: d# |1 F

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

: ?' W' S! V" P

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

) S0 A( w C! l, ~+ @1 s

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

7 p/ m" |$ i7 x0 x& U2 b* _

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

) I2 p, B* g4 m" J, T! N! t

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

7 B/ k& p5 d' r8 f2 m

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

$ G, u; I" c) b9 q* L3 _) A

}

2 |4 @, J+ _; ]; w0 i$ e; T a) M- W. e6 n1 }/ V# F; o% @: L

}

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-6-14 16:15 , Processed in 0.416409 second(s), 82 queries .

    回顶部