我们知道,C++Builder没有自画菜单,但可以调用API函数::SetMenuItemInfo()来改
变菜单类型,达到自画菜单的目的。下面的例子演示了如何使用自画菜单。当鼠标位于菜单
上拾,菜单项将凸出来。(黑体字为添加的代码)
! R) J$ S; Q! ]/ E7 t8 U1 _# m( B' z# s: ^) y1 g
//头文件
9 ^' ^1 K2 Y6 E) L0 q& w; g: [//------------------------------------------
' x& X; t$ }' R! Y#ifndef TestMenuH
d) l, \7 _4 `0 N0 e#define TestMenuH
//-----------------------------------------
#include Classes.hpp
2 d, [( x4 C) V! q#include Controls.hpp
#include StdCtrls.hpp
5 g/ G! e g; f L#include Forms.hpp
: Z/ n0 L- N3 {3 @#include Menus.hpp//--------------------
class TForm1 : public TForm
2 X/ P8 z$ Q# J) I{
! D1 H# w( _1 D7 f+ \% S+ Z# Y__published: // IDE-managed Components
TMainMenu *MainMenu1;
% m. n" t" x0 @' l4 RTMenuItem *aaa1;
TMenuItem *aaaaaaaaa1;
TMenuItem *ccc1;
TMenuItem *ddd1;
q" m# S# k/ M0 f6 R6 MTMenuItem *eee1;
% `& ?" \0 m8 NTMenuItem *ddsds1;
+ @: U1 `& n' u" c; @9 dTMenuItem *fcdfsss1;
' u2 T$ |6 Z% Y/ n$ lTMenuItem *dddddddd1;
2 m9 y( p% w! D7 Y( Q: h( Kvoid __fastcall FormCreate(TObject *Sender);
private: // User declarations
void __fastcall Modify(TMenuItem *pMenuItem);
2 ~9 [3 N% g8 c) B1 \protected :
( |* m) L9 d# q" @1 | Y! YMESSAGE void __fastcall CNMeasureItem(TWMMeasureItem Msg);//增加响应消息
MESSAGE void __fastcall CNDrawItem(TWMDrawItem Msg);
/ I, `' C' ]+ o3 |- W- }* _public: // User declarations
6 V' W$ [- J7 K3 R) w__fastcall TForm1(TComponent* Owner);
BEGIN_MESSAGE_MAP//添加消息映射
8 B' u7 I" ?7 n" _6 r3 dVCL_MESSAGE_HANDLER(WM_MEASUREITEM, TWMMeasureItem, CNMeasureItem);
: y+ ]; m" b* Z0 ~4 a0 yVCL_MESSAGE_HANDLER( WM_DRAWITEM, TWMDrawItem, CNDrawItem);
END_MESSAGE_MAP(TForm);
};
//---------------------------------------------------------------------------
8 Q. m8 l7 h, ^8 _extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
: c+ g& B$ u% e4 A q#endif
K+ |% k: U7 A& v7 W
//实现文件
//---------------------------------------------------------------------------
#include vcl.h
#pragma hdrstop
#include TestMenu.h
& n1 ]" r: v& y//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource *.dfm
TForm1 *Form1;
& U5 C% {3 a& ]$ K8 F, X; k//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
G' h9 x9 l% ]' O5 S{
}
//---------------------------------------------------------------------------
0 W7 Y. ~0 d( @3 |2 k6 L7 m
void __fastcall TForm1::Modify(TMenuItem *pMenuItem)
{//修改缺省属性
for(int i=0;ipMenuItem-Count;i++)
{
MENUITEMINFO mii=
{
sizeof(MENUITEMINFO),
MIIM_TYPE|MIIM_DATA ,//改变类型和数据
MF_OWNERDRAW,0,0,0,0,0,DWORD(pMenuItem-Items-Handle),
//把菜单项的句柄赋给32位数据
0,
0,
& \! P z/ p/ A2 S2 Q3 ?};
" M) e e c+ S, Jif(pMenuItem-Items-Caption!=-)//如果不是间隔线
::SetMenuItemInfo(pMenuItem-Handle,i,TRUE,mii);
% v. L) R; X [1 q& S: E; Fif(pMenuItem-Items-Count)//如果含有子菜单
7 M5 u& _4 d0 c1 E7 m1 RModify(pMenuItem-Items);
. H' r1 z8 o/ R6 Z( T}
* [: s3 `) g) e' ^, \
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
, a1 n: o3 e0 zfor(int i=0;iMainMenu1-Items-Count;i++)
{
# @, k% m' d$ b7 r2 o6 Y+ ^ xModify(MainMenu1-Items-Items);
& p# {6 [4 W# k1 e1 l}
8 a( _- R$ e$ y% ^; p8 n/ e' i( hDrawMenuBar(Handle);
}
- C4 K) D/ Q, U/ d Y0 H//---------------------------------------------------------------------------
void __fastcall TForm1::CNMeasureItem(TWMMeasureItem Msg)
{//设置菜单大小
TMenuItem *pItem=MainMenu1-FindItem(Msg.MeasureItemStruct-itemData,fkHandle);
- {: A r5 n' c* X/ HMsg.MeasureItemStruct-itemWidth =pItem-Caption.Length()*8+40;
Msg.MeasureItemStruct-itemHeight = 20;
}
8 i( a2 L7 h+ c) y9 _void __fastcall TForm1::CNDrawItem(TWMDrawItem Msg)
3 Q- w, e8 i% O# M* u{//画出菜单
8 p2 O: ~ J' `4 H& sTMenuItem *pItem=MainMenu1-FindItem(Msg.DrawItemStruct-itemData,fkHandle);
TCanvas *pCanvas=new TCanvas;
pCanvas-Handle=Msg.DrawItemStruct-hDC;
RECT r=Msg.DrawItemStruct-rcItem;
4 j$ [# |4 W7 J0 i3 NpCanvas-Brush-Color=clBtnFace;
" e. O5 P. q$ v( L: J! i! ~6 I& W6 GRECT r1=r;
r1.right+=1;
r1.bottom+=1;
r1.top-=1;
4 E* a6 Z" n7 z* Sr1.left-=1;
pCanvas-FillRect(r);
::SetBkMode(pCanvas-Handle,TRANSPARENT);
pCanvas-TextOut(r.left+10,r.top+2,pItem-Caption);
) Z0 g, B) ]3 H2 i6 o$ Qr.right-=1;
2 k7 _- M- G( ] Wr.bottom-=1;
if(Msg.DrawItemStruct-itemAction == ODA_SELECT
7 ?8 ]" ~6 Y' p' UMsg.DrawItemStruct-itemStateODS_SELECTED )
{
0 l3 E& _( m! d3 N; D+ k! N8 @pCanvas-Pen-Color=(TColor)(RGB(255,255,255));
8 r1 o/ r1 y, K& v; jpCanvas-MoveTo(r.right,r.top);
pCanvas-LineTo(r.left,r.top);
; Z. ~1 A5 [* i. W! [: T- B* V! ypCanvas-LineTo(r.left,r.bottom);
pCanvas-Pen-Color=(TColor)(RGB(128,128,128));
+ L1 ~ w1 e5 q! UpCanvas-LineTo(r.right,r.bottom);
pCanvas-LineTo(r.right,r.top);
6 ]7 C* b! y) O2 ~ |}
/ K; P/ A: i! i}

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