QQ登录

只需要一步,快速开始

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

如何自画菜单?

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

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

. Z2 Y3 J, @3 Z# `. ^

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

0 e& n: y4 W- k9 w5 m: @

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

" F0 o2 U( \4 n

( `5 L+ Z4 c& @& t7 u" n$ h

//头文件

5 { |( q2 G& K1 L) k

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

: C' }7 Q/ d6 P: P

#ifndef TestMenuH

1 F- l) b" i8 }% P. `, q

#define TestMenuH

2 j4 l1 A+ g* Z

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

) H+ N$ }$ G4 x1 S! F: K% n' d/ m0 l

#include Classes.hpp

8 N2 {, u& S" d+ T2 Y/ I* w' S

#include Controls.hpp

K9 g# H ^* Y' K" {

#include StdCtrls.hpp

1 t, m6 T/ m, P& p; ^1 E

#include Forms.hpp

8 j* b6 u5 X, i

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

% _/ L* @$ _3 J" M' }( p) j

; E( b/ ^6 V1 X& s0 ?! g

class TForm1 : public TForm

- z0 r- E$ G2 m5 R8 x

{

% D; n, Y- m2 `; L% l

__published: // IDE-managed Components

" j+ [' y! D) [" a. q

TMainMenu *MainMenu1;

: t+ B. R: q/ ?. ?" C* }& _

TMenuItem *aaa1;

% F+ @8 |) ]/ q$ g

TMenuItem *aaaaaaaaa1;

" C6 |2 M0 I3 O8 e4 ~

TMenuItem *ccc1;

# ~+ c$ L) r: m

TMenuItem *ddd1;

- P- R9 T* c1 @

TMenuItem *eee1;

# A+ N9 z. @( V1 \) d

TMenuItem *ddsds1;

) r+ u& a0 I f2 A

TMenuItem *fcdfsss1;

1 B0 d. l4 b7 m1 K

TMenuItem *dddddddd1;

2 [! T. D) D* C% ?% w

void __fastcall FormCreate(TObject *Sender);

6 x; g( Z/ C* E+ A% Z( e

private: // User declarations

1 Y( u; Z0 C1 U6 J! U. ?

void __fastcall Modify(TMenuItem *pMenuItem);

! _4 y+ e F7 ^9 r

protected :

: d. [& [2 b5 `0 G, q. ]# ~3 O

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

% u$ ]; K& ` `7 b0 K- M

MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);

4 y/ [( b8 {" ]* {* Y

public: // User declarations

# g# i( `2 E. @& ?3 b4 s

__fastcall TForm1(TComponent* Owner);

4 a, e6 I7 c7 q: g2 j

BEGIN_MESSAGE_MAP//添加消息映射

: n$ j+ a4 u" m

VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);

. y$ p- b3 |1 T: m2 @% C

VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);

9 ?) ^# j: _# Y5 c

END_MESSAGE_MAP(TForm);

- X& A, f$ c; @8 T3 m- E0 ?

};

8 w. R- n4 X# Z8 Y, Y

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

' f- Z' ~( T8 m$ H4 h

extern PACKAGE TForm1 *Form1;

$ p: `8 [3 x* ^, B

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

2 X" ? w8 D% u" Y

#endif

( k! z% k C5 x& k

5 K% v' h! T5 o8 c, C9 B

//实现文件

3 N+ W, h6 a. Q& H$ H

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

! z3 t: y4 l/ @: y* B# p

#include vcl.h

- y6 l4 l; C( A, J% W

#pragma hdrstop

- A7 d. X5 z+ j/ v# I; k; Q+ _

* g( o# Q, L# l7 R

#include TestMenu.h

8 L7 s/ C! T h

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

; b9 ?/ n1 w" E& c. x8 C: M

#pragma package(smart_init)

9 v, v) _% a6 G& |$ F

#pragma resource *.dfm

* b8 u! }) k, D$ T

TForm1 *Form1;

# `3 }1 H; r% H

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

& F+ ~: y, |% @6 K# ]

__fastcall TForm1::TForm1(TComponent* Owner)

5 e% b$ A1 {& [% R

: TForm(Owner)

6 \! X$ ~: m) I

{

1 ? j- L; T( n1 d! B/ H

}

! T; m6 \4 q: ]( ?# s( g; f

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

9 q! }% m" i4 b, a+ j" A1 `

7 Q- b1 T0 b4 ?! W7 |- B* ~

void __fastcall TForm1::Modify(TMenuItem *pMenuItem)

1 r/ y; I8 d, S/ P! E9 I5 y1 P

{//修改缺省属性

* T4 E- |2 C0 j# d$ {

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

L3 y5 x1 R* H0 l

{

: J8 Z: C; L, w8 C# i* v

MENUITEMINFO mii=

B3 q6 c2 I7 m) x: d4 Q" b& y

{

' W) z& _' f! x8 q

sizeof(MENUITEMINFO),

5 s. c' P, z* l e

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

5 {: p. l( h3 l8 ]% c& \

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

3 G U" V4 e1 i

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

C, ^& @8 ~3 m: A, |& W* k0 b

0,

3 `3 T* D' h+ ]7 y5 X

0,

, D$ R' X8 g u

};

1 |9 G/ f& Q( }2 R- \* P

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

! }' |8 O2 E/ q! Z

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

! Z0 M6 I: @) W8 }

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

7 R+ M1 r2 j" ~

Modify(pMenuItem-Items);

1 O N- r3 @* t7 p+ t$ w( J

}

2 r9 Z" ^9 z( q9 D! i

/ q5 C: f, J% o' B' l

}

" I9 r3 ^+ ?7 {' s" h k

void __fastcall TForm1::FormCreate(TObject *Sender)

3 O" t4 @( m5 W

{

6 D( Z& R, d" I# A

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

1 R4 j$ n' T j

{

) Z0 d% a. j% U, M

Modify(MainMenu1-Items-Items);

# x" I' m. N5 j; H* f- Y8 p7 J

}

r( R- R# m$ ?

DrawMenuBar(Handle);

6 T: A$ U o/ y& I D

}

" `2 H- J$ q/ H1 X

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

; h% z# v3 M: _1 d

void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)

+ r. v( t4 R0 @

{//设置菜单大小

# H% N7 t J! Z4 y6 W% b8 r7 m( R

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

b0 q! V$ |% n2 B$ r) d. ?

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

) J/ ^, y1 f7 T( G2 Q- |

Msg.MeasureItemStruct-itemHeight = 20;

- l* d$ p/ @( k( `& e p

}

) l1 }3 z' @) Q5 J0 U- u1 D

void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)

) S8 V9 ~ f" A/ l% W

{//画出菜单

- p, F* [ c4 U

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

- ? Q8 \# A* r# E" H. Z6 {

TCanvas *pCanvas=new TCanvas;

4 z7 d! `) t) W5 V& Q

pCanvas-Handle=Msg.DrawItemStruct-hDC;

+ c; X) C/ N# R$ V

RECT r=Msg.DrawItemStruct-rcItem;

$ L9 M8 ^/ R$ o: `. l, N9 Z, R( O

pCanvas-Brush-Color=clBtnFace;

2 c- w# x! l2 |& q T+ H

RECT r1=r;

6 X) |: E+ r. Z

r1.right+=1;

- t' X* B9 Q9 @

r1.bottom+=1;

+ Y; @/ [3 b) a7 U8 L* ~3 Q( `

r1.top-=1;

- o- i; d$ X8 a+ t$ O& c

r1.left-=1;

( R3 B; c2 ]2 y/ v1 m a

pCanvas-FillRect(r);

1 V' v3 @( O8 E( C" H4 r# a5 f8 x

::SetBkMode(pCanvas-Handle,TRANSPARENT);

& ^- P2 @, ]* K

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

6 i9 P ~0 n! N3 | y0 \3 G

r.right-=1;

7 ^1 S1 ]& D0 R

r.bottom-=1;

3 N9 ]! N9 O2 T( q1 Y

if(Msg.DrawItemStruct-itemAction == ODA_SELECT

) d; |% h6 e" x1 V a$ E) u5 Z! u

Msg.DrawItemStruct-itemStateODS_SELECTED )

U- f9 z$ c4 F' g( v: J8 G `

{

. w4 s" `2 M( A! o$ w7 e

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

+ G2 x I* J) E% v) M) [) l! l# P

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

6 B- H. N4 N% R/ A

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

# u$ v* C# z! [# a5 t) l/ Q- Z

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

! n2 p# R7 ]+ `3 y) L

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

' s0 a, x7 P3 u

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

4 ?( R; a7 j- U, H1 h9 H

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

2 M$ ~- N* `2 ~5 D* ^

}

, q/ O. J0 s: o- |' ~+ w , C; e7 N7 b2 o, Q4 u, a, G+ r. c- ~

}

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 20:12 , Processed in 0.713041 second(s), 87 queries .

    回顶部