本系列文章基于VS2022+SOUI4,对于SOUI4相对于SOUI3来说主要是添加了导出C接口的能力,对应的代码上也比较多的采用了宏,当然原理上和SOUI3并没有太大差别。
一面来具体实现我们的图表控件类。
一、创建控件类。
下面新建一个控件类。我把它叫 SCharts这个控件基于SWindow。代码如下:
#pragma once
#include <core\SWnd.h>
SNSBEGIN
class SCharts :
public SWindow
{
DEF_SOBJECT(SWindow, L"scharts")
public:
protected:
//属性列表
SOUI_ATTRS_BEGIN()
SOUI_ATTRS_END()
//消息映射列表
SOUI_MSG_MAP_BEGIN()
SOUI_MSG_MAP_END()
};
SNSEND
可以看到SNSBEGIN(这个其实就是namespace SOUI我个人一般使用这个命名空间来开发控件,当然你大可不必,这样的好处就是使用统一的SOUI空间在任何时候使用SOUI下的类不需要考虑不同命名空间下的同名类) DEF_SOBJECT SOUI_ATTRS_BEGIN SOUI_ATTRS_END SOUI_MSG_MAP_BEGIN SOUI_MSG_MAP_END SNSEND几个宏,这几个宏都很简单。这里只说一下DEF_SOBJECT宏,这个宏的目的是给类定义一个名字和类型,前面的SWindow说明它是一个控件类,后一个L"scharts"给它定义一个我们在XML里使用的名字。这里便是SOUI能通过XML识别和创建类的关键。这样我们已经得到了一个叫做scharts的控件,当然现在它什么也没有其行为和SWindow是完全一样的。
二、向SOUI注册控件类
为了使SOUI在解析XML时知道怎么解释scharts,我们需要向SOUI注册,这里我在向导生成控件的Regitercustom函数注册控件。代码如下:
//注册用户自定义皮肤和控件
void Regitercustom()
{
SASSERT(m_theApp);
m_theApp->RegisterWindowClass<SCharts>();
}
三、在XML里使用控件
通过上面的步骤我们已经成功向SOUI申明了一个控件,现在在XML里已经可正常使用我们定义的控件了。只需要在XML里添加它即可正常使用。
<scharts text="scharts" colorBkgnd="#FF0000" size="-2,-2">
</scharts>
到此我们已经完成了一个控件开发的全部主要流程。当然它现在是披着scharts 名字的SWindow
下面是运行效果。
最后驸上项目地址bugHappy/SCharts: 基于SOUI4的图表控件 (github.com)
当然你看到时候它可以已经更完善和支持更多功能。