QQ登录

只需要一步,快速开始

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

如何自画菜单?

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

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

# n1 e" H' c' G; ]+ Y1 E4 ^$ V$ x

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

& S# m8 f5 i5 g! z8 \9 s

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

1 B* ]; ^% x5 ~- J- z% q8 S

$ P% N6 K9 w- E9 j/ r; A# u1 w

//头文件

* g( B+ ?9 [- K$ _

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

: e! Q2 H( d: `2 E* o/ E! }

#ifndef TestMenuH

* @' r& r5 y" k! f) Z

#define TestMenuH

! }7 ^2 q$ O' \8 b

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

7 E4 e9 r; \4 e$ w' N! B

#include Classes.hpp

& G q% B) c3 V" x/ a: [( ]& z- U( R9 H

#include Controls.hpp

, \& Y9 W0 x: F

#include StdCtrls.hpp

9 r, m- W' J* _6 F0 w L E& ~

#include Forms.hpp

. g! U/ N: |6 q

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

$ m" P1 {5 ~3 m) `+ S

U! x+ j- l% W+ s; W

class TForm1 : public TForm

0 |7 c' l9 W5 x! O

{

: M f& R* C3 @4 X' s4 w, o

__published: // IDE-managed Components

" b: u. u1 v$ B0 E4 v9 E; X6 @. D4 t

TMainMenu *MainMenu1;

$ N( v! o4 y* L c6 O/ j

TMenuItem *aaa1;

. [5 ~9 w' n& X/ i2 y$ M( ]2 g

TMenuItem *aaaaaaaaa1;

$ Q1 F7 t' {1 D/ R8 N/ p- o

TMenuItem *ccc1;

/ r: C! I# U/ w) {' e$ R

TMenuItem *ddd1;

% B- A' e3 D( O: J& l" T! p

TMenuItem *eee1;

5 j& r9 T4 n9 n4 H A

TMenuItem *ddsds1;

: }. U) g: c4 m5 Y* j; A5 Y

TMenuItem *fcdfsss1;

% p* z0 V4 ^! J

TMenuItem *dddddddd1;

8 ]& o6 w n: U) B

void __fastcall FormCreate(TObject *Sender);

5 ^1 `4 x& g& D$ i

private: // User declarations

0 ?. {8 I+ d C0 m( P

void __fastcall Modify(TMenuItem *pMenuItem);

7 u; c$ y" s+ {) K# W

protected :

0 e3 g m. z: S3 P7 @" D

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

- O) N0 M5 Z6 K3 H

MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);

" J9 v8 T& U% s" m

public: // User declarations

6 L. e l8 j5 `8 V

__fastcall TForm1(TComponent* Owner);

& r- [5 `5 t- t, R* v

BEGIN_MESSAGE_MAP//添加消息映射

5 l* c% Q) V. l8 W$ g- I

VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);

' k! E* [; X4 R3 V+ J

VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);

8 u8 A" Q8 [- M# A) W! f3 s

END_MESSAGE_MAP(TForm);

$ _4 b8 a9 I' o; J) z2 B6 a2 E0 F

};

% K- p/ P: u. s, d6 F4 l

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

6 O1 s8 F) s: B# m) G0 h

extern PACKAGE TForm1 *Form1;

1 I6 o$ T$ h7 r' L' [9 d

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

3 j' \( Z, Y% R

#endif

; P5 J; _. x$ o; f* T0 j

m" H1 @3 S8 B" T- P

//实现文件

+ O* b- K4 G" T: T

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

' u, H; C5 i6 y) ^3 C

#include vcl.h

- u# r8 Q0 T9 t) i9 ?

#pragma hdrstop

% p Y y; {2 A9 e

; P' R; b# k8 c5 G5 ]/ x

#include TestMenu.h

4 z. W, L0 {& m6 V

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

. K- W/ x8 G) `/ t8 X' O5 W2 x& ^, _

#pragma package(smart_init)

4 [1 L4 A K5 ~( d/ @

#pragma resource *.dfm

5 D4 ], P7 I, Z+ r$ b0 S B) C

TForm1 *Form1;

5 y* [4 N) K1 G _

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

& t' `$ a. c; O6 B* b3 ?+ ~# |

__fastcall TForm1::TForm1(TComponent* Owner)

' C& z3 W1 x; m

: TForm(Owner)

9 W$ q* o. j& A8 H/ t3 S

{

. B. t2 a5 l# |! B/ p2 E2 C

}

- `2 B% F, }* Z

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

( u7 S9 e; F$ w+ S& ^* J/ r( U" X

9 j6 \0 q0 R. ?( M1 S5 P8 `

void __fastcall TForm1::Modify(TMenuItem *pMenuItem)

6 ]7 k: F- h: l- I0 u

{//修改缺省属性

# U4 S) c; u& H7 j+ _$ w3 t

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

) |( _# \) C1 g$ ]3 {

{

0 K4 \+ t* A1 P. g2 Y

MENUITEMINFO mii=

# z6 C0 L5 W- o1 s( j& I/ m

{

( `) Z8 N: P' N( ?6 O, J

sizeof(MENUITEMINFO),

6 K! g6 I& \' R& o. l

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

7 n" J% v: M1 B: b' K

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

! S# N8 M+ M" M4 \( B* ~

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

! N0 |, c4 h. K! `

0,

8 z& E" _) N5 G9 y3 ~. ]

0,

4 ?3 D9 ~ G, ^2 o. C

};

5 T& Q J' Q, d7 u' v g

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

5 ^/ I/ Z2 P( {

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

, \' y9 |1 B; G1 ]; }- F

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

7 Z" T* j: ^2 }4 G

Modify(pMenuItem-Items);

& x% n) g% I/ d5 u2 l7 z7 M

}

, ?0 I* c& [8 j0 V" T3 ?

* |* c9 l3 i0 {( j7 ~8 v

}

' o% }/ r C$ [5 u1 \4 W: N) v

void __fastcall TForm1::FormCreate(TObject *Sender)

: l G9 Y$ ~1 ~" o( l. C; `

{

5 @& T, K# `, `' z

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

, t0 H3 s5 Q2 a& y2 w

{

* `4 L6 p8 Z5 z/ T! z

Modify(MainMenu1-Items-Items);

% s/ f* c3 R! t" ~ P1 E9 ^

}

! H! V/ L* _0 Z

DrawMenuBar(Handle);

/ Q) G8 n4 [! |: E

}

- V, W8 x3 F5 B% q) \, I# }

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

8 v) Z5 P, l; ?- z# S

void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)

. U2 y5 p! r l7 c& [# ?

{//设置菜单大小

8 N7 V6 B6 ]" e' N1 z9 G! G% c

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

- v& i$ V& I7 B# b0 s

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

; _ r: H4 f$ D& h! ^

Msg.MeasureItemStruct-itemHeight = 20;

7 d7 T7 I8 |/ d

}

, a; {5 Q4 |8 `

void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)

. x4 H" _* Y0 _/ d2 B$ b

{//画出菜单

* v' V( J0 w8 H3 n( k

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

& i& D8 B6 \0 @% S

TCanvas *pCanvas=new TCanvas;

- c1 |1 V6 \' h$ E

pCanvas-Handle=Msg.DrawItemStruct-hDC;

$ {* ^& j# d f

RECT r=Msg.DrawItemStruct-rcItem;

1 j& c( p! U( \9 i, l7 ~

pCanvas-Brush-Color=clBtnFace;

q% Z9 F" ]; p% D& k

RECT r1=r;

6 X3 J& |5 a9 m. o$ S5 L% |

r1.right+=1;

* t2 s* x8 Q) m6 U7 C

r1.bottom+=1;

6 W: X( k% D1 U$ f% }/ d

r1.top-=1;

( J- N/ o% e0 j1 h1 r/ ?& A! q4 ?

r1.left-=1;

0 W1 H1 k9 D3 k) w. L) M6 {# f0 W

pCanvas-FillRect(r);

* J" A' u1 J' Q( d" `

::SetBkMode(pCanvas-Handle,TRANSPARENT);

) W @4 o" b" x4 P* t6 d

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

/ S$ g- q5 N& x `* i: Z1 b

r.right-=1;

4 S6 y i; a- Z/ c. ~

r.bottom-=1;

" B' [! G) a* Z

if(Msg.DrawItemStruct-itemAction == ODA_SELECT

) e" Q: N- ]6 l% y( U

Msg.DrawItemStruct-itemStateODS_SELECTED )

+ z7 X( r) `' |

{

$ \5 f6 u, \8 y5 x

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

- K; x, O/ C) {% X; l

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

: [, h+ b6 M c; ~% Q( }: Y

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

6 G+ u! s, D% a( L

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

' z7 ?3 k# i" V% Y; w+ V/ L

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

5 P! ^# x# K" _1 w' U& [

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

3 r' E2 Z6 ^" _* X9 b0 q

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

, l5 W P# o3 e3 P) b7 C

}

& F+ y! k7 [: E8 I) `& L( @7 Y/ G8 a8 V3 O: P

}

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-15 13:41 , Processed in 1.517447 second(s), 81 queries .

    回顶部