QQ登录

只需要一步,快速开始

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

如何自画菜单?

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

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

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

1 O- C' I5 D8 J! G3 z, c0 O. M) x6 _

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

0 H' n) B( ~& G# _

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

+ J/ B+ t& O7 G7 X: ]

1 g4 M2 p* q% `( d

//头文件

% R0 w9 _: ^/ `' K

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

; F( D4 |# J3 A- J& W6 i. \

#ifndef TestMenuH

; v; C1 L# o3 S% a2 R4 S5 T \0 r ?

#define TestMenuH

3 t* _' H! Q; |7 ^$ @

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

/ a6 H/ Z. \) r$ D; N5 N* o6 L2 }

#include Classes.hpp

$ b' W2 U4 w! o# f% c

#include Controls.hpp

. t- h' s+ {2 K N! k0 D5 N

#include StdCtrls.hpp

8 f0 n* a+ e k

#include Forms.hpp

' W$ n. T. l9 T/ `: T7 n8 x& F

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

7 B3 u7 x& v0 [% @: {% `

; J8 [# A, ~; P, y& T3 j

class TForm1 : public TForm

/ k) @" `$ d/ O0 ?

{

. I, e/ K. h2 X" t# @7 o

__published: // IDE-managed Components

$ \9 _9 |3 k/ p# l

TMainMenu *MainMenu1;

% W! B, z. l* t% t8 J6 s+ S: D" |% A

TMenuItem *aaa1;

. X7 E" Z* {) y" v' g. v% |3 h: h

TMenuItem *aaaaaaaaa1;

1 F9 D w: ?6 z" J

TMenuItem *ccc1;

) g0 H& J- v- @! T# C

TMenuItem *ddd1;

% i" ^* u% P3 p% B

TMenuItem *eee1;

) H8 g. \6 F6 _" H9 q" y, T! h

TMenuItem *ddsds1;

8 S# `8 W- o; I: R! T" z% S

TMenuItem *fcdfsss1;

% z$ h3 |, z6 w5 G

TMenuItem *dddddddd1;

) T7 Z8 u' Z9 H2 a

void __fastcall FormCreate(TObject *Sender);

% V4 n% G9 n5 A, u. O' }) W

private: // User declarations

; S6 @2 [* f/ \! ]2 d

void __fastcall Modify(TMenuItem *pMenuItem);

! D' R# v5 \2 q# p7 Q$ s5 b2 B e7 u$ \

protected :

- d1 [8 z. x+ b* n* F% H

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

0 T! i- Y* S, `$ t! h7 E& j- O

MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);

/ o% H1 d( O; s( z p; u2 v

public: // User declarations

7 D5 _$ r; k& h3 v3 H5 g

__fastcall TForm1(TComponent* Owner);

/ _ \. n- A& _7 C. j5 j, @* t+ w/ h/ |

BEGIN_MESSAGE_MAP//添加消息映射

' E4 C+ d3 \7 N* w3 V6 h

VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);

# ]1 s2 g/ G* {6 _4 L |

VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);

8 e" x; n# U4 a( h0 w( y% y

END_MESSAGE_MAP(TForm);

+ j, D+ U( L7 }" |) o

};

, l) ^' c' k. E, e) F$ @( F

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

9 o5 f4 L, q0 y% r, x0 z% q" m& J

extern PACKAGE TForm1 *Form1;

! B& n% C* O" W( S/ p: N

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

. T; p5 R. G% Q+ j

#endif

9 {/ t: g- p' j3 k

% j5 q) K% k! s8 _8 D) v

//实现文件

$ w- t4 e' [ C

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

0 x; G3 v9 v! H1 E3 J& N5 N$ P

#include vcl.h

" o5 P4 ^1 Z7 _$ w- U+ x& [

#pragma hdrstop

6 G% y+ B, R: U6 `

* ?8 \6 N# d3 B( _* `; @: ]

#include TestMenu.h

" L' `$ }% r& |8 `/ `* i7 Q

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

0 v- g- w7 P/ `) d

#pragma package(smart_init)

! Q2 s3 U# \* w% \) j& Y+ u; h

#pragma resource *.dfm

8 I) \7 r7 t/ R$ j$ r

TForm1 *Form1;

4 n3 {0 {/ v8 n4 v7 s& f+ C9 a: [

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

7 f1 k. y' P5 P$ V* ?

__fastcall TForm1::TForm1(TComponent* Owner)

8 i: O$ r, h" f S0 N# Z) E

: TForm(Owner)

; C; h: r1 B2 n1 A3 B3 Y( J' f

{

' t+ M' ^# x' L

}

" X& `& g! A. T4 B$ a, l

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

) ^& H1 |0 @5 k! j1 r) R8 l; Y

( x, P) Q3 z6 g' N1 U4 M6 d. I

void __fastcall TForm1::Modify(TMenuItem *pMenuItem)

. R* j3 x, S7 }2 D; S) n6 w' _* b! Z/ P

{//修改缺省属性

$ j/ K6 d5 R' x: S& ~

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

- E% H. M+ S+ n; O0 q, `

{

' f+ w# t9 O* R& Y

MENUITEMINFO mii=

9 j: o4 F+ {2 r

{

/ p8 K# f* T* P. d, k3 \

sizeof(MENUITEMINFO),

! r$ f7 v; H* e7 A4 X

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

4 g j- L' B2 ^

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

* c/ A- V% k" d! j6 c

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

( X" ]0 Y8 S: k y/ |

0,

" _& ], ?" A' s# i$ |6 z

0,

6 B6 a( }$ g/ `& R' ^/ N

};

0 u" x8 c. H; J( b4 I

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

0 N0 q6 e5 H" z( @! h( M; Z

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

+ ` i: s" a" Q* K8 k; E; K

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

! Y$ s5 ~: ~# A3 c& I L ^

Modify(pMenuItem-Items);

, ~% x5 l3 M# Z2 W& G" {

}

2 E3 [! Q: k9 A7 h9 j# ~) D3 V' a

9 I; C3 v' d- d6 b! j

}

( p5 N* y- c* a% p& f2 m

void __fastcall TForm1::FormCreate(TObject *Sender)

6 \6 X7 \8 p) T7 \% T2 h( |! w

{

) \0 r9 i' N: `( @

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

7 g1 o. g) I" Q5 Z

{

: J3 g# u4 w( q @% c

Modify(MainMenu1-Items-Items);

# S) C" n$ Z& t7 P# D

}

% f' C0 ?- F" _3 q6 E8 S/ `3 Y/ u! J

DrawMenuBar(Handle);

0 A1 V( a0 P/ l8 V8 e {7 W) B# [& j1 S- [

}

. C: j& u: w+ N( n2 ]

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

' `9 T$ C/ {3 i5 Z/ _

void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)

x" O6 C9 e. \! `& n& ]# a

{//设置菜单大小

9 D8 `1 l8 ^2 J$ V0 E- C

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

% V5 e3 |- V4 ?9 K

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

* k4 O2 ~3 F- S- ^/ d% g

Msg.MeasureItemStruct-itemHeight = 20;

" R& `: X1 {, J2 l9 p* ^

}

* \/ j* S# ?! P0 z; ~; r

void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)

( W; s! H2 C) P* y

{//画出菜单

5 w. E) ?: g) [6 L, a

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

) w. B2 z4 B8 G! I& H; q' w6 g

TCanvas *pCanvas=new TCanvas;

( c6 _' L$ Q( z% S& t

pCanvas-Handle=Msg.DrawItemStruct-hDC;

( l; m6 c+ q3 k( ^3 y2 r

RECT r=Msg.DrawItemStruct-rcItem;

5 J' f' W7 W! Y& ^1 j) b- ?

pCanvas-Brush-Color=clBtnFace;

7 F4 P- Q) U" C I' Y D1 m# W

RECT r1=r;

( Q2 `1 h$ y9 S

r1.right+=1;

2 U0 b' g. s# Z

r1.bottom+=1;

& e$ B [3 F# H, ]# U

r1.top-=1;

8 P" |9 s9 H- N" h' y

r1.left-=1;

0 x; J1 r+ _# Y0 e+ D/ f: q2 z

pCanvas-FillRect(r);

5 y- A; P$ M5 j) P# V

::SetBkMode(pCanvas-Handle,TRANSPARENT);

' _. o' w( f' M% l- w% {

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

' O# X" G( O) H, g' X% ` W% n

r.right-=1;

( ^' D7 v9 u) H4 e8 `7 w& f! F. x

r.bottom-=1;

3 F* ]0 M" a( U" l$ X1 `! d; G' V

if(Msg.DrawItemStruct-itemAction == ODA_SELECT

" J' V/ g! ]6 {$ M& R* C

Msg.DrawItemStruct-itemStateODS_SELECTED )

4 L A' R) l- I. b! a

{

: k7 u7 A x. H* _& M

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

5 w% M Z! C7 Q9 f

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

- z7 E" b" R8 a R8 \" P. z- @

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

& {5 ? J- }- L( p3 b" a

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

! v, v& ^+ u9 P3 x& k$ r

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

( X: s4 r" Z1 j* s

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

$ a1 [; U' Q$ E7 O6 I

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

6 W. ~2 b$ ~- q0 Y, g

}

. r6 ]6 X2 J7 C' N3 N6 l% J/ ? % K1 u- g9 s0 x

}

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

    回顶部