QQ登录

只需要一步,快速开始

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

如何自画菜单?

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

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

. p. J4 [ B( B" `

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

, _8 @3 M/ h Z6 A0 O' |

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

+ h" v Q/ o/ O1 U: \: \5 Q

% T7 r& p& L) b" O/ j% Y# n. d# P

//头文件

, e0 \! `. B5 E* l8 {

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

) s! [$ d! r+ {* N! a' H

#ifndef TestMenuH

0 |8 @8 A" w/ }, F! |5 [

#define TestMenuH

: T3 Z5 o& Q& Q) U% P; c

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

2 Y4 R, o* c9 f7 P

#include Classes.hpp

5 f* J' Z& F0 G+ w+ s

#include Controls.hpp

1 m% l( k9 z% I; S

#include StdCtrls.hpp

. q1 m1 `' q3 b+ S5 R# ]& e0 a& e

#include Forms.hpp

2 @% e, r2 ]9 V" S2 q$ X

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

" b; ^. P% H* Y5 O+ o5 {8 R0 C6 h

* Y) ]( A6 ]+ c2 \* n, j4 h) L ?9 S

class TForm1 : public TForm

/ T( r K# i0 m% m, u$ @

{

1 |. s" B. d" R$ \$ _, l- o

__published: // IDE-managed Components

9 a1 g# Z, n3 S6 J

TMainMenu *MainMenu1;

, m: |0 `$ w6 [ O( n+ A

TMenuItem *aaa1;

6 U: C* r2 V* s; H

TMenuItem *aaaaaaaaa1;

; L- P( H: R: Z" {& u

TMenuItem *ccc1;

! G- |9 W6 F! G# P5 m+ \4 Q

TMenuItem *ddd1;

; g; x2 M- t% L1 x

TMenuItem *eee1;

% k0 ^: q, ]( l: N" c

TMenuItem *ddsds1;

9 z- U4 k; A4 d4 e' N4 m

TMenuItem *fcdfsss1;

, }6 g$ T: ^) b; j8 q/ w" y

TMenuItem *dddddddd1;

1 b9 [2 d4 M1 r2 T9 e D: y

void __fastcall FormCreate(TObject *Sender);

# H1 c! H) Q6 J

private: // User declarations

4 E4 B7 T8 _' \! T1 P

void __fastcall Modify(TMenuItem *pMenuItem);

" X6 f/ [9 f# |' |

protected :

7 ~# G: r3 T, a. P

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

: G: e# k- Y, c" p( \+ ^1 Q

MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);

3 A5 x6 C6 V0 B0 k+ F9 Q5 G& s% U

public: // User declarations

% y* ~- y( D5 }) f+ q+ z, X+ V- P9 b1 n

__fastcall TForm1(TComponent* Owner);

% h0 K. g) O0 ^$ N' \9 o

BEGIN_MESSAGE_MAP//添加消息映射

% I. E9 _; O( s) Y# V: V

VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);

' L+ [( Z# s! D

VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);

5 V, ?8 x- S4 Z0 N6 |9 j

END_MESSAGE_MAP(TForm);

5 i4 h* z( Z, J% f8 H6 K

};

/ {/ F: x4 C5 L! P' u

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

4 O" L) q. o& T" q1 W' I

extern PACKAGE TForm1 *Form1;

; K W( T9 Z. ^# ]" ^' a8 S( D

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

3 b3 J% j) Y* Z9 c6 {: q

#endif

% g5 D: m9 |2 m. |

2 y; h. F7 O- R: z: ]6 i

//实现文件

+ E& r! R0 g2 G) b1 n

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

2 }# b- D7 \. ?" g A) u

#include vcl.h

) \, ?. T2 f$ f7 k

#pragma hdrstop

6 {- Y2 s! N4 G) J

2 V& h+ M) @. A, a& q

#include TestMenu.h

" b7 c2 U5 F2 A5 p6 L

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

I) ]2 S& p1 G7 o1 E ]) V

#pragma package(smart_init)

' _! x3 D6 @: g* M4 X/ ?

#pragma resource *.dfm

# E3 L8 H n* t

TForm1 *Form1;

0 o( o y7 u- a% Q1 n

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

3 I! U; N9 Q' g/ ~

__fastcall TForm1::TForm1(TComponent* Owner)

( s/ C' k2 V1 P! T: B

: TForm(Owner)

9 p/ y( Y7 U* H, x. o) E$ V

{

6 _& R7 [( o M! x- g5 z1 J3 X7 p

}

" n# v- X& X9 N

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

9 K& ?5 [$ X1 Q" u, z1 a I

6 c0 `* e' X% a. j

void __fastcall TForm1::Modify(TMenuItem *pMenuItem)

4 M- p7 p% M' v% a1 v1 X

{//修改缺省属性

( ~6 X2 ?# {" N0 H

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

: @8 d2 e/ n, h4 a0 B1 ^. ^* `

{

; X x! x7 ^/ q' z' ~0 O

MENUITEMINFO mii=

, n# [9 B4 j: A6 V8 V; \

{

! j% A W0 n! C3 L* q- l% }

sizeof(MENUITEMINFO),

2 `4 q$ W3 X9 U- u, Q; ^

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

" U, u; @5 B+ F

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

+ [: `) u9 ]9 `2 s, F- l) A

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

/ P E2 k0 \& }' H( C: n

0,

8 z# j$ `8 J% z5 x5 X5 z% \* c

0,

" _ e& s6 Z. c1 n9 a

};

, K7 i3 ~' O. ], i

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

7 Z+ V8 x5 F& J8 g: Z3 W- M

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

3 A3 K0 D7 q: ]/ u4 z) F1 C8 k

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

0 d# O, ]! s9 n- d7 [

Modify(pMenuItem-Items);

' W8 o' i7 y/ c$ F' ^

}

3 r# `5 D5 C6 |% O+ t$ ^# _

* b1 ^4 m& k# [' U7 Q" t3 l8 _5 P

}

' }) K2 y& ?, b

void __fastcall TForm1::FormCreate(TObject *Sender)

) k# S" V' {& [7 _* |# w

{

3 X6 _1 l3 a6 D4 T$ ~4 Y) K

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

/ L. x7 k5 T! {# _, h

{

4 K9 U7 t$ P" i

Modify(MainMenu1-Items-Items);

Z7 E% T* ]8 a+ x

}

- n$ N `9 M& ^

DrawMenuBar(Handle);

( `% Q4 L" W1 A* k

}

, i7 N2 U4 H. i- ?3 q# g

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

) {$ o# |- R& r2 B6 T; N

void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)

% w) |' m2 e, ?9 a+ f! a1 w

{//设置菜单大小

$ m3 e9 W9 l5 u

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

& y( e5 S( u! t

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

3 |+ A8 C' y! F. d7 N8 v

Msg.MeasureItemStruct-itemHeight = 20;

; A- F7 T" T& K9 o2 u

}

+ y% q* j- D2 G

void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)

/ l6 m# q2 R, I1 m

{//画出菜单

7 X# e) s- T) a' s' V9 t

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

7 ]) |- } K; ? H6 f$ ~

TCanvas *pCanvas=new TCanvas;

6 _1 j' w/ K5 o( O/ j1 y

pCanvas-Handle=Msg.DrawItemStruct-hDC;

3 v4 ~) }( h) f- ~' M

RECT r=Msg.DrawItemStruct-rcItem;

2 a: U: N0 ?/ E, e

pCanvas-Brush-Color=clBtnFace;

. t; [/ R. e a/ m" r: o8 g

RECT r1=r;

& B* n7 {8 o9 x2 k! y; `9 l# Z( D

r1.right+=1;

g: L' Y# B1 d" J8 a. Y

r1.bottom+=1;

% e: v% A/ U6 \) x! L, w5 k/ I# h: }' z

r1.top-=1;

4 v) @5 k! {$ |6 J& u

r1.left-=1;

1 M* r. P6 V/ q4 Y; s7 K8 r

pCanvas-FillRect(r);

& A3 x/ Y! ~0 G7 f2 ]* M9 b

::SetBkMode(pCanvas-Handle,TRANSPARENT);

! f* J# o( A% T- m! y

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

1 v" N# q( z" b; O* K+ y

r.right-=1;

3 U ?: Y) r3 D) [* j

r.bottom-=1;

3 `7 r& ^2 {5 H D& o& ^

if(Msg.DrawItemStruct-itemAction == ODA_SELECT

$ a( ~1 L+ B/ a6 ?

Msg.DrawItemStruct-itemStateODS_SELECTED )

# }* m8 K$ h2 X% c; i' n# t

{

" {7 ~6 I% a2 r" N

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

1 K( `& E* _6 j* v

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

' B! f( R: a6 B3 ?

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

, W; _4 @+ C; X; K" q+ ]

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

1 D |0 g2 K0 U3 S9 n# o. ]- [, W

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

) C7 r) [) h& v

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

/ }9 i9 c5 w% k, E

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

/ R+ K. ~" p+ @% w

}

- ^& X6 ~* o O, c a" }' p' ^) R* G3 V6 b( z4 g$ m, T

}

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 08:12 , Processed in 0.485453 second(s), 82 queries .

    回顶部