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

caomin64 2004-04-29 10:18:52
我再Form中填加了控件MainMenu,主菜单项通过手动编辑已经生成,如:N1、N2、N3,现在由于软件需要在N1下用程序实现下拉子菜单,这个我也实现了,但鼠标点击其中一项子菜单,必须截获这个消息,才能执行相应的执行代码,怎样截获,请教各位老师,将非常感谢,可以给予100元感谢费
...全文
198 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
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);
随着通信电子技术的迅速发展,信息技术给家居行业产生了深远的影响,家居环境的智能化监控已经成为智能家居的一个重要的发展方向。人们逐渐对自己的生活提出一种更高的要求,他们需要一种智能化、可交互,并且融合现代创新科技的产品来改善他们的生活环境,使他们生活更加安全、舒适、便捷、智能。本文根据智能家居的发展背景和研究现状,并且从实用性和可行性角度出发,研究设计了一种基于STM32单片机的智能家居系统。该系统由一个多功能综合的技术系统组成,各个多功能子系统间具有协同配合能力。基于STM32单片机实现的功能子系统包括:智能温度检测,智能湿度检测,智能烟雾/火灾检测智能检测,无线传输,人机交互机构,风扇调节,报警模块。 整个系统分为前端51单片机采集板和后端STM32单片机接收板。 采集板使用DHT11温湿度传感器、MQ烟雾传感器完成室内家居环境的采集。然后通过nRFL24L01将采集到的数据发送给后端。接收板使用LCD1602完成数据显示、使用蜂鸣器模块报警,使用风扇驱动模块调节室内家居环境。本文完成了智能家居控制系统前端、后端软硬件的设计,使用Altium designer绘制了电路原理图,使用Keil C完成了51单片机和STM32单片机的编程与调试。 最后,对本文设计的基于STM32的智能家居控制系统进行部署调试。试验结果表明,该系统可成功应用在智能家居环境检测调节和火灾安全防护的领域,可提高家居生活智能化水平。

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧