请教各位高手怎样截获TMainMenu组件中由编程动态生成的下拉菜单项被鼠标单击选准的消息

caomin64 2004-04-29 10:18:52
我再Form中填加了控件MainMenu,主菜单项通过手动编辑已经生成,如:N1、N2、N3,现在由于软件需要在N1下用程序实现下拉子菜单,这个我也实现了,但鼠标点击其中一项子菜单,必须截获这个消息,才能执行相应的执行代码,怎样截获,请教各位老师,将非常感谢,可以给予100元感谢费
...全文
118 12 点赞 打赏 收藏 举报
写回复
12 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
caomin64 2004-04-30
JetKingLau(时差)::(一叠昨天)
stonewater(我为程序) :
二位:
非常感谢!祝您二位五一节愉快!

应各加30分
  • 打赏
  • 举报
回复
caomin64 2004-04-30
lovebcb(京华:笑春风) :
成功,非常感谢!,我是山西省教育厅信息中心,请您给留个联系方式,(怎么给您分呀?)

谢谢
曹敏
  • 打赏
  • 举报
回复
lovebcb 2004-04-30
今天收到信后,没有及时回复,不好意思。
  • 打赏
  • 举报
回复
caomin64 2004-04-30
lovebcb(京华:笑春风):
非常感谢您!
我立即进行实验

曹敏
  • 打赏
  • 举报
回复
lovebcb 2004-04-30
N0、N1、N2的Tag,已经预先设定为0、1、2
目的是,让下拉子菜单设置的Tag能对应主菜单的Tag

比如:
NO的Tag是0,它下拉第一个子菜单的Tag是0*10+0,是0;
N1的Tag是1,它下拉第一个子菜单的Tag是1*10+0,是10;
N1的Tag是1,它下拉第二个子菜单的Tag是1*10+1,是11。
依此类推。

当然一个主菜单中,动态出现10个以上的子项就会和其它
的主菜单项相矛盾;如果真要动态生成这么多子项。
你自己处理一下自菜单Tag的生成方式吧。
  • 打赏
  • 举报
回复
lovebcb 2004-04-30
//Unit1.cpp

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

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DynaMenuClick(TObject *Sender)
{
TMenuItem *ClickedItem = dynamic_cast<TMenuItem *>(Sender);
if (ClickedItem)
{
//根据Tag值来选择事件
switch (ClickedItem->Tag)
{
// 这些是N0下的子菜单
case 0:
{
ShowMessage("0 item clicked");
break;
}
case 1:
{
ShowMessage("1 item clicked");

break;
}
case 2:
{
ShowMessage("2 item clicked");

break;
}
// 这些是N1下的子菜单
case 10:
{
ShowMessage("10 item clicked");

break;
}
case 11:
{
ShowMessage("11 item clicked");

break;
}
case 12:
{
ShowMessage("12 item clicked");

break;
}
// 这些是N2下的子菜单
case 20:
{
ShowMessage("20 item clicked");

break;
}
case 21:
{
ShowMessage("21 item clicked");

break;
}
// etc...
default:
break;
}
}
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button1Click(TObject *Sender)
{
TMenuItem *ToItem, *NewItem;

//Get reference to a item
ToItem = MainMenu1->Items->Items[StrToInt(Edit1->Text)];
//Create new menu item with the menu item as owner
NewItem = new TMenuItem(ToItem);
//Create caption relative to the main menu item's item count
NewItem->Caption = ToItem->Caption + " -- New Menu Item &" + IntToStr(ToItem->Count);
//Assign the Tag
//设置Tag,在单击事件中,用它来标示
NewItem->Tag = ToItem->Tag*10 + ToItem->Count;
//Assign an event handler
//这里处理子菜单的单击事件
NewItem->OnClick = DynaMenuClick;
//Insert new menu item under last main menu item
ToItem->Insert(ToItem->Count, NewItem);

}
//---------------------------------------------------------------------------


  • 打赏
  • 举报
回复
lovebcb 2004-04-30
// Unit1.h

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

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Menus.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TMainMenu *MainMenu1;
TMenuItem *N1;
TMenuItem *N2;
TMenuItem *N3;
TButton *Button1;
TEdit *Edit1;
TLabel *Label1;
TLabel *Label2;
TBevel *Bevel1;
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
void __fastcall DynaMenuClick(TObject *Sender);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
  • 打赏
  • 举报
回复
caomin64 2004-04-30
MainMenu1->Items->Items[0]->OnClick 中到->OnClick 一步系统不会自动弹出,请教各位大虾能否给我写一例子,发到我的邮箱,用C++Builder 5编写,将非常感谢
  • 打赏
  • 举报
回复
caomin64 2004-04-30
下拉子菜单是通过编程实现的,这些子菜单的OnClick怎样通过编程实现?

谢谢
  • 打赏
  • 举报
回复
heguxun 2004-04-30
在你通过编程实现下拉子菜单的时候,为该子菜单的OnClick事件指定一个函数.结合stonewater(我为程序)和JetKingLau(时差)::(一叠昨天)包你没错.
  • 打赏
  • 举报
回复
stonewater 2004-04-30
MainMenu1->Items->Items[0]->OnClick = MySubMenuItemClick;
  • 打赏
  • 举报
回复
JetKingLau 2004-04-29
实现下拉子菜单时,给每个子菜单设置不同的 Tag,并将这些子菜单的 OnClick 事件指向一个已存在的函数,在该函数中判断调用者的 Tag,如:
void __fastcall TForm1::MySubMenuItemClick(TObject *Sender)
{
if( !Sender->ClassNameIs("TMenuItem") )
return;

TMenuItem *item = (TMenuItem*)Sender;

switch( item->Tag ) {
case 0:
...
break;
case 1:
...
break;
case 2:
...
break;
default:
break;
}//end switch

}

当然,在 Form1 的 .h 文件的 public 部份,要有该函数的定义,如:

void __fastcall MySubMenuItemClick(TObject *Sender);
  • 打赏
  • 举报
回复
相关推荐
发帖
VCL组件使用和开发
加入

588

社区成员

C++ Builder VCL组件使用和开发
申请成为版主
帖子事件
创建了帖子
2004-04-29 10:18
社区公告
暂无公告