QQ登录

只需要一步,快速开始

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

如何自画菜单?

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

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

" X3 F, T7 k9 C4 g

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

/ f1 b- _% W5 q) I# _

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

l8 n0 |5 K' x' y8 J) |

7 h( ?6 z) T8 P. v/ A

//头文件

( W& l) H+ H& h. S2 e) h

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

( H/ N! U4 _3 ~) B$ O/ d

#ifndef TestMenuH

2 W7 E/ I, ]8 c" C& b% f R

#define TestMenuH

% n8 ^: @ A: l7 f- X! R, O _

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

! a3 t0 E+ c! ~4 v R

#include Classes.hpp

- T% R/ _0 J5 ]# R

#include Controls.hpp

2 [ x1 x4 {+ f; W, L. Q1 _

#include StdCtrls.hpp

! K/ {' i/ E/ o

#include Forms.hpp

+ w4 j" K; L5 q: f& e

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

$ D% m0 D+ N0 }* j& [; P

# G. A3 q! r+ k' u" z# f

class TForm1 : public TForm

9 @$ z# R2 q( K8 u! n' A4 Q

{

0 r9 f4 y; A. H X

__published: // IDE-managed Components

% `8 f9 F' R& {; e+ V6 r5 x% \& i `

TMainMenu *MainMenu1;

) Z# A: t% W1 I1 F. f" K% F3 A

TMenuItem *aaa1;

, n0 R9 `: z8 U: f

TMenuItem *aaaaaaaaa1;

& t, |5 P+ {; F% e9 F

TMenuItem *ccc1;

) {5 i( ^( D5 L% m

TMenuItem *ddd1;

\% Y) g' G/ z3 e

TMenuItem *eee1;

5 K* ?; T f! I* Y: N$ J4 M

TMenuItem *ddsds1;

' ~5 J s4 {5 ?3 s. d) [/ ^

TMenuItem *fcdfsss1;

# o) B* {- {5 k5 a9 r3 f: Q

TMenuItem *dddddddd1;

* `0 i- V9 a! }( A

void __fastcall FormCreate(TObject *Sender);

\* x/ e5 r9 E- h

private: // User declarations

0 P1 H; V; S* b: [

void __fastcall Modify(TMenuItem *pMenuItem);

5 E1 v3 \) T0 p8 |9 O

protected :

: G$ [& N5 O' V1 a" v/ g

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

" R' K6 L, v8 `* L$ \, m+ ]6 b" d

MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);

# N9 |, [ Z; K1 E8 e& B9 R( ]/ Q

public: // User declarations

6 q1 [* b" Z0 R7 S* r

__fastcall TForm1(TComponent* Owner);

1 W7 O+ Q) \- z3 V. h

BEGIN_MESSAGE_MAP//添加消息映射

/ t# h: R6 E \8 @& a% `% }* r

VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);

1 ]: }: o/ R1 U8 T- a% `8 B

VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);

+ E p1 Y; |! v# y6 s4 s5 c

END_MESSAGE_MAP(TForm);

1 e5 h# R4 y8 _2 M

};

! t% M: ~! h+ D3 i; ^% I: u- @

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

6 `) m' s5 R/ S1 u2 ]. X

extern PACKAGE TForm1 *Form1;

& w( f! z. w3 O {' u

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

! `, r8 g1 S) U5 ~% L

#endif

3 g9 H! k0 z6 j ~0 ?3 o* D

8 G* ]( ^9 p! A' ^

//实现文件

4 U* e% e4 s4 d. h3 e8 Y

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

* K' V* Y0 p! \9 U6 v

#include vcl.h

8 W3 x: d6 N" e: I5 a* |5 y3 J

#pragma hdrstop

0 H# [) a1 J! N7 \! Q

% V5 |+ E, w+ F; g( m+ S* G3 P

#include TestMenu.h

- u! Q$ T9 g+ C. {+ ?+ Q

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

& O2 u' t( q( G$ V3 F# Y2 M- `

#pragma package(smart_init)

& s. ]" t. w1 f2 r1 y

#pragma resource *.dfm

$ Z# j+ G0 T0 ^- I

TForm1 *Form1;

4 w2 z2 J* y2 w) c& Y; E

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

& z% W' b _. i2 a6 |- V0 H8 R

__fastcall TForm1::TForm1(TComponent* Owner)

7 V- s" K, e ^# G

: TForm(Owner)

% J1 V4 d* ~0 u/ K% ?+ t

{

9 p M4 P: u8 h" Q1 j

}

5 F; O2 ~5 N1 w6 {% y$ y9 T

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

# W" X& t/ h# Q8 F. o5 J0 u$ q

* B2 e. H0 r: ]1 P$ C2 _

void __fastcall TForm1::Modify(TMenuItem *pMenuItem)

- @" W* J3 t+ f. T" r) K% ^

{//修改缺省属性

% B$ s: H, P7 h, v

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

7 h7 r& _% R! m, t+ j9 b2 a

{

2 T/ V3 l9 {9 Z, P" }9 w& i Z

MENUITEMINFO mii=

& S! @, @+ B0 Q4 L r; ?

{

4 N8 l# k E; U9 Q* c

sizeof(MENUITEMINFO),

4 |9 s Z' g W

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

7 e+ w5 \# f& B! e" O0 J

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

! L1 G8 l2 m* g t

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

{; f) ]8 m2 k# q, G2 D

0,

# i! ~; }1 x5 b. N

0,

0 Y6 q4 D& f* E. \

};

3 \% e. U3 z6 c! v4 e- a7 k% w

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

2 r6 A& ~) W% b! T4 r* K- f# w

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

% h* Q6 A+ z; p9 V

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

) G0 f7 d' Q! @7 v- S T! M

Modify(pMenuItem-Items);

8 L. E, O, n2 O" g( G/ u

}

/ Z& @9 h6 A+ q3 K: ^1 L% U

% l) B& Q& A7 A/ |% Y6 H

}

. X h0 o+ w. f0 Q0 q

void __fastcall TForm1::FormCreate(TObject *Sender)

: C- J9 p- D/ X

{

3 r/ q5 S2 \* {8 [9 l

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

9 f) u& W) q. G2 F2 E

{

! B: R8 J0 g3 L: V4 v

Modify(MainMenu1-Items-Items);

2 p G4 s9 o2 \! Q

}

2 B# b, E$ [- i9 @( J

DrawMenuBar(Handle);

2 C) a9 k& w9 \+ l& ^0 s( p, f0 Q5 W

}

) q) y/ B8 k5 P

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

& J: F4 Y6 a5 @- N: g1 w

void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)

! C/ r5 R7 |* s: k( n8 s

{//设置菜单大小

) v0 G& T4 ~. i1 T- c

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

/ P" U( L7 v! T( ~, n9 s$ @

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

) G9 _3 F$ C; `3 w

Msg.MeasureItemStruct-itemHeight = 20;

, `# X/ o( ]0 V* H) `( E

}

( j& o# M) M! c) |

void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)

! B4 L! R1 N' t+ l

{//画出菜单

/ P/ l+ A9 V$ a, j

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

9 D/ K; D! J \% o& x) C& i8 Y

TCanvas *pCanvas=new TCanvas;

7 ?7 K+ j: O, q9 M

pCanvas-Handle=Msg.DrawItemStruct-hDC;

. ]/ |8 K3 p. ?4 F$ h

RECT r=Msg.DrawItemStruct-rcItem;

0 m6 H' b% A7 D6 K) R( I$ e4 i4 l

pCanvas-Brush-Color=clBtnFace;

7 h; B, c' [" A+ V7 B3 h4 j

RECT r1=r;

1 }9 k5 i" ?6 o& p* a- S

r1.right+=1;

" t, n0 [; R9 D9 |$ K7 E

r1.bottom+=1;

4 A, K, f* H0 `: s8 _5 D

r1.top-=1;

; f/ `" w) G: s

r1.left-=1;

) D! X7 ?$ Q! T: S

pCanvas-FillRect(r);

1 K* x7 A* {8 |: X9 i$ } C

::SetBkMode(pCanvas-Handle,TRANSPARENT);

* A; f( U: R: j( n: H7 I9 \# R

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

! i5 B8 o1 T' L% Y9 U% e( `; j

r.right-=1;

, G4 n1 ]* G6 r5 u8 L& q; K

r.bottom-=1;

; E1 y( w) K# c# e$ c

if(Msg.DrawItemStruct-itemAction == ODA_SELECT

! F; ~" H9 A- \. O) S7 \

Msg.DrawItemStruct-itemStateODS_SELECTED )

8 |, x' U/ I- C2 W0 p

{

# z# Q; z# V0 N* N* s3 r! f

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

' t/ o+ s: l. @, v( g2 |( f* |

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

: y4 f0 }' k" m

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

' p1 u) T0 e* i$ q4 @

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

' |# `' t: [! H3 x5 s& ?

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

" Q7 o( Q& G4 @5 C5 {% [/ g8 R

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

]: N# @5 ?" B7 `

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

5 G" Q G9 B- {& b/ M5 d7 _

}

# n' t3 H1 @2 }3 ~8 n # k7 T; S4 @) }( o/ ]. `3 v+ V

}

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-16 02:31 , Processed in 0.373831 second(s), 81 queries .

    回顶部