我们知道,C++Builder没有自画菜单,但可以调用API函数::SetMenuItemInfo()来改
变菜单类型,达到自画菜单的目的。下面的例子演示了如何使用自画菜单。当鼠标位于菜单
上拾,菜单项将凸出来。(黑体字为添加的代码)
4 j2 b1 \6 V- F6 I7 X& I' C8 a: z
//头文件
//------------------------------------------
#ifndef TestMenuH
#define TestMenuH
//-----------------------------------------
#include Classes.hpp
#include Controls.hpp
5 a" I" ?6 @, f#include StdCtrls.hpp
#include Forms.hpp
3 q" R( n2 F& X4 |6 K8 x#include Menus.hpp//--------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
/ j" E# }4 x# ~1 y- kTMainMenu *MainMenu1;
, E: I9 t1 P+ J5 |9 bTMenuItem *aaa1;
TMenuItem *aaaaaaaaa1;
0 [# X0 u# u; g" zTMenuItem *ccc1;
TMenuItem *ddd1;
TMenuItem *eee1;
3 S, w3 o6 D- g/ ETMenuItem *ddsds1;
$ [$ A: |4 Z, D+ C0 @! ]4 pTMenuItem *fcdfsss1;
8 C# Z! I" o% KTMenuItem *dddddddd1;
) S) {7 N. E% {. K0 [* ^* Wvoid __fastcall FormCreate(TObject *Sender);
1 L! j0 l" a; B: F" b4 t+ N% xprivate: // User declarations
void __fastcall Modify(TMenuItem *pMenuItem);
1 q- V/ p8 X. |5 {/ q1 ] t) k5 [: [protected :
3 `" X: W o+ f& c, L0 s+ b; j) ?MESSAGE void __fastcall CNMeasureItem(TWMMeasureItem Msg);//增加响应消息
/ b# i3 q+ g& }, r8 q* RMESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
* A; Q, T: d) I: H2 Y9 {5 OBEGIN_MESSAGE_MAP//添加消息映射
VCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);
VCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);
END_MESSAGE_MAP(TForm);
};
; i4 m! ?& P9 [; [+ ~//---------------------------------------------------------------------------
7 c P$ I N% {& ]3 L7 b/ Aextern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
3 b' \1 V- g3 a' d; K& d# r( s4 [: i& r8 a" N4 ?9 z1 [, H& T) d2 Y
//实现文件
" } I- l# t* n" ^//---------------------------------------------------------------------------
#include vcl.h
3 g$ N- |0 M2 r8 h1 G#pragma hdrstop
; B& q* P. K( T6 J; J, e+ e! c0 r& P- b
#include TestMenu.h
6 A$ y# `) V2 A( E+ \//---------------------------------------------------------------------------
* r" U" U6 N8 s) t#pragma package(smart_init)
#pragma resource *.dfm
TForm1 *Form1;
& V' U* V' o, m3 U! q: R, f//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
, J+ ?/ G0 h; F+ y; `" e: x! H$ _: TForm(Owner)
. l, u+ ~$ w; ~5 j5 P% D" U{
}
# l8 t! Z1 y: u/ M: S# v//---------------------------------------------------------------------------
void __fastcall TForm1::Modify(TMenuItem *pMenuItem)
{//修改缺省属性
for(int i=0;ipMenuItem-Count;i++)
$ r1 u9 v# ^3 r. q/ z1 r{
MENUITEMINFO mii=
{
9 Y3 [# G6 U, N/ g- jsizeof(MENUITEMINFO),
; [, v; d3 O. gMIIM_TYPE|MIIM_DATA ,//改变类型和数据
& B+ I/ C; I) j8 r0 c. nMF_OWNERDRAW,0,0,0,0,0,DWORD(pMenuItem-Items-Handle),
$ L+ J* o* V6 V9 g! D$ O# v% f//把菜单项的句柄赋给32位数据
5 o/ E. n5 M3 o% @# c0,
p( \ c; l- z+ }! z+ b0,
};
% C1 C" D' e& c* x) E* i6 J5 X- lif(pMenuItem-Items-Caption!=-)//如果不是间隔线
) M( O6 ^( p' `( |: L u' o::SetMenuItemInfo(pMenuItem-Handle,i,TRUE,mii);
if(pMenuItem-Items-Count)//如果含有子菜单
( ^; M' r0 s% P9 L: Y4 IModify(pMenuItem-Items);
}
% v; V& H! b/ q3 ^, x! {1 w2 o+ }# _0 _( j0 A2 H
}
void __fastcall TForm1::FormCreate(TObject *Sender)
z; e7 |; {- x! ~/ Q2 B4 \{
1 Y- f: @; h* {% m: Q6 y `/ Ufor(int i=0;iMainMenu1-Items-Count;i++)
1 K# i2 ]. V D5 J5 M8 U" ^: P3 B/ B{
# C% z6 P* I0 O& IModify(MainMenu1-Items-Items);
4 V- k; t, ]* y9 b. j7 I- @! u8 m}
DrawMenuBar(Handle);
$ J# ^2 R) V! e/ {) w) o/ @: L9 }}
//---------------------------------------------------------------------------
void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)
{//设置菜单大小
, t% P0 e6 q, ?/ ], k. z' M) ?7 _TMenuItem *pItem=MainMenu1-FindItem(Msg.MeasureItemStruct-itemData,fkHandle);
2 Z U/ _" W. m( y; E$ c) V* iMsg.MeasureItemStruct-itemWidth =pItem-Caption.Length()*8+40;
Msg.MeasureItemStruct-itemHeight = 20;
6 B F" D0 Q7 n+ q4 B8 f& @) H}
: J9 ]( K$ u& A3 n% V+ Ivoid __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)
2 y) w/ o9 e$ e{//画出菜单
TMenuItem *pItem=MainMenu1-FindItem(Msg.DrawItemStruct-itemData,fkHandle);
TCanvas *pCanvas=new TCanvas;
' G- J" V7 A. ]- opCanvas-Handle=Msg.DrawItemStruct-hDC;
+ ?, W; M; B J0 X7 t9 l& hRECT r=Msg.DrawItemStruct-rcItem;
% G1 n1 L7 X& h: x0 @pCanvas-Brush-Color=clBtnFace;
RECT r1=r;
0 R) X% T; L( P# sr1.right+=1;
3 T/ T1 Q9 T+ ~4 A" q5 P! }) Ar1.bottom+=1;
r1.top-=1;
r1.left-=1;
pCanvas-FillRect(r);
$ ~& O4 p# V9 v1 Z2 P::SetBkMode(pCanvas-Handle,TRANSPARENT);
$ _. s8 n+ o8 {% s1 ]4 F; }pCanvas-TextOut(r.left+10,r.top+2,pItem-Caption);
/ Y6 l4 d( h6 qr.right-=1;
r.bottom-=1;
if(Msg.DrawItemStruct-itemAction == ODA_SELECT
" R$ T1 n. D0 YMsg.DrawItemStruct-itemStateODS_SELECTED )
{
pCanvas-Pen-Color=(TColor)(RGB(255,255,255));
/ l# P, F/ y( |& Y# d5 Q2 d; OpCanvas-MoveTo(r.right,r.top);
pCanvas-LineTo(r.left,r.top);
pCanvas-LineTo(r.left,r.bottom);
: y3 R' c: c0 S( c5 |1 L7 K! a+ XpCanvas-Pen-Color=(TColor)(RGB(128,128,128));
pCanvas-LineTo(r.right,r.bottom);
) H! ?, c! r5 u- i. D0 ZpCanvas-LineTo(r.right,r.top);
' Y" K2 c5 C) q}
# h' H; A7 H# e- j* @}

| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |