QQ登录

只需要一步,快速开始

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

如何自画菜单?

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

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

6 a, g) @. o1 \: ^* h: F+ p* Z

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

# |% g% n/ j( l9 N

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

- @6 V+ c! }. n

" M g1 u! J q' Y! x

//头文件

2 N+ S/ Y% @$ T

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

" P0 B% ?, ?8 M5 k

#ifndef TestMenuH

' W6 B7 u! T s$ _! R; j, r; E

#define TestMenuH

7 ^+ C7 u) h {8 T3 q O( ~2 }% J* p8 |

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

: B( Q) K. i/ N6 t; r

#include Classes.hpp

L: s- j" C8 K7 M# u# ?. q

#include Controls.hpp

7 P2 F3 l! b7 ^$ v$ P0 ^; e

#include StdCtrls.hpp

8 x( G) \# v N T* {* |

#include Forms.hpp

# B6 u: i2 P1 l

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

9 H% v+ Z! _, L0 h( G6 B

7 p+ d, K. U3 F! x9 ^0 B

class TForm1 : public TForm

9 f( _& }! ~; v, M, ^

{

. m( I6 l; Q$ Z

__published: // IDE-managed Components

( ^" P7 q2 X: S; F1 x8 C+ {. @

TMainMenu *MainMenu1;

/ I8 C+ @- c3 J/ P% z

TMenuItem *aaa1;

h) J! a4 U* o0 f( L: w# M

TMenuItem *aaaaaaaaa1;

' O& r$ d4 ]& T4 _. ~$ U1 g

TMenuItem *ccc1;

( A/ Z! H3 I0 g0 g& a

TMenuItem *ddd1;

2 ^! e7 K2 E9 `9 d

TMenuItem *eee1;

3 z' b3 j/ I& T) c

TMenuItem *ddsds1;

- [/ [& B. J# u7 l

TMenuItem *fcdfsss1;

1 z$ f9 z# Z9 w# b8 D

TMenuItem *dddddddd1;

( C+ D3 g# U) K* W' W' V6 t+ P7 b

void __fastcall FormCreate(TObject *Sender);

/ T6 V! _4 S2 \

private: // User declarations

" r9 X k+ I, @( |# O3 ]8 J3 m

void __fastcall Modify(TMenuItem *pMenuItem);

3 r5 {/ S- Q# m& h$ }8 U9 h, \8 \# ^

protected :

, q: g' T2 M9 n

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

/ O; L# ] a5 {$ N& ?+ d

MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);

% A* ~1 [9 f3 _ p4 X: J; j( i9 F

public: // User declarations

% S/ k$ U4 Q6 @& y; p* K0 _

__fastcall TForm1(TComponent* Owner);

- B! T u) {" D) T( v: S3 {

BEGIN_MESSAGE_MAP//添加消息映射

p1 q2 O6 W; p; \

VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);

& |6 q! M- P" ]) }( ~3 a

VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);

' F& O% f1 R5 P

END_MESSAGE_MAP(TForm);

, N2 L% u) }3 ~0 ?$ {

};

+ T" M5 r, n8 G. Y0 U( p9 K: ]7 Q; S) H

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

" Q o- J1 ~! ~8 a

extern PACKAGE TForm1 *Form1;

# Q# C0 U8 }# U2 R

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

$ H+ c# n4 s9 `4 m' J* \/ D" }* G7 u

#endif

! `- f! V; B6 b) J1 N" j) R2 I

( P" I l4 @7 l! U5 S7 I

//实现文件

' x) i- q, } L

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

2 T1 K! @+ D) O9 ~# Q* ^; Y2 P

#include vcl.h

2 q9 ?* V" u& } t2 |9 k7 s

#pragma hdrstop

5 ]& T5 e* C2 Q3 w0 E9 {2 |

4 a$ U P2 d" i. b4 k- s" G

#include TestMenu.h

) p/ Q( v7 @1 Z- w( O4 b

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

- Y$ h% h2 M; U

#pragma package(smart_init)

7 m' C! F3 z' p0 H# R7 x

#pragma resource *.dfm

" v' e, _3 \+ k! Q$ p

TForm1 *Form1;

# S ]- K5 |2 e

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

5 _0 ] i! G6 \" J; ?/ z

__fastcall TForm1::TForm1(TComponent* Owner)

& }. R+ R) x6 _4 C6 C

: TForm(Owner)

9 h! O' w' Y! N% F' P

{

: a) B. A2 m" @6 \

}

4 N7 K2 |0 Z; Y4 {3 h

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

( Y' J# R0 T. x; z5 Q! Q

2 z9 C+ M2 M+ x

void __fastcall TForm1::Modify(TMenuItem *pMenuItem)

* m9 n' D( O- E" J# }

{//修改缺省属性

, Z1 r1 G `) x; T

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

' D* h& y: P; `7 @) R3 W, C

{

4 ~7 N9 A2 T1 Z& z& m7 o9 F

MENUITEMINFO mii=

s; `, {& d+ k* K; Y

{

# |/ T3 d( \, f1 F& j" j# W8 n

sizeof(MENUITEMINFO),

! W6 z/ J" ]. U; K6 b" D

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

6 N9 q' M1 m( O F" b! g

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

9 K# p! N# ], [5 f$ n4 X- z

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

9 ?/ B2 x* E. v# P* ]' p" X) J$ w

0,

1 d |; U+ Y! I) S5 F

0,

$ `$ Y" M# Q Q: ] i3 a

};

* N$ b! m1 C) }- M1 g+ {: v

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

3 c( d3 Y' f; W5 c

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

3 k- ]$ c# H8 }9 M

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

) u' n/ l) g- C) m4 P! B

Modify(pMenuItem-Items);

6 ]8 k) `0 |" G3 f# {: P

}

8 \6 R6 |! q+ z6 z

) ~, w7 ^! R" V( D2 ]

}

% B1 c3 `& ~) H; l: N

void __fastcall TForm1::FormCreate(TObject *Sender)

. b* s9 Q/ h6 Q( t5 E7 t4 F |' a* A

{

; L% V; p; L; j* ^

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

9 c6 i- ?0 d0 n R

{

8 G& k. e# X. H

Modify(MainMenu1-Items-Items);

& S( E, n, S- h4 m: ^+ X

}

3 ~. }- j5 g8 q* U$ p" t; }

DrawMenuBar(Handle);

1 R9 F# v, f" X& t2 H

}

7 K/ Z0 I% U9 |/ P) V/ U1 R- j

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

2 [4 m7 @7 |5 D" }

void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)

1 w: @7 ]/ r* G$ X

{//设置菜单大小

: M; F. G# x' p9 l6 ~ T8 J1 w

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

+ V! _4 R7 g C

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

! q' z" H7 l0 T0 X: x# O5 G

Msg.MeasureItemStruct-itemHeight = 20;

" |) l& ^9 t4 {

}

& z( p# P ?* ?4 m7 W

void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)

% |3 h3 M) r0 K; O5 b9 I

{//画出菜单

, N& K+ \1 Y: i; u r

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

6 R, g, d! i1 q" t X# M

TCanvas *pCanvas=new TCanvas;

" m6 c* B3 K& L3 l0 Z

pCanvas-Handle=Msg.DrawItemStruct-hDC;

f4 {4 n( u3 U; b" L* w8 a% g6 V1 X; z

RECT r=Msg.DrawItemStruct-rcItem;

1 P- W: j5 c) c. e. q

pCanvas-Brush-Color=clBtnFace;

, w: B$ V t2 p. N

RECT r1=r;

' {& Y" J% `- F

r1.right+=1;

# H2 }" z0 b% l

r1.bottom+=1;

$ s6 [& \- M) |

r1.top-=1;

% x" W: L& J1 f9 ~ Q

r1.left-=1;

8 w5 E) D8 u; T7 |

pCanvas-FillRect(r);

- }; B8 b; s' j; x5 i. ^% o

::SetBkMode(pCanvas-Handle,TRANSPARENT);

0 ] m0 I( K( v$ x y6 p

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

. Y/ X% N9 G$ G9 Y3 i

r.right-=1;

: T* g7 c L% q, x4 b8 Z6 }; [

r.bottom-=1;

$ o# K+ V# p( g0 ^5 O; q

if(Msg.DrawItemStruct-itemAction == ODA_SELECT

! N9 d8 D! W6 e! v: Q

Msg.DrawItemStruct-itemStateODS_SELECTED )

* _ K& M# a8 l4 M

{

6 S6 N/ Q2 s& z, }

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

5 S8 R( C) ^& d, V+ o K. ^

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

0 z; Q f( r5 X2 t4 i4 Q

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

7 t2 l# X) m6 u- M

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

# E- Q# x, B, v' k

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

, q. j+ f7 u9 n: n+ n9 Z

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

1 }" P4 d# i7 Q) R$ G

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

4 P f% W: N: p% ?

}

: }1 M" D/ T# h* F" V' m/ n% |- E% F7 @2 Q

}

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 08:14 , Processed in 0.375446 second(s), 82 queries .

    回顶部