您现在的位置: 范文先生网 >> 理工论文 >> 计算机论文 >> 正文

酒杯上的碟

时间:2007-1-30栏目:计算机论文

erties
Ctl3D
DefWndProc
DockManager
DockSite
ImeMode
ImeName
ParentCtl3D
UseDockManager
WheelAccumulator

附图1: 从TWidgetControl(和TWinControl相类似)里面去掉的Methods和properties.


此刻我打赌你正在想:"还不坏.转移我的应用程序听上去不是很难",但是请等等----还有更多的.在写此文的时候,CLX类的名字都被加上了一个"Q"的前缀,比如StdCtrls变成了QStdCtrls,有些类被稍微搅乱了一点,在类继承上面只有一些细微差别.(见附图 2)


附图 2: 在类继承上面的细微区别.


CLX的这个"Q"前缀不一定是最终版本的前缀.TWinControl现在变成了TWidgetControl,不过为了安抚痛苦,我们为TWidgetControl添加了一个TWinControl的别名.TWidgetControl和它的后代都有一个Handle属性,隐式地指向Qt对象,有一个Hooks属性指向一个hook对象,用来实现事件机制.(Hooks是一个复杂的话题,已经超出本文的讨论范围)

OwnerDraw将被一种叫做Styles

的方法替代. 基本上Styles是widget或应用程序显示新面孔的一种机制,类似于windows下面的贴图(skins). 这部分正在开发当中,所以本文中我无法更进一步的介绍,我只能说:它非常酷!

(新旧控件中)有没有什么是一样的?当然有,TCanvas(包括Pens,Brushes等)和你记得的一样.就像我说过的,类的继承基本上一样,还有事件,比如OnMouseDown, OnMouseMove, OnClick...等等都还在.

让我看看内涵(Show Me the Meaning)(???)

让我们进入到CLX的躯体,看看它是如何工作的.Qt是一个C++的工具集,所以所有的widgets都是C++对象.另一方面,CLX是用Object Pascal写的,并且Object Pascal不能直接和C++对象对话.越想简单就越难,Qt在几个地方使用了多继承,所以我们建立了一个接口层(interface layer)来获得所有Qt的类,并且把它们还原成一系列普通的C函数,然后把它们包装成Windows下的DLL或是Linux下的共享对象(shared object).

每个TWidgetControl都有CreateWidget, InitWidget, 和HookEvents虚方法,并且几乎总是被重载. CreateWidget创建Qt的widget,然后指派Handle到FHandle这个私有域变量.当widget被构造(constructed)后,InitWidget被调用,然后Handle有效.你的一些属性赋值将从Create这个构造函数转移到InitWidget.这将能够做到延迟构造(delayed construction)一个对象,直到真的需要它的时候.举个例子,你有一个属性叫Color,在SetColor里面,你可以通过HandleAllocated来检测是否你有一个Qt的Handle,如果handle已经分配(allocated),你就可以正确地调用Qt来设置颜色.如果没有分配,你可以把值保存在一个私有域变量中,然后在InitWidget中设置属性.


有两种类型的事件(events): Widget事件和系统事件.HookEvents是一个虚方法(virtual method),它钩住(hooks)CLX控件的事件方法到一个特殊的Hook对象,通过这个对象和Qt对象通讯.(至少这是我希望看到的)
这个hook对象其实是方法指针的集合.系统事件现在通过EventHandler,基本上是WndProc的替代品.

比生命还大(Larger Than Life)(????)

所有这些都只是后台信息(background information),因为你真的不必为了写交叉平台的定制控件而知道这些.在CLX的帮助下,写交叉平台控件只是小菜一碟(a snap).就像你不必理解Windows API的复杂性而去写VCL控件一样.CLX和Qt也是如此. 本文最后展示了一个用CLX写的定制控件代码

下面是一个工程文件CalcTest.dpr. 计算器控件运行在windows下(见附图4) 和Linux下(见附图5) 看上去多么像标准的Microsoft Windows 计算器!

program CalcTest;
uses
SysUtils, Classes, QControls, QForms, QStdCtrls, Qt,
QComCtrls, QCalc, Types;
type
TTestForm = class(TForm)
Calc: TCalculator;
public
constructor Create(AOwner: TComponent); override;
end;

var
TestForm: TTestForm;
{ TTestForm

上一页  [1] [2] [3] [4] [5] [6] [7] [8] 下一页

下页更精彩:1 2 3 4 下一页