一、引言
使用 SOUI 的过程是一个漫长的学习过程,必然要以需求驱使着,才能够促使自己去探索其内部的原理。
最近有一个想法:
将一个导航条封装成一个控件类,但是导航条里面众多的按钮消息应该如何封装成自定义消息呢?
我想要不论点击哪个按钮,也只需要外部监控一个事件消息来处理即可。这样子,对于外部来说,这个控件就是完整的封装良好的个体。
那么自定义控件的方法,SOUI 的博客上已经有过描述了,但是自定义控件消息的方法,却没有详细的记载,只能我们自己来探索了(虽然其实并不难 T_T)。
那么,就让我们开始吧,让我们设想下实现这么一个需求:
使用 SOUI 扩展一个如下的控件:
1. 有两个按钮:按钮1 和 按钮 2
2. 当我们点击任何一个按钮的时候,在外部可以接收到事件信息,并且弹窗显示我们点击了哪个按钮
这个需求需要分两步走,第一步实现这个控件,第二个实现自定义事件,让我们一步一步来吧。
二、DIY 控件
自定义控件的内容在 SOUI 作者的博客中有所提及:
第二十八篇:SOUI中自定义控件开发过程
这里我简单说下我实现本篇博客的 STestControl 控件的步骤(不是本篇博客的重点):
1. 新建一个 SOUI 项目(额,这是必然的 T_T)
2. 新建一个 STestControl 类,继承自 SOUI::SWindow,这个类中,最基本的除了构造析构,就是 OnCreate 和 SOUI 的窗口绑定映射了,以下是 OnCreate (实现其初始化从 xml 文件中加载控件的功能) 的代码:
// 创建控件:初始化 xml,绑定事件等等
int STestControl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
pugi::xml_document xmlDoc;
SOUI::SStringW strXml = L"test_control";
if (!LOADXML(xmlDoc, strXml, L"LAYOUT")) {
return E_FAIL;
}
pugi::xml_node itemXmlNode = xmlDoc.child(L"testcontrol");
if (!itemXmlNode) {
return E_FAIL;
}
this->CreateChildren(itemXmlNode);