51CTO技术论坛_中国领先的IT技术社区's Archiver

黑夜 发表于 2006-8-29 01:14

C++ BUILDER 动态建立菜单及菜单事件

首先新建一个工程文件(File->New Application)。
)~ Vc3s)V+ZC!lB8b+}~ 然后在Form1上面建立一个PopupMenu1,一个Button1,一个RichEdit1。
R4i3aWm&R!t7lC
??_$h I6l&s3@n   在头文Unit1.H的内容,其中黑体是自已加的。*x5U GR"]t%\fHE
;`'K,o3] XI b&xqJ ]$g1p
#ifndef Unit1H8mB;\Ck
#define Unit1H
OYX0z@ cr(E #include
;N1vF[_$U #include
/ht Gy/?*H"]6W;R #include
N{b;Q]-KV #include
.S'bf n U g}k+p #include c#tL Q"ju%Ie l3xb
#include
5B2i@%r:M #include Q#VGLCz"g&F#CEh
class TForm1 : public TForm
!R2NQ'S*OJbU*W {b:w!}4l;?YW
__published: // IDE-managed Components
4g7x%BEAU TButton *Button1;N$@-k P&{3o#N!TkmI
TPopupMenu *PopupMenu1;`2WJ&x:M(@ n
TRichEdit *RichEdit1;dSE$AG l]J
void __fastcall Button1Click(TObject *Sender);
+s? e5v8^V void __fastcall FormCreate(TObject *Sender);
` Mr!K^f private: // User declarations
(Z {w6D!@e sR c POINT MousePos;//保存鼠标的位置
!Y'Vq5ob1q\E E int PopCount;//保存菜单项个数
Yzj4w&e@r6s#H void __fastcall MyClick(TObject *Sender);//自已定义的单击事件fp5P8f$f6To:A
public: // User declarations
F,w/Hl(\:B~ __fastcall TForm1(TComponent* Owner);
4S,o(W+ZS%l8{ gs_ };
G i3^{BMK n extern PACKAGE TForm1 *Form1;
-G-Y\9z g2n-TO%G #endif
znlA}p #~+|#uy3VJ#IZ8X6~0e
在Unit1.cpp中的内容,黑体自已加。Y sK Pf aYP!O

-].J.DS{ #include
A9t2y!t3r2@ #pragma hdrstop
0[ O-r%UR+m
%z6aG)cI| {4W #include "Unit1.h"
3_hwQb-| e(P`:F #pragma package(smart_init)
9K-Lu+_b%s9p4Q!w #pragma resource "*.dfm" P8z(X y Lu!P'^+t
TForm1 *Form1;
eG&xfy __fastcall TForm1::TForm1(TComponent* Owner)
?+D@"o4Kw : TForm(Owner)?&z0m8Dr^'Yl
{
j0z^ t;y)yz+oO Q }$E'Y7M,M d.iH
"e*C_)I _
void __fastcall TForm1::Button1Click(TObject *Sender)d%ycm.@~7vX2Nh
{
K;Gz h*|*?~ for(int i=PopCount-1;i>=0;i--) file://如果PopupMenu1里面有菜单项6N`G^C
PopupMenu1->Items->Delete(i); file://就删除,以免重复建立%d1t$J?VVDN
zo(A]9B-?yW
TSearchRec Sr;//用来反回文件名4hW]*Ld/u
TMenuItem *NewItem;
7v'h]t.H GetCursorPos(&MousePos);//把当前的鼠标位置保存在MousePos里:N1imw+g
int MenuNameLength;//菜单名的长度$zmq:N@o)E

+{*q(lW&^N|5z5R1p if(FindFirst("C:\\Program Files\\3LTyping\\data\\*.txt",0,Sr)==0) maU,aYzk

l,XaxYj$p {
ot!_T l Bh file://取得第一个符合条件的文件名; (]2X(O:V!o @{)e

%xe#k6pr.ge file://TXT文件的位置,可自己设定;Q"b h0~.U8j5Ilm
kF]luXf
NewItem=new TMenuItem(PopupMenu1); file://建立菜单1j*k.U_#f R3wx
MenuNameLength=Sr.Name.Length(); file://文件名的长度un5Ge$y;f `&}
Sr.Name.SetLength(MenuNameLength-4); file://去除“.TXT”L)p6mQ6J^ A
NewItem->Caption=Sr.Name; file://新建菜单的名字
*a!buQ^!jZ PopupMenu1->Items->Add(NewItem); file://把新建菜单项加到PopupMenu1里
D'sMy$B V[ Z NewItem->OnClick=MyClick; file://把自己定义的MyClick函数复给新菜单的
dM {w*}zT+B
X5W$Gw%r3Ev3c'v7A file://OnClick单击事件
%RbS9b CKP r%l e.AX0UT8EpB
file://查找下一个符合条件的文件名,直到完
@ y4\zLPC z:S w gw1k%I
while(FindNext(Sr)==0) ITX3L7o#~v

S*W*Q)R;vV {
:x D,UH/T:Dz%V NewItem=new TMenuItem(PopupMenu1);E.l?%fuu8M}-T6K^
MenuNameLength=Sr.Name.Length();qW)g d)c:GZ-b
Sr.Name.SetLength(MenuNameLength-4);
#I(gp7L!cx(} d NewItem->Caption=Sr.Name;a]d5kCq6T5?
PopupMenu1->Items->Add(NewItem);
bN7Cw"d+Qg m`,l NewItem->OnClick=MyClick;JN%^vt

`4J bO:G,M8j }
(hh'b u'\ Nup0g@j _~$cK-G{O7I4Io
FindClose(Sr);//结事查找
.p+D7x(V6xKDO9P fBN0q4JD.A }
}
H @/xLKXw!k w;Z"QL R[]lg
PopCount=PopupMenu1->Items->Count;//PopupMenu1下的菜单项个数保存6e9H'Ute M)v
PopupMenu1->Popup(MousePos.x,MousePos.y);//在当前位置弹出PoupMenu1菜单qE{:@M!q`n5s
}HH#{A9@!p g`
{
&bb@ w9l_ file://下面的代码主要是把选定的文件显示在RichEdit1上
az.NY$_0SfsP N{'uD @*Dj$\/y,f"G
Form1->Caption=((TMenuItem*)Sender)->Caption;
mi zH5rD%f'o RichEdit1->PlainText=true;//设为true,表示纯文本文件
8m3l"C_,Q&} RichEdit1->Lines->LoadFromFile(}l!{bv-d-i
"C:\\Program Files\\3LTyping\\data\\"+
cTuP X`[8O{H ((TMenuItem*)Sender)->Caption+".txt");O }1BZ,Axx
}:z1{'e)_3h{o(l$x
void __fastcall TForm1::FormCreate(TObject *Sender)Tl9Kxb"d*ao
{
Z6z8e\zS} PopCount=0;//初始化6|uu-w FrS
}
0]-r0?~n6s {e [zW Z|
  上面的程序编译之后,单击Button1,就会弹出PoupMenu1,通过单击PoupMenu1下面的菜单项就会在RichEdit1上面显示文件的内容。Q)m O(?b.Q
QIP$l}4wSC'C$J
  这个程序很简单,主要是说明如何动态建立菜单,及如何响应新建菜单的事件,也可应用到其它上面,如TMenuMain等。。。。。3d'LA c aGG!p(h^

^T;gB([O2z   本程序在C++BUILDER4.0下通过。

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.