QQ登录

只需要一步,快速开始

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

如何自画菜单?

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

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

3 W% j$ O$ o0 g$ H6 A$ Y f

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

; M/ V/ E( f7 g. s

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

3 |! Q' Z! a( D* l+ Q/ ], f. {

- w5 T1 f- r8 ~- k, U8 J- d

//头文件

& H% a, s n: j2 \- e2 p) F

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

1 _# \5 `; Z0 [0 q# z% _( T3 N

#ifndef TestMenuH

1 P/ l5 u6 K, `1 X/ k

#define TestMenuH

# m4 b7 G2 F% W$ ?2 ^ s) r; H

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

' F; {" }" K. J3 E! \( H0 w, H

#include Classes.hpp

/ x0 B% f2 x% w4 m# e$ g2 w

#include Controls.hpp

+ M) P7 Z$ u3 H5 }, l7 N

#include StdCtrls.hpp

' d! V) B5 z4 E

#include Forms.hpp

/ y$ i4 e7 ]* b3 n

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

- |1 q: G: D _

A# E9 ]% G: r: T2 P( ^+ G4 e5 `

class TForm1 : public TForm

3 f. |* Y# u- A" q

{

; Y6 A: ^4 Q* E1 M3 p9 S5 V7 s

__published: // IDE-managed Components

% H, g( Q6 |& m4 G9 I

TMainMenu *MainMenu1;

( E# _5 @8 M, R$ |6 t+ p0 i' D# R! {

TMenuItem *aaa1;

, {' d6 d8 ^8 ~/ f/ m5 K

TMenuItem *aaaaaaaaa1;

+ n J' j, l# e

TMenuItem *ccc1;

. x& {( o& I% z: D% q

TMenuItem *ddd1;

z6 ^, E6 `; w4 P8 s1 G

TMenuItem *eee1;

4 D4 H1 i; y$ }+ ?* ]6 u; M

TMenuItem *ddsds1;

1 J( ~1 ?- b( ]# a C

TMenuItem *fcdfsss1;

) X( Q( k) L' y" r" D7 L3 l4 Y

TMenuItem *dddddddd1;

" I7 z- v& W2 p- I |

void __fastcall FormCreate(TObject *Sender);

# s5 N8 O' O) l7 o0 D

private: // User declarations

1 M2 g4 T. n. d6 R8 e

void __fastcall Modify(TMenuItem *pMenuItem);

2 h7 s0 \9 Z& }/ Y$ F

protected :

* e( T& R6 q2 c; O* t1 X( m# ~

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

M- [% k. I9 V+ _3 H# F

MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);

/ d3 Z: f, T1 B/ ^

public: // User declarations

" d$ f, q4 y* |% g; W1 X

__fastcall TForm1(TComponent* Owner);

6 X- b% y, c2 [% f" L) T

BEGIN_MESSAGE_MAP//添加消息映射

1 s2 _0 e3 w: K% `4 ^- d8 P! E! h

VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);

% K& R1 n# j' Z' h

VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);

1 o( C- ~# O" i4 G. ~5 ^" x

END_MESSAGE_MAP(TForm);

# \8 E3 [4 P9 v% j

};

' r" V' h" r( N; g l1 J

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

2 L& V8 t+ c" J. H

extern PACKAGE TForm1 *Form1;

! H* {" B1 f" c" K3 n

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

0 M, C. N6 @9 o, x- I1 z

#endif

( |0 P( U% j5 C

0 V6 M; u# S6 Y e

//实现文件

! |5 P# C, I, y' c. [

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

% P" z/ a( N# [6 ~7 y6 D+ d% T4 Y9 f

#include vcl.h

! G7 u: b' c, q5 O/ K" ^6 M

#pragma hdrstop

) Q* H3 Q/ g* _) a# c9 R

) H. F ?9 `% \& \% e% @

#include TestMenu.h

- H% i# P: N# \

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

, }7 s7 O+ V5 h! D$ G* Y

#pragma package(smart_init)

* S6 l% j7 n1 w

#pragma resource *.dfm

a8 e3 ~7 r% ]% @- |! d4 V

TForm1 *Form1;

" J; J4 ?( L( s/ i- I, |* Q* G

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

7 M; n: N& v' f, w, k

__fastcall TForm1::TForm1(TComponent* Owner)

' x4 X, P' p0 ]/ p6 Y& c e

: TForm(Owner)

3 M! L* a6 M/ |! Q3 {" f- J& N

{

# l# N% I4 j- W6 G( z

}

9 J G1 J6 }" a6 G8 Q7 G

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

3 d6 B- H; @: J2 l# m8 v3 ^

s; g2 k* }% V3 _8 r8 @

void __fastcall TForm1::Modify(TMenuItem *pMenuItem)

y& Z* W& u9 G

{//修改缺省属性

- [0 g) o# w5 b, p9 s7 r) M# ~$ w# E

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

: a D* b" _, d7 v8 U

{

2 r; t9 o8 @ d& n% N3 n

MENUITEMINFO mii=

0 J+ X5 G( N. j0 h- I

{

5 a# E& ^/ L6 j9 h2 M% Y/ ?3 \

sizeof(MENUITEMINFO),

8 }0 N7 w9 s* `3 Z6 [1 m3 p

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

( G7 k. k! `0 u7 Z. `' b4 X" r& ?1 I

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

6 e& Y- F! t$ |

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

. M7 D3 l# W6 }2 Y3 C, h2 P

0,

- ~7 r- g& I* `, a4 g& p1 o

0,

: W% g) A! V5 U( C

};

% Z! z. o& z0 g3 t J l- g

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

) r7 r( g1 i( c0 O+ Z: @

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

8 P: x/ \$ Y( F0 R! u

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

. _/ w( I$ }/ m( a% `" _6 d

Modify(pMenuItem-Items);

7 S' K; T' F* C) _

}

( `7 A0 @) F) {

" c# I+ @8 c! |/ I' s& @7 x

}

% `0 H& p% Q) M7 ?8 d

void __fastcall TForm1::FormCreate(TObject *Sender)

5 r; s7 r& {2 c; F5 ^

{

% \9 j/ k$ ^& P9 m$ L

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

; D- n$ m$ v5 B4 x+ N

{

/ e: [+ Y1 M8 q: P" N: g/ }( j

Modify(MainMenu1-Items-Items);

; [! m2 Z% V( y! ?9 J% e- S! E

}

; V! B2 u& P$ ?

DrawMenuBar(Handle);

' }: X: i: x# K# ~! C o) q

}

' H2 ^+ C9 P9 G) }' |) [! W

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

+ a. L. r0 W- m" U5 K2 ^" A8 c3 \

void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)

7 K0 K% A) o: D5 Y; m2 J

{//设置菜单大小

7 }9 i( f+ u/ K! j

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

0 |+ w' T' G) G2 W3 C7 K

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

6 H) f( p$ R* B6 O3 w5 A

Msg.MeasureItemStruct-itemHeight = 20;

) r- q, s# |5 [" H L8 u

}

' Z. ~" c8 S3 D% L- G' H

void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)

5 H2 R$ V. X1 E

{//画出菜单

# K U; ^( G/ D# D7 y

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

9 }! `, M8 V2 r) Q6 W

TCanvas *pCanvas=new TCanvas;

0 O9 ^" H" P* F! S

pCanvas-Handle=Msg.DrawItemStruct-hDC;

8 @. u3 _4 B* B

RECT r=Msg.DrawItemStruct-rcItem;

' V4 {* |$ W9 c$ {9 z$ `, |

pCanvas-Brush-Color=clBtnFace;

; f, H: t9 Y0 H) v" n, |5 S u: V

RECT r1=r;

: }6 q m( ]! i! g) D

r1.right+=1;

~; i$ w. ]; {+ i+ O

r1.bottom+=1;

4 R" ~: g, E9 W3 |, G* C: Y

r1.top-=1;

# V2 h3 T) b& `

r1.left-=1;

, b+ B: p. c: N

pCanvas-FillRect(r);

2 h7 R, H+ t9 \6 z) E( K. o. `8 D+ k

::SetBkMode(pCanvas-Handle,TRANSPARENT);

7 ~; p& x# S2 V" r4 t

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

3 P! ?. A' p2 V1 h; {8 y

r.right-=1;

. I" A5 Q( B1 U6 O$ o

r.bottom-=1;

6 ?2 U& R8 y+ Q1 i' I7 ` L# `

if(Msg.DrawItemStruct-itemAction == ODA_SELECT

& g0 r$ U' g1 P0 k0 Y

Msg.DrawItemStruct-itemStateODS_SELECTED )

- z- Q% Z0 _, [/ W' k

{

% {7 a4 G* A" \+ W

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

v! |; Y4 r8 \$ q9 y& z

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

$ @0 Y, l/ x% H9 Z

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

0 ?: V! K/ y' Y# A2 Y0 j

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

0 @6 [, m1 m, P3 _6 X

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

$ I6 ]4 v3 J( u/ W1 }7 \( E

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

1 [; o! H* A g6 b- r( z5 t8 u% i

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

1 d, l1 t0 B! U

}

2 t% R' f; b+ r/ E y 8 w5 V# @- ~( `: F0 s7 x

}

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-10-17 06:34 , Processed in 0.400486 second(s), 82 queries .

    回顶部