QQ登录

只需要一步,快速开始

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

如何自画菜单?

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

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

5 _. g3 G4 a9 c( m x4 u$ |! v, B

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

! p3 r8 r5 o/ @- X ?% I8 E

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

+ r! C% G& O( T6 ^

4 L6 V3 X7 e7 ]3 }" L

//头文件

( I4 t& r6 q/ H$ f3 O' J6 F0 x

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

' T$ |2 I ]) H. u7 ]5 o3 Y$ S. t6 f5 @

#ifndef TestMenuH

* h9 O/ L5 H5 f- ?

#define TestMenuH

# J' z+ K- ]% [! R% W

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

: o7 d) r* F- J! D5 M

#include Classes.hpp

% l1 [9 M, Z3 J# |3 v* p- `

#include Controls.hpp

0 h" K/ ^7 J5 D& z" H1 b/ L

#include StdCtrls.hpp

( _) n' {/ W/ e6 e$ ]- F! h

#include Forms.hpp

$ B7 _- a$ S, V* ^8 L

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

- ]: H) u5 \" m5 F# H* i5 T* b9 v

- W ]7 g; l* u# c+ ?, G9 l1 C

class TForm1 : public TForm

( h, v; l' M8 N

{

( I0 b* |4 s; M P

__published: // IDE-managed Components

% `1 l" ]; p7 j% ?: X/ R; m

TMainMenu *MainMenu1;

3 V( f" h) D2 k+ h

TMenuItem *aaa1;

/ M" |7 R. P Y7 \% D

TMenuItem *aaaaaaaaa1;

; v' o/ u6 ?( F; o. q8 X* Z5 e

TMenuItem *ccc1;

2 k4 t/ A e N7 f# ?6 |0 ]

TMenuItem *ddd1;

8 a$ m7 F7 E: I5 l0 p1 f8 r

TMenuItem *eee1;

9 f1 o! j3 \. ?+ |0 g) ^- ?

TMenuItem *ddsds1;

/ h' e4 H; k$ j7 y$ x1 v j

TMenuItem *fcdfsss1;

9 h, W2 p- u$ H- f/ {/ C

TMenuItem *dddddddd1;

* u3 H" a, P3 L p* Q

void __fastcall FormCreate(TObject *Sender);

" f# b' E) E8 c) f$ t

private: // User declarations

) V9 R% C/ C4 R+ j" B( @% a* G

void __fastcall Modify(TMenuItem *pMenuItem);

* s8 Z, j) ]0 X' T

protected :

5 ?8 t8 E% {9 m9 ]& c3 w; T# J

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

I6 a2 Q, F/ r0 t1 }2 v

MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);

2 z4 a: f5 C; ]# R. A z) }

public: // User declarations

9 w; u8 Z: L2 b7 C- `% f

__fastcall TForm1(TComponent* Owner);

7 N, D' U3 r6 B) u6 h' P+ O% D

BEGIN_MESSAGE_MAP//添加消息映射

1 N3 T- I) n, u q) l

VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);

1 b, E1 y( @& F. \' }. {

VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);

. l& ]" p) p: r8 i: X/ h; K x

END_MESSAGE_MAP(TForm);

/ s9 S5 j% y1 O+ S" h1 l; r- u

};

) W" R; {0 ?4 a1 O \

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

9 b K* m/ t, R. X- j+ }

extern PACKAGE TForm1 *Form1;

/ l: B$ V9 N( B0 |, p2 C

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

9 B% v# R! l l& k

#endif

7 F- Y* |' M4 i4 f- X

, O' x# G& h; L) F

//实现文件

( o% l) x* f+ F

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

* p, x) N, q% ]. ~% m5 s

#include vcl.h

* P% E# a# \ E! W) ?' J

#pragma hdrstop

9 P0 A% L' c5 @) l5 @# ?

" o1 A+ O5 W# ^5 g% i- K

#include TestMenu.h

q# @! e2 Q: t" H5 g0 T: b( D) L

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

3 k& c3 [5 S6 M) l! p% ?1 Z

#pragma package(smart_init)

: Z! S% r6 m ?6 ~0 e' ?

#pragma resource *.dfm

5 @: ~2 l! x7 u K+ _- V2 m

TForm1 *Form1;

1 Z: f7 _# z$ p" x# V3 E8 q

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

5 _: P& a. x9 `4 z/ Q+ P

__fastcall TForm1::TForm1(TComponent* Owner)

' M r6 e. {$ ~6 P" ]* P: P

: TForm(Owner)

7 B! b1 V" Z, P( R1 I

{

3 \. J0 T% k8 D+ o; h

}

5 F: ?' y+ \8 E( B7 q* s

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

8 r- |8 g# |' H

; N, m" }# Z' y

void __fastcall TForm1::Modify(TMenuItem *pMenuItem)

+ g$ A) G7 A/ s2 c& q8 |

{//修改缺省属性

1 m+ a, V8 S7 X; {

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

$ w% y6 E F% k& V+ f; o

{

9 n( j# U( C* [! h

MENUITEMINFO mii=

/ Y$ g4 z) k/ E

{

5 h+ `% h( R7 N

sizeof(MENUITEMINFO),

; B6 d1 G( w% W8 S0 U! ^

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

- w# b4 J) X+ r ?# B7 y3 M4 N

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

. C$ F. J; ^; s

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

( r) p3 W- @0 J& E8 D! a4 M

0,

) D) b: X% q" M8 a% d

0,

9 _" i* Y- O3 r

};

& E' x" _+ @8 n6 t

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

- |/ T/ N# `3 h& v& q+ L

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

2 L3 a; L$ {/ E1 k

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

+ e- V* ^$ l/ E M7 {2 V

Modify(pMenuItem-Items);

3 D* {' h/ ~1 j

}

4 _7 }8 H( R$ u0 D% B. ]: r

4 @# g) y) f; y: e1 E9 c

}

: e( {) c' y: X) e) B8 q/ [

void __fastcall TForm1::FormCreate(TObject *Sender)

/ D/ `1 {/ v" W5 s( ^* v0 O

{

" h$ j1 J' P: {! @' f

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

1 G; M5 q5 i+ i& [6 \

{

# c, h$ |1 L* D5 |1 w8 O+ m

Modify(MainMenu1-Items-Items);

; ~& y, m$ o- c) }4 v h

}

' w# F5 z* y- ^5 O7 ~; h9 `

DrawMenuBar(Handle);

: M( }$ f. T& k6 ?. G

}

% m; X$ X& U. _' K& s) b2 g0 U) ^

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

; v* i& v; G' c! {

void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)

% \8 o, P# Z9 l+ D

{//设置菜单大小

1 t/ f7 P! ?6 W$ H0 J

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

5 x# R k$ x: z6 Q4 G5 _

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

1 [8 t; q( z0 r' {1 c$ h

Msg.MeasureItemStruct-itemHeight = 20;

# j/ F) A, M9 o/ C

}

' Y! J3 T& h* \

void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)

2 v9 g( A! n5 X7 P4 X- D( ~" A- I

{//画出菜单

& R7 q! e: W" F* ?& u5 p

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

2 e, ]' u u7 h! ?& X7 P% x2 {

TCanvas *pCanvas=new TCanvas;

" T7 [9 L8 ?2 O* W* L

pCanvas-Handle=Msg.DrawItemStruct-hDC;

7 a* S8 J- {) ]1 p

RECT r=Msg.DrawItemStruct-rcItem;

4 |% Z! W( I$ o: r/ a0 ^; N

pCanvas-Brush-Color=clBtnFace;

( K6 n0 _- G" d+ X* r3 ?5 r

RECT r1=r;

* t6 g7 I f G* D/ E8 Q& D( N

r1.right+=1;

4 {* l2 K9 ?/ o( |7 h

r1.bottom+=1;

* l G7 V8 J4 C* r! {

r1.top-=1;

: [) v e7 M; N7 [% ~" W I

r1.left-=1;

1 ~! H. i4 S1 M/ _% B* [

pCanvas-FillRect(r);

" P* C) P+ s. [. g

::SetBkMode(pCanvas-Handle,TRANSPARENT);

: j5 N9 O# ^/ E9 a

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

6 R/ L5 ^( [, a C2 B" k7 F- K4 ?

r.right-=1;

1 v6 m& P; c; z. K" ]9 I$ U

r.bottom-=1;

. j# w/ [. |+ k( X+ z

if(Msg.DrawItemStruct-itemAction == ODA_SELECT

4 u7 M% k" t8 P8 ^# Z* n

Msg.DrawItemStruct-itemStateODS_SELECTED )

! ^0 `- n8 w5 M, \

{

% y# N% k( \6 S F6 r d2 c

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

: T& W, J% s0 A% G

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

- T7 o- |9 @) R7 s. \

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

9 i# l% n; _' K1 L) h6 _

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

9 a: O- u3 c! s& g% I8 H

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

4 F& Z% J+ d& ]7 e( g

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

* \$ d$ o2 ^- D* A

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

9 v+ ] L5 E" L, F( G; A& h

}

' X, O9 B3 j* n$ [& D - K$ m# S( k3 D2 o' D) A+ S! ]

}

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-11 00:25 , Processed in 0.376123 second(s), 82 queries .

    回顶部