QQ登录

只需要一步,快速开始

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

如何自画菜单?

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

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

6 M2 h; K, d1 V% v9 J+ E" g

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

) B% b$ |5 @ D* W4 b

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

- ~3 D- z! x) X/ |; }

I& z& ?4 A) G4 m7 h3 a

//头文件

$ F7 b& b* x4 [# ~

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

: H, d0 z S6 B( O2 L2 f

#ifndef TestMenuH

2 i* r+ L* t( \9 t3 ?

#define TestMenuH

/ x5 P; q. K/ N

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

' e$ r" v1 s0 D, W& {' q8 q

#include Classes.hpp

' S# t4 M1 U/ B3 D

#include Controls.hpp

Z( p& H/ g8 }: B) D

#include StdCtrls.hpp

- O( \' [9 Q- J- F

#include Forms.hpp

1 t: C6 w6 g* {1 c

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

& n3 n; S) s4 Z! S! E. q

4 V+ }* G. M7 Q

class TForm1 : public TForm

. U5 Q7 | g1 I# @

{

* y+ q2 ]$ q& E& C+ a7 n* y

__published: // IDE-managed Components

* ?0 Q$ L; \) ? w0 a' l- A

TMainMenu *MainMenu1;

9 G5 }0 h% ^7 Y6 t) Q- A+ s

TMenuItem *aaa1;

5 Y4 Q9 e) \7 a5 Y! O9 A

TMenuItem *aaaaaaaaa1;

) m, U% W/ q8 p ~

TMenuItem *ccc1;

0 D% K% b/ d/ G* b

TMenuItem *ddd1;

( T& y4 _& \' {& M% H! s' J+ \

TMenuItem *eee1;

2 ?4 d8 b7 v7 q0 ?: {

TMenuItem *ddsds1;

4 ~( J9 Z- f" C9 d7 Z/ r

TMenuItem *fcdfsss1;

- m; ^2 b8 V1 x

TMenuItem *dddddddd1;

0 ]- A* ~9 L9 v) L

void __fastcall FormCreate(TObject *Sender);

: V- q: y- b& ~8 a' u

private: // User declarations

& y. M. `8 @! U/ f1 ]- i

void __fastcall Modify(TMenuItem *pMenuItem);

3 G9 H5 b0 ~0 Y8 }8 P' i8 F( ]

protected :

& Y. ^$ @, B* G# a' n# c" j$ |8 R0 [

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

1 d2 N7 Y7 p9 f* r& m b

MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);

9 X+ \% L. a0 A$ ]7 m) l

public: // User declarations

4 o5 Y6 i' O5 F, W8 ?7 P7 C! t x

__fastcall TForm1(TComponent* Owner);

$ S6 ]/ R; |* i E

BEGIN_MESSAGE_MAP//添加消息映射

9 X3 X. C) M& ~* j- \

VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);

( z: _5 a* I3 [

VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);

: V5 U8 V* F7 S6 C' I# V6 n z

END_MESSAGE_MAP(TForm);

& x5 H' q. ] U7 e3 k" `

};

- f; V6 R Q5 p6 s: `; _+ y

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

8 s4 E" V8 H) ]

extern PACKAGE TForm1 *Form1;

/ m) [2 w2 I+ v+ j( G

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

* ?6 X+ f7 b9 W7 ~% l* ?

#endif

8 B, u* y/ y$ _4 h. T8 w/ c* ?

" I: |# ]+ x ?. `$ o8 R6 ~! F

//实现文件

' S: i; [& `5 K

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

' O$ Z; R5 {2 }3 E2 V! E

#include vcl.h

9 ]+ ]) L- [* I

#pragma hdrstop

' Y4 N: G% u) u: x0 N. r# {

Y# n8 n3 g" b% z( Q/ L. a

#include TestMenu.h

/ T3 U0 j0 a; y( X( p! U. D

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

/ k& M) n( E& D* g$ o

#pragma package(smart_init)

! m5 \! a2 U5 G0 j

#pragma resource *.dfm

$ n5 f1 ~9 _) `7 q" f

TForm1 *Form1;

( u5 _8 |( R3 @+ y: p9 X

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

# s1 Q1 d$ H& J7 i3 n$ u( j

__fastcall TForm1::TForm1(TComponent* Owner)

3 X+ N+ R y E" z; {+ Q q, y7 m' ?

: TForm(Owner)

. u' V( B f! S4 u2 y" c1 L

{

" y5 ?3 @( W7 R: m! z! a; {

}

5 Y0 u% O G% y

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

) p4 R% J& J! S2 Z+ i9 }% Q

( P: u- W2 f2 T5 B" b$ t$ E

void __fastcall TForm1::Modify(TMenuItem *pMenuItem)

4 [8 c1 n" E& o: I

{//修改缺省属性

: B$ y8 r: p( J! R

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

/ f2 F4 A/ h# s2 b

{

3 k# u% W; y* X" `2 Z9 r0 q

MENUITEMINFO mii=

; _* ?: T5 P% Q# D

{

* N' O$ s* j& e# ]4 L/ B% E* r

sizeof(MENUITEMINFO),

5 l% d' {$ F# }* I

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

9 W& [7 A0 K& F5 q/ }

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

5 l% ^$ g0 X& f3 d$ t7 x/ D

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

" P1 n( s4 d% C& q2 R3 W- S

0,

6 k; o" `( _* h+ s

0,

, E+ ^2 r$ u) {1 Z

};

6 e, B; ]6 I3 C& }. z9 F0 `

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

; |, n! W$ R; E4 D- v# m/ h) u& z

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

' C2 a4 g( Y; [. R; Q; X8 v

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

! R" o+ \1 Q4 Y( p- l, M6 b) |$ w

Modify(pMenuItem-Items);

9 z# s+ m4 a1 z2 T+ q

}

7 J8 b' W4 ~" _$ u/ h) j

8 G' S# s4 V( m$ c8 v

}

1 X* e- S/ B: q; Q" v$ d3 q6 }

void __fastcall TForm1::FormCreate(TObject *Sender)

- S1 U- I8 f8 t1 U0 p. j

{

0 ~% j- f& X4 ?: r4 I( L& i

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

5 T; ]3 n0 Q1 L" L) T! u- _6 E

{

7 m# A% w/ |, k0 Z

Modify(MainMenu1-Items-Items);

& c8 z! N; ~$ {1 ^! d

}

5 ?+ u0 ~! D. R8 K) M/ ?

DrawMenuBar(Handle);

9 ]& x5 C$ S1 Y/ {

}

: _* ^8 N0 U( Z/ J3 a' w) V- b

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

/ Z! {; s* C) Z% C& ~

void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)

* m, m" c. `* l# \

{//设置菜单大小

$ f `: X/ z0 z" J% @

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

7 j" y* E5 A+ L8 O

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

' N; n8 G0 b3 G% g# Y6 x

Msg.MeasureItemStruct-itemHeight = 20;

" e1 G& C; H Q' \9 ^6 ^

}

* }( W( W8 g2 T0 v' g4 _

void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)

" m9 f. N3 c: a3 f9 X

{//画出菜单

X5 u" A1 @! U0 `" a7 J# Z# p x

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

3 v1 e1 f" d& a; t! T

TCanvas *pCanvas=new TCanvas;

5 \. b& y, x% e5 w' Y

pCanvas-Handle=Msg.DrawItemStruct-hDC;

; ^/ \1 D R- V) [( Y4 |9 m% ?

RECT r=Msg.DrawItemStruct-rcItem;

: Z" y. Y( [4 v( `

pCanvas-Brush-Color=clBtnFace;

5 S6 N$ q8 f7 U& s! X

RECT r1=r;

/ a4 @/ |, A# {; p

r1.right+=1;

4 U( |+ l+ _0 R3 U! k8 L

r1.bottom+=1;

. D- \. J, d, o* A

r1.top-=1;

) o) u& D, B0 v2 [, }" ?

r1.left-=1;

0 P) ~' {; A3 `

pCanvas-FillRect(r);

" a6 o% ]6 I p* `: o

::SetBkMode(pCanvas-Handle,TRANSPARENT);

% X8 T# ^% w: g

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

: P6 m9 [ X7 C% x& r9 I

r.right-=1;

$ ^5 n0 N5 r8 T9 k; m, _" ?

r.bottom-=1;

0 T3 ?& b4 {- i7 j" o

if(Msg.DrawItemStruct-itemAction == ODA_SELECT

, G( ~ B& T9 y$ `3 L& ~

Msg.DrawItemStruct-itemStateODS_SELECTED )

2 h4 D8 x: i8 b# O. S9 Z

{

$ Y" i2 b$ v' @$ [2 h' E$ W3 @

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

6 |# Q E1 _, D% X. D% A

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

! E) g& G( g' a3 w% A1 [

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

) @* [8 }! n6 n# d' U$ w

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

8 F" T2 q) p5 D7 w+ o! f

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

]* [ ~8 B" W& k

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

; N4 S$ h" v" v

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

, x" Z7 g4 n: F0 d

}

% P* D6 }2 [ t% r4 D% W7 t3 n3 m4 u8 j7 j1 {- ^

}

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-18 06:43 , Processed in 0.466374 second(s), 82 queries .

    回顶部