QQ登录

只需要一步,快速开始

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

如何自画菜单?

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

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

4 r9 h( }: F3 a, H4 D' a

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

/ t& }0 ?# G6 G2 R

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

) t" U0 s k' Y* Z m7 _" p3 [

$ P8 H* \/ x. n1 c! H

//头文件

. |+ F9 [* S" Y7 u% J( ?

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

8 n% y- K1 B3 x

#ifndef TestMenuH

! q- M8 l+ F1 k+ r# n3 l

#define TestMenuH

) s8 Y7 j; ~* W5 w7 T0 y+ `- }

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

W: R8 l0 \" p4 G" @' t9 m7 g

#include Classes.hpp

, q. o! n( ?" d( H4 k) g+ L$ h4 Q; r

#include Controls.hpp

# p8 H+ x2 z1 g& I

#include StdCtrls.hpp

3 z: E8 o1 j3 B( `

#include Forms.hpp

/ d ~) e4 \- ?0 w

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

" v& b% Z$ r. p# \; M

% I' e! S* k$ F

class TForm1 : public TForm

7 K1 k% a. w1 }$ ]7 G% C8 ?

{

$ q; q1 q4 l! W, D+ Z5 h. R

__published: // IDE-managed Components

. l; d$ T& ^+ A* a+ F4 q

TMainMenu *MainMenu1;

2 ` s3 o" l5 z+ K& X; p- `; [

TMenuItem *aaa1;

: r/ v: k; N, M0 h( k( @

TMenuItem *aaaaaaaaa1;

/ P I* I: P: Q8 S4 H. G- `

TMenuItem *ccc1;

. L9 f- J `8 u9 X: @& ]$ g4 \. b7 f

TMenuItem *ddd1;

/ ?) s+ J! B" F- f( Z; |! l

TMenuItem *eee1;

" u# t. ]1 A( y- j5 w7 J s

TMenuItem *ddsds1;

0 y$ l* y0 k1 j; d w) {& k, X9 J1 }

TMenuItem *fcdfsss1;

_0 x: A- T: O# ~

TMenuItem *dddddddd1;

* o/ x5 B& a" |; `$ p' M1 y

void __fastcall FormCreate(TObject *Sender);

, L+ I, o# D: U0 q

private: // User declarations

4 N; N9 I' s8 y, m& W1 ~

void __fastcall Modify(TMenuItem *pMenuItem);

6 D+ F% `$ y! U- R& d5 ~

protected :

2 {$ o3 F1 a Z- E G

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

/ K( M0 s& `: B; J) S/ ?+ R

MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);

9 ]8 d/ u* P& t9 R

public: // User declarations

- W% N" `; r2 K7 E# e, Y( C

__fastcall TForm1(TComponent* Owner);

$ r! c& L d; g% r. c+ @

BEGIN_MESSAGE_MAP//添加消息映射

u& x) ~: h' o) b% w

VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);

0 H' h7 z$ @+ w i5 e8 h

VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);

, M/ E; z1 K( q! x+ V$ G% ?+ \

END_MESSAGE_MAP(TForm);

k6 t1 R: {3 [) |, u

};

5 f5 V! y9 i/ o z# ]: Z$ s+ n

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

b& j* D3 v( N! u

extern PACKAGE TForm1 *Form1;

c& i L8 p+ w1 U2 E$ A

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

_4 _* S4 L. Y* y. @" }

#endif

# \( x: u# G1 }9 \- c" I; \/ ?

; x& P* A! ]* R1 ~/ Z/ @

//实现文件

# _) w6 [. `; H7 |5 u# a" @

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

. P$ k! K& _( q+ b. H/ P9 d9 [- H

#include vcl.h

# J( X/ u h. n& [1 S

#pragma hdrstop

( g' q J0 y+ t$ s6 s/ r

" |$ [ E: k8 J0 C

#include TestMenu.h

! `" t3 a2 P$ m K& S

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

9 \0 [7 W7 C' f, g3 r7 f

#pragma package(smart_init)

* D O+ i! J/ M+ {3 O& r

#pragma resource *.dfm

( k9 |7 d. f. x

TForm1 *Form1;

~; h N. @) k

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

; f0 y w: n) B+ i% q8 P' V4 ` _! X

__fastcall TForm1::TForm1(TComponent* Owner)

+ s1 X3 J( [! x& F; X. X

: TForm(Owner)

3 m" n+ P9 [2 m2 W f$ ^% O

{

' b7 Y3 v3 h# S5 x K, V l7 C

}

4 x, o) q% o- Y1 X5 u7 e: p

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

4 j8 K& e! p9 a: g

' ]# P* _9 M* R$ u8 D. a" M2 O

void __fastcall TForm1::Modify(TMenuItem *pMenuItem)

' N, i$ d2 {5 C

{//修改缺省属性

7 V9 ?$ }9 c) {( n8 ]& f

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

$ C4 O& r" b! w+ ?9 p& K8 R4 h$ x

{

4 U; c2 l; \; q

MENUITEMINFO mii=

& F3 W3 {1 O+ R2 ^6 A/ F# \& X# A# \ Y

{

1 m$ [# r. T& p% f* P# Z$ p

sizeof(MENUITEMINFO),

3 L+ T# G5 Y) I8 P0 A

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

! ?* {; F' [$ S5 B8 |1 F1 }

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

! h0 h9 D( E/ a8 K

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

! B9 R+ v1 w2 x$ l& k7 }2 x3 B

0,

1 t& l8 K9 h- {6 p0 T1 r& m

0,

+ ~$ Z( ? ^, H3 @. w

};

( s U; n& w; O3 i

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

# e. }' H: V. ? m" h: o

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

: W7 N* h1 @4 J& K2 E

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

* y, K- X: K# ?* J

Modify(pMenuItem-Items);

; Y% E- ?* i& F; x% T' C; N8 [

}

) I/ V, a. H7 C. c

! e& F& N2 U) [1 k& n

}

* d$ G# t2 \0 ?0 b( b( q

void __fastcall TForm1::FormCreate(TObject *Sender)

4 z2 x7 s6 M# e4 A: n/ b# A) o9 t/ t

{

5 i6 |! w+ R. G% |

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

3 W5 x8 Z( Q7 f7 j8 B$ {

{

* [, L* q% Y. I% g, L* g! j( n

Modify(MainMenu1-Items-Items);

( r$ @9 I* @0 ?0 A9 G

}

; t; o: k7 p- w4 o

DrawMenuBar(Handle);

X9 l; | n8 u2 z

}

* h/ P; T* P$ ]! U6 D+ U+ Q% @

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

/ N9 ~% [) f8 x' x4 |1 V. J* Y

void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)

* [( a) }+ D- @3 }* M T- s H

{//设置菜单大小

c3 |7 w' p" n: S$ J* _

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

$ @. J4 i4 f1 q/ S& n/ r/ M! w8 D

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

' [3 m' @1 ^3 a+ d

Msg.MeasureItemStruct-itemHeight = 20;

' ?3 X3 N. r* S" t- D+ _

}

$ I6 Y7 o3 r1 c( \$ {# b, o

void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)

/ b) m( I$ x' j: c" u

{//画出菜单

- F, d! y7 l5 d9 F

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

& j! _9 t* { h

TCanvas *pCanvas=new TCanvas;

* W" n4 ^6 J' B% F

pCanvas-Handle=Msg.DrawItemStruct-hDC;

% O8 _ U, b- A" G# C

RECT r=Msg.DrawItemStruct-rcItem;

7 x6 j& e- D9 ~* y

pCanvas-Brush-Color=clBtnFace;

' c6 p( y/ r) V& A& Q8 p

RECT r1=r;

5 c, ]) S7 F: J" x/ y- L

r1.right+=1;

& W/ M1 ?0 q1 f- S( a( m( B

r1.bottom+=1;

8 C8 e/ l5 C- d

r1.top-=1;

# j3 M+ X$ K3 D4 M8 Q: ]

r1.left-=1;

- `7 X7 x9 _$ x9 I6 m4 Z$ w

pCanvas-FillRect(r);

- y) L7 e8 r1 b7 s& D% ^0 @

::SetBkMode(pCanvas-Handle,TRANSPARENT);

! w6 B# g7 G7 G) ~" r

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

! e* S0 y8 b, ?8 L% t# o5 O

r.right-=1;

, w* X* s2 }0 r2 W: y) h

r.bottom-=1;

$ x' w$ a! D: N2 m+ c* ~9 ?1 L

if(Msg.DrawItemStruct-itemAction == ODA_SELECT

/ i2 S) E1 k# e2 k) {

Msg.DrawItemStruct-itemStateODS_SELECTED )

5 I3 Y6 q+ R. [

{

; @% b3 M; Z# v% B9 I. x

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

3 G* x; f3 w8 Q) E" A

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

# P5 i; I% p- D# t

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

4 Y r2 w" S4 m& y

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

! W% {6 K- [9 r- j

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

) {3 V5 l! K) F

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

K: c, M6 a; M) L# C: }

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

x0 [+ X% k1 I

}

9 m* f# n3 G! b0 h8 t ( F! u6 A! c3 t( c3 P Y6 M

}

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 18:11 , Processed in 0.379349 second(s), 81 queries .

    回顶部