深入C++ Builder之编写自己的元件 -深入分析VCL继承、消息机制(2)

本文介绍了如何在C++ Builder中处理VCL组件的键盘鼠标事件,通过重载动态函数如MouseDown、MouseUp、MouseMove等实现。文章探讨了动态函数(dynamic)在Delphi和C++中的差异,并提供了如何在C++中使用DYNAMIC宏实现动态函数的示例。此外,还展示了如何创建一个简单的自定义元件,提供矢量绘图功能,包括定义自定义事件处理。
摘要由CSDN通过智能技术生成

这篇文章提及内容可能大家已经在很多地方看到过了,作者也是如此,只不过还看了很多VCL源代码,加上自己实际编写元件的经验,拼凑了这么一篇文章。所以所有言论都是个人观点、经验的描述,仅供参考。

 

你可转载,拷贝,但必须加入作者署名Aweay,如果用于商业目的,必须经过作者同意。

 

DYNAMIC函数

在上篇文章我们讲到了如何绘制元件,但是光绘制元件还是不够的,一个元件不光要有样子,还要能够处理、相应用户输入,这就需要我们来处理键盘鼠标事件。

处理键盘鼠标事件同样像我们处理系统消息一样,比如WM_KEYDOWN等这样的消息,所以你可以同样像在Form中处理消息那样重载WndProc或者编写消息映射宏,所有的这些方法都可以用到元件中,但是我们没有不用,也没有必要这么做。VCL已经提我们预留了很多接口函数,我们只需要重载相应虚拟函数就可以完成相应事件的处理。

如果你要处理鼠标事件,那么你需要重写下列函数:

MouseDown

MouseUp

MouseMove

Click

如果你需要处理键盘,那么你需要处理下列函数:

KeyPress

KeyDown

KeyUp

对于键盘虚拟函数,你需要注意派生类必须继承自TCustomeControl(直接或间接,准确的说,也不一定)才能使用上面的虚拟函数。

上面的函数看起来和我们在设计Form时的函数差不多,但是他们有一个明显的差别,如果你重载他们似乎不是那么容易,如果你看VCL源代码,它只写一个overide关键字来标示函数属性,但是在C++里这样就不行了,为什么呢?

我们先来看一下在VCL中的源代码:

procedure KeyDown(var Key: Word; Shift: TShiftState); dynamic;

    procedure KeyUp(var Key: Word; Shift: TShiftState); dynamic;

procedure KeyPress(var Key: Char); dynamic;

基本上所有的这些虚拟(动态)函数都是这样申明的,可以在C++并没有dynamic这个关键字啊?为了解释这个问题,我们先来了解一下什么时dynamic函数:

Delphi中,函数有virtualdynamic两种多态方式,对于virtual和我们C++中的virtual没有区别,而dynamic则不一样,dynamic仅维护一份虚拟方法表,当一个基类有多个多态函数,而这个基类又有可能被多次继承的时候,使用dynamic申明的函数可以减少代码长度,不过dynamicvirtual的行为都是差不多的,virtual的速度要比dynamic

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值