QQ登录

只需要一步,快速开始

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

如何自画菜单?

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

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

" W" N4 B# E; E0 ^

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

2 x ]2 K1 r9 F1 A& R, t' x1 X9 \( ^+ \

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

/ h. N$ |* P# \- _- p( S

4 e! J+ t( }/ I$ s' o. [: H1 p

//头文件

" F% s) H! v7 y+ M

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

0 G) W9 D# x# W/ A, [8 y. A, f

#ifndef TestMenuH

& T- s1 U w ]6 p* Q

#define TestMenuH

& K$ J& }3 l$ L4 C. l/ V

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

3 a- q, k: Z% B! A/ R# P

#include Classes.hpp

^6 {# j5 x/ Y

#include Controls.hpp

1 K, E+ I4 f( U, S2 _! X/ e! L

#include StdCtrls.hpp

" G9 \( k I% I' ^; ?

#include Forms.hpp

$ s& I( p1 C1 Z: S1 ]

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

; P( ^" [& G# z- a: J# a

& J# y# V5 {8 f: |4 k

class TForm1 : public TForm

5 _3 Y! S7 R: l+ `% W! E$ [

{

7 Z* Y7 O6 X- t8 K! x

__published: // IDE-managed Components

7 @" G7 n" E) c$ I# L& C, q

TMainMenu *MainMenu1;

0 S4 ]5 X& A2 g# x- x; S6 ^$ o1 J1 a6 F% I

TMenuItem *aaa1;

( B/ | M/ {, f( k; k1 b

TMenuItem *aaaaaaaaa1;

2 g6 y( Q, n/ J

TMenuItem *ccc1;

; s5 i2 c/ F; k8 @. ], w# B

TMenuItem *ddd1;

9 p; M) f `' Y: V& U6 V! y/ G7 p

TMenuItem *eee1;

0 v% r! ]' s6 h

TMenuItem *ddsds1;

/ t. _ Z) `& e

TMenuItem *fcdfsss1;

! O: j9 D2 F4 w( f( H2 Z H9 I% m

TMenuItem *dddddddd1;

, C- c- m9 E! X. b( |" x8 o

void __fastcall FormCreate(TObject *Sender);

8 U( [ |+ u! z( L L1 f, t" C

private: // User declarations

; S. n9 m8 e2 k$ Y

void __fastcall Modify(TMenuItem *pMenuItem);

+ W- D1 n- L% \- g

protected :

5 L( Y- V9 W( |8 q

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

2 C+ s" e, ?, U, g

MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);

1 \9 S; O, X9 f3 O; k0 v# t

public: // User declarations

# V$ Z1 C0 o* Y$ M) U0 B" f# D

__fastcall TForm1(TComponent* Owner);

$ N$ Y( U3 B! I5 l

BEGIN_MESSAGE_MAP//添加消息映射

" C: B0 r" q `' B$ Q/ I/ {# V# B7 r

VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);

9 u& W! h7 O9 i& g

VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);

) u2 s. V$ [, a, w& q( C, Z

END_MESSAGE_MAP(TForm);

6 R+ l3 c/ T$ }" R, _8 @/ W

};

( z3 o5 e& \ j5 {* Y# G. T1 _

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

! Q& ~/ c4 c. ?& G2 F

extern PACKAGE TForm1 *Form1;

$ `( b7 b5 `) C4 u6 J

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

( Y# Q6 q, }+ q0 ]+ ]! P

#endif

, W7 `% O1 C! l! `- V

; S+ L, u$ O: v# H( o7 t

//实现文件

8 w0 H. x2 \+ {

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

1 B) I; f/ E K6 s& ?4 K% u y

#include vcl.h

4 k0 D" k1 \! I3 L' M: P! S

#pragma hdrstop

( s! x s& A* o9 B8 j6 b

$ G1 m+ h! X4 H# H

#include TestMenu.h

# c' M7 n( M2 j

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

$ }- _( G8 \5 x, {" O3 t6 n

#pragma package(smart_init)

/ _7 A9 N! n2 u; b. I& j' K

#pragma resource *.dfm

$ V6 t0 O2 u/ [' |6 O% Z

TForm1 *Form1;

6 b! F- @2 \7 Y2 [! E! j- x' I0 @# ^

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

0 r9 P5 n6 o7 N6 J1 h

__fastcall TForm1::TForm1(TComponent* Owner)

: M$ B# o4 Z2 V" Z; R' X

: TForm(Owner)

% Z' S& c/ L) y

{

/ Y" w! {" k" |

}

' \9 ^1 b6 H3 g/ g$ h- g2 j; f" R$ ?

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

3 c7 E% T/ Q3 W! m% r

/ h" n: O3 T& l

void __fastcall TForm1::Modify(TMenuItem *pMenuItem)

8 V0 {1 b' L. I' |/ ^

{//修改缺省属性

! N. B% n& [) `

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

8 _6 M7 u- M2 D2 X* ^

{

! B' a3 T" L6 C/ l

MENUITEMINFO mii=

) J' z- U4 E4 |

{

: f* H) p8 C f5 f- k# Q7 d# J

sizeof(MENUITEMINFO),

) ]# H+ D$ f4 {- N

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

$ M( E; J# S( A8 Y8 q. d3 D% R

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

/ f `4 b: d# e& z

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

% H, l% [2 i( A; [

0,

4 f; V( s. ], O& Q1 a D

0,

" _# L$ L$ I1 u) D$ y, i) ?

};

% @2 C! \- n8 Q B

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

+ R9 [. ~& y6 x. {9 @

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

6 E) S6 r( c5 z. B% }/ L6 t3 m

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

) {( K0 ^. W7 b8 M

Modify(pMenuItem-Items);

M5 A' L8 b& X7 P* w9 X

}

, _5 q# X! Z+ h$ P" u6 G

- @' Y8 i" g9 Y3 H

}

+ m9 U) J$ t0 {1 O

void __fastcall TForm1::FormCreate(TObject *Sender)

! { `/ s5 w, u8 j$ j" [) M

{

6 _& ?, R+ ^6 R& R! D0 A1 I" ]

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

) q1 { ]% T% H: b9 P3 }9 x

{

6 K) |( R ]2 u- j

Modify(MainMenu1-Items-Items);

# D0 I3 H! O" \) Q( D. N" S5 Q4 F

}

5 n2 R+ r6 c' t9 Y5 @. L

DrawMenuBar(Handle);

3 v, E, K5 O3 N3 |6 j, b

}

: R7 ^1 [& U; g; M, b

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

9 c1 G/ u5 d" m. a; C

void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)

, D# X. H1 o1 P: d

{//设置菜单大小

6 c# t3 V' F, C

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

3 u# E) Q( w3 E0 C* S( A

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

$ D7 `' B, g0 d1 ?5 f) Z! O

Msg.MeasureItemStruct-itemHeight = 20;

0 W# @' q0 J: W% J

}

t$ b3 m; E* W5 A. R- L$ T

void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)

* x8 o; V# s$ h

{//画出菜单

# D3 v8 ^. C1 C9 f1 s1 r F

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

$ a" g! j; h6 y7 e

TCanvas *pCanvas=new TCanvas;

* o5 b. F/ F* ]1 L+ m" K) T

pCanvas-Handle=Msg.DrawItemStruct-hDC;

9 S: w+ F- u7 \

RECT r=Msg.DrawItemStruct-rcItem;

9 U" u. ^+ w0 z4 ^* ?/ I6 H F# _) J

pCanvas-Brush-Color=clBtnFace;

2 p5 o! R4 B! ?* M

RECT r1=r;

4 j G3 S$ b+ h' U

r1.right+=1;

. `) o# I3 R' R4 p

r1.bottom+=1;

0 }" v5 [, N9 u( B7 A+ V

r1.top-=1;

& J: g/ |: [( u4 `8 u+ G

r1.left-=1;

9 O E. q! P/ j7 ]! n

pCanvas-FillRect(r);

. T7 H; ^& [4 Z# G* f) m& o3 B

::SetBkMode(pCanvas-Handle,TRANSPARENT);

* q# Q; T% M- @" d# ^: k

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

- K4 \* D* i$ r0 h

r.right-=1;

9 x! i3 [* ^2 d% r; A! V* I

r.bottom-=1;

6 s% H' \' C& H f) t* i5 s

if(Msg.DrawItemStruct-itemAction == ODA_SELECT

- l0 v. B% \1 M( y$ k& E5 A

Msg.DrawItemStruct-itemStateODS_SELECTED )

; V( d" O N! ?8 S- D/ p& I

{

: W- U6 }3 {# c

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

7 J, L3 Q# W5 @3 ?: }1 ?

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

1 U, t+ o$ I0 z7 L) I) ?% R( G

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

; v% j1 m4 M1 n9 k& w

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

! f6 @! Y6 ]- ?# M

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

! @; `) S: M. z' e& s# E' x# L

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

* P0 Z) ~' q; J

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

6 [7 c, M0 \- j7 f! H5 u

}

U- M+ a% [: R% z ' }& f0 S2 V' V8 b. K0 V) \* B& W

}

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 07:06 , Processed in 0.477385 second(s), 82 queries .

    回顶部