易语言快速启动器更新开源项目提供了一个易于使用的界面和高效的启动方案,帮助用户快捷访问常用程序或文件夹。此次更新进一步优化了用户体验,并开放源代码以促进社区贡献与合作。
最近研究了EX_DUI2.0这个较老的模块,下面分享我的发现。
首先,我们知道系统原生组件是一个特殊的窗口,在GDI+界面库中,一个组件就是一张位图。创建一个组件的核心源码是:创建一张位图,并获得其图形指针,方便对其进行绘制。
接着来看组件是如何被绘制到窗口上的。在组件基类里保存着这些类成员变量,它们记录了同层与子层组件的指针信息,在最终绘制过程中通过递归的方式完成全部组件的绘制;因此后创建的组件会显示在最上面。同样的,鼠标消息也是通过这个机制,递归查找鼠标所在的组件,并将该组件设置为焦点组件并保存在窗口类成员变量里。
新的界面库实现则是将这些信息存储到链表或哈希表中,但本质上我认为是类似的。
如果我们创建自己的组件,则需要三个环节:创建方法、窗口过程和绘制过程。通过调用父类初始化命令来完成组件的创建,并同时保存其属性如颜色和字体等。在易语言的对象内存模型下(为了实现多态性),所有的对象都被自动声明为虚函数了。
其中,组件的方法消息回调是第四十个方法,在控件基类中只有39个方法;因此这个窗口过程必须作为第三个方法来定义。绘制过程则是处理绘画消息的机制:通过调用Ex_BeginPaint(组件句柄、绘图数据等),获取到初始化得到的位图图形指针,以及该组件矩形区域的信息。
最后,在完成对组件位图的绘制后,需要使用 Ex_EndPaint(组件句柄、绘图数据)通知界面库你已经完成了这个组件的绘制。这样界面库就会在窗口上重新绘制这个被修改过的部分。
通过这三个步骤就能实现一个最简单的自定义组件了,比如简易标签等。