1,C++builder如何制作控件,2,C++builder如何处理鼠标离开的消息?

作者&投稿:弥态 (若有异议请与网页底部的电邮联系)
c++builder如何让鼠标移动出现提示~

在Hint里写需要提示的文字。

另要设置ShowHint为true:)

C++ Builder作为一种RAD方式的程序开发工具,提供了功能强大的集成开发环境。C++ Builder提供的VCL组件,封装了Windows的底层API和具体实现细节,也提供了对组件消息机制的良好封装。下面我们给大家介绍一下C++ Builder消息机制吧!

比如,可以对按钮控件(TButton)的单击、按下、拖动等事件消息设置相应的处理函数,并在对应的函数体中实现对该消息的处理与响应。虽然
C++
Builder对VCL组件的消息处理提供了一套良好的处理机制,且封装了许多常用的消息,但是当开发者需要处理未定义的Windows消息或自定义消息
时,C++ Builder不能提供直接的支持。这就需要开发者对Windows 消息驱动机制和C++ Builder
中的消息处理机制能有一个深入的认识。

1 Windows 消息驱动机制

Windows是以消息驱动的操作系统,Windows
消息提供了应用程序与应用程序以及应用程序与Windows系统之间进行通讯的手段。Windows
中有一个系统消息队列,对于每一个正在执行的Windows应用程序,系统为其建立一个“消息队列”,用来存放该程序可能创建的各种窗口的消息。应用程序
中含有一段称作“消息循环”的代码,用来从消息队列中检索这些消息并把它们分发到相应的窗口函数中。

消息循环代码是应用程序中主函数winmain ( )中类似如下的程序段: while(GetMessage(&msg,NULL,NULL,NULL))

{

……

//从消息队列中取得消息后,检索并生成字符消息

TranslateMessage(&msg);

//将消息发送给相应的窗口函数

DispatchMessage(&msg);

}

由此可见,所谓“消息循环”,实际是程序循环。Windows 应用程序创建的每个窗口都在系统核心注册一个相应的窗口函数,窗口函数程序代码形式上是一个switch-case 语句,用以处理由消息循环发送到该窗口的消息。 Switch(msg)

{

case … : …

break;

……

default : …

break;

}

窗口函数由Windows 采用消息驱动的形式隐式地调用(由系统调用),而不是由应用程序显示调用的,窗口函数处理完消息后又将控制权返回给Windows.

Windows消息处理过程实质包括以下四个步骤:(1) 系统发生事件;(2) 根据事件产生消息,并放入消息队列;(3) 应用程序从消息队列中取得消息,并封装后,通过消息循环把消息分派给对应的处理函数;(4) 处理函数最终处理这个消息。

2 C++ Builder 中的消息处理

在类 Application中封装、实现了Windows 程序框架,包括一些初始化、消息循环代码等。一般用C++ Builder 编写的Windows GUI 应用程序,缺省生成如下代码:

//Windows 应用程序主函数

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{

try

{

//作初始化

Application-〉Initialize();

Application-〉CreateForm(__classid(TForm1), &&Form1);

//其中封装了消息循环

Application-〉Run();

}

//例外处理

catch (Exception &&exception)

{

Application-〉ShowException(&&exception);

}

return 0;

}

对于消息处理,C++ Builder采用基于组件(component)的程序设计模式,每种控件都继承一套完整的消息派送体系。
它为每一种类型的控件都注册一个名为
MainWndProc的方法函数作为窗口函数,接受“消息循环”派送来的消息,它是一个非虚拟方法,不对任何特定消息作特别处理,它仅仅调用
WndProc方法函数,并作一些例外处理。不同控件对消息处理的定制发生在WndProc
方法中,因为它是一个虚拟方法,每一种控件可以通过覆盖它来适应特别的情况。WndProc
方法检查不同的条件,作不同的处理,从而能够滤掉不希望处理的各种消息。最终,WndProc 调用 Dispatch
方法,它是一个从所有控件的始祖TObject 继承而来的虚拟方法,它确定调用哪个方法处理传来的消息。

以上是消息在控件中的传递过程,C++ Builder对消息处理作了进一步的封装,把常用的消息封装成相应的事件属性,开发者只要把精力放在响应函数设计和建立消息与处理函数的映射关系上。

3 对VCL事件的处理

在C++
Builder中,VCL事件包含了许多Windows消息,所以在通常情况下对Windows消息的响应就转化为对VCL事件的响应处理。VCL事件与
响应函数之间的映射关系可以是静态的(程序设计时确定),也可以是动态的(在程序运行时确定)。下面分别以建立动态和静态的响应函数映射关系。

在静态映射关系条件下,建立VCL事件的响应处理非常简单。我们以一个实例来说明。

在一个新建工程中,放入一个按钮控件(TButton),在对象观察器中选择事件标签,在该标签中选择OnClick事件,写入响应函数,通常双击
该事件选项,则可以很方便地建立事件与函数的对应关系和响应函数框架。 void __fastcall
TMsgExp::Button1Click(TObject *Sender)

{

//对单击按钮事件的响应

ShowMessage("你触发了一个单击事件!");

}

程序设计完成后,消息映射就确定下来,不会改变。

在动态映射关系条件下,需要在运行时设定事件与函数的对应关系。C++
Builder的应用程序中的任何窗体收到一个Windows就会触发一个OnMessage事件,通过该事件来捕获发送给程序的消息,并动态地建立消息
与响应函数之间的映射关系,也以一个实例来说明。

按上面提到的例子,建立一个按钮单击事件的响应,如下: void __fastcall TMsgExp::Button2Click(TObject *Sender)

{

//根据单选按钮的不同状态,动态建立消息与响应函数的映射

if (RadioButton1->Checked)

Application->OnMessage=ClickMouse;

if (RadioButton2->Checked)

Application->OnMessage=Move;

}

……

void __fastcall TMsgExp::ClickMouse(tagMSG & Msg, bool & Handled)

{

//对单击鼠标事件的处理

if(Msg.message==WM_LBUTTONDOWN)

{

num++;

Label1->Caption="你一共点击了"+AnsiString(num)+"次";

//允许后继过程继续处理该事件

Handled=false;

}

}

……

void __fastcall TMsgExp::Move(tagMSG & Msg, bool & Handled)

{

//对鼠标移动事件的处理

if(Msg.message==WM_MOUSEMOVE)

{

//从消息中过去鼠标的位置参数

WORD xPos = LOWORD(Msg.lParam);

WORD yPos = HIWORD(Msg.lParam);

Label1->Caption="当前鼠标位置 x:"+AnsiString(xPos)+" y:"+AnsiString(yPos);

//允许后继过程继续处理该事件

Handled=false;

}

}

上面的例子利用Application 的OnMessage事件实现了对鼠标移动和单击事件的动态响应。需要说明的是OnMessage事件仅仅接受发送到消息队列中的消息,对于利用API直接发送给窗口函数的消息将不与理会。

4 对自定义消息的处理

在有的情况下,程序需要发送自己定义的消息,它既可以用在两个应用程序之间的通讯,也可以用在一个程序内部的不同窗体和组件之间的通信。使用自定义
消息有两个优点:一是发消息时,无须知道接受者的具体类型,只要知道窗口的句柄;二是消息可以广播给多个接受者。它也有静态和动态的两种函数响应映射关
系。

同样举一个例子,在窗体类的头文件(。h)中加入自定义消息MY_SELFDEFINE,并静态的对这个自定义消息建立函数映射关系 ……

#define MY_SELFDEFINE (WM_USER+100)

……

//定义响应函数

void __fastcall Handle(TMessage & Msg);

……

//建立响应函数(Handle)与自定义消息(MY_SELFDEFINE)的映射

BEGIN_MESSAGE_MAP

MESSAGE_HANDLER(MY_SELFDEFINE,TMessage,Handle)

END_MESSAGE_MAP(TForm)

……

在窗体类的实现文件中(.cpp)分别实现定义的响应函数(Handle)和发送自定义的消息(MY_SELFDEFINE)

……

//响应函数的实现

void __fastcall TMsgExp::Handle(TMessage & Msg)

{

ShowMessage("拦截到自定义消息MY_SELFDEFINE");

}

……

//发送自定义的消息(MY_SELFDEFINE)

this->Perform(MY_SELFDEFINE,0,0);

应用程序接受到自定义的消息后,根据静态建立的映射关系,将消息交由响应函数处理。

接着上面的例子,再建立一个动态对自定义消息进行响应的例子。分别建立两个响应函数: OpenForm(打开新窗口)和CloseForm(关闭新窗口)。 void __fastcall TMsgExp::OpenForm(TMessage & Msg)

{

//截获到MY_SELFDEFINE消息,则打开新窗口,否则交由原来的函数处理

if (Msg.Msg == MY_SELFDEFINE)

NewWindows->Show();

else

WndProc(Msg);

}

……

void __fastcall TMsgExp::CloseForm(TMessage & Msg)

{

//截获到MY_SELFDEFINE消息,则关闭新窗口,否则交由原来的函数处理

if (Msg.Msg == MY_SELFDEFINE)

NewWindows->Hide();

else

WndProc(Msg);

}

……

//根据单选按钮的不同状态,动态建立自定义消息与响应函数的映射

if (RadioButton3->Checked)

/*利用TControl控件的WindowProc属性,动态地设置

对处理消息的响应函数*/

this->WindowProc=OpenForm;

if (RadioButton4->Checked)

this->WindowProc=CloseForm;

//发送自定义的消息(MY_SELFDEFINE)

this->Perform(MY_SELFDEFINE,0,0);

2. 在mousemove里判断鼠标的坐标即可


C语言程序运行的基本步骤是什么?
运行程序步骤:1.编辑:输入源程序并存盘(.C)2.编译:将源程序翻译为目标文件(.OBJ)3.链接:将目标文件生成可执行文件( .EXE)4.运行:执行.EXE文件,得到运行结果。上机1 C语言简单程序的编写和调试

C\/C++中,compile和build都无错通过后,屏幕上为什么不显示
其实控制台是一闪而过了,要在倒数第二个花括弧后面 加个 getch();return 0;

c语言问题,为什么我的compile是对的,build是错的?!
compile只是初步判断你的语句逻辑上是否有错,build是整个程序的运行,判断的不仅仅是逻辑语句错误

The building---by the farmer in 1988. a build b is built c was...
选C,这里讲到build 这个词,1.当它后面加上ing后有两个意思一是动名词也就是说他已经变成名词了,所以the building 在这里是主语,是名词,整句的意思是说这栋建筑是1988年由一个农民建的。 by 在这里是表示被动所以谓语动词要用被动语态, in 1988 是过去的时间所以要用过去是 所以答案是C...

codeblock怎么不能build,c语言
(build target has no object files to link)这里就是信息啊,楼主要多观察。这句话翻译成中文就是没有目标文件所以无法链接,要知道C++编译器是首先把每个翻译单元(.cpp和它include的)编译成目标文件,然后再用链接器(linker)把所有的目标文件链接成一个可执行文件。

在ARM上运行交叉编译后的opencv文件,没有输出
set( CMAKE_SYSTEM_NAME Linux )set( CMAKE_SYSTEM_PROCESSOR arm )set( CMAKE_C_COMPILER arm-linux-gnueabihf-gcc )set( CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++ )第二步:在opencv目录下新建build目录,进入build目录,执行命令:cmake -DCMAKE_TOOLCHAIN_FILE=..\/platforms\/linux\/arm-...

dsp中.c文件怎么变成.out文件
经过build产生。dsp中.out文件是最终的执行文件,.c文件经过build产生.out文件,数字信号处理,简称DSP,是一门涉及许多学科而又广泛应用于许多领域的新兴学科。

c语言,用vc6.0++写一个程序,为什么编译和组建产生的文件名不同?_百度...
Visual C++ 6.0简称VC或者VC6.0,是微软1998年推出的一款C\/C++ IDE,界面友好,调试功能强大。VC6.0是一款革命性的产品,非常经典,至今仍然有很多企业和个人在使用,很多高校也将VC6.0作为C语言的教学基础,作为上机实验的工具。本教程中的代码,也都是在VC6.0下运行通过。VC6.0 确实有点老了...

初学c语言,请问这是什么问题,为什么不能build
编译环境路径出问题,有可能是编译环境没有安装好,可以考虑重装编译器

Debbie hopes to ? a new world record. A . do B.make C.build...
set a record创纪录 hold a record保持纪录 break a record打破纪录 make a record做记录 你这个题是不是还有个D选项?

隆尧县15395096108: c++ builder 如何创建它的控制台应用程序? -
昔思乌灵: File->New->Other 在New 那一页 Console Wizzard

隆尧县15395096108: 如何在C++Builder中创建一个控件数组 -
昔思乌灵: 不是TListView和TListBox这两个VCL可视控件,是C++的类TList(链表类),你可以查查TList的帮助,看看怎么用.TList的最常用的方法是添加,删除,移动指针等操作,如果你对数据结构中的链表熟悉,应该使用起来没有困难.

隆尧县15395096108: 如何在C++Builder中制作简单的功能按钮 -
昔思乌灵: C++Builder是支持拖控件的,你把按钮拖在界面上,双击按钮就会自动生成对应的响应函数了

隆尧县15395096108: 怎样用c++builder控制电机 -
昔思乌灵: 你好, c++builder 不能直接控制电机,c++可以编写上位机软件 上位机软件,控制单片机等电机驱动设备,间接控制电机运转

隆尧县15395096108: 1,C++builder如何制作控件,2,C++builder如何处理鼠标离开的消息?
昔思乌灵: 2. 在mousemove里判断鼠标的坐标即可

隆尧县15395096108: c++builder Tquery控件使用方法 -
昔思乌灵: 1、设置ConnectionString 属性连接数据库;或用AOConnection连接数据库,用ADOQuery的Connection属性连接AOConnection,间接连接数据库;2、设置SQL属性,连接数据表;3、设置Active属性,为TRUE,激活.

隆尧县15395096108: 怎么用c++builder 创建ocx控件 并可以接收参数 -
昔思乌灵: 在C++ builder中用建立“ActiveX”项目试试!

隆尧县15395096108: 如何用C++ builder调试程序 -
昔思乌灵: 1.在代码前用鼠标左键点一下会出现一个红点(叫做断点),这样再运行程序时,程序运行到设置到断点处会停下来,按f8可以一句代码一句代码的运行,并且把鼠标指到你定义的变量上可以看到当前该变量的数值.在代码前再用鼠标左键点一下可以取消断点 2.要看数值,一般是在窗体中添加一个“按钮”控键,然后双击该按钮可以进入该按钮响应的函数,在函数内添家代码ShowMessage(str);其中str是字符串格式,这样程序运行时单击该按钮就可以显示str的内容 (如果要显示int型可以用ShowMessage(IntToStr(str));)

隆尧县15395096108: c++ builder如何编写c语言的程序 -
昔思乌灵: 1、启动bcb,bcb会自动生成一个form可视框架,既然你编写控制台程序,你直接选择 File菜单中的Close All,关闭它就行了.2、打开File菜单,选择New,然后选择other,会弹出一个对话框,里边很多选项,你选择 console wizard即可,然后出...

隆尧县15395096108: C++builder 怎么实现一个ComboBox控制另一个ComboBox -
昔思乌灵: 具体方法: Event Form1.ComboBox1.SelectChange Call Plugin.Office.OpenXls("c:\1.xls") form1.combobox2.list=“” i = 3 For 506id = Plugin.Office.ReadXls(1, i, 3)fuid = Plugin.Office.ReadXls(1, i, 2)name = Plugin.office.readxls(1, i, 1)If ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网