如何在SOUI窗口中动态创建新的SWindow?

一些网友经常出现的一个问题就是我下面的代码为什么在SOUI的xxx窗口中没有动态创建了新窗口:

SWindow *pWnd = new SWindow();
FindChildByName(L"xxx")->InsertChild(pWnd);

上面这样的代码有3个问题:

1、它并不会在界面中显示出来你new出来的子窗口。因为这个新插入的窗口没有指定布局属性。

2、这样做在程序退出时可能出现崩溃,因为内存分配和翻译可能不在相同的模块。

3、pWnd中的各种其它属性也没有被正常初始化。

正确的方法是使用SWindow::CreateChildren(LPCWSTR pszXml)这个方法来创建窗口。

pszXml必须是一个XML字符串。

SWindow::CreateChildren和上面代码有什么区别?先找到这个函数看下它的代码:

 1  SWindow * SWindow::CreateChildren(LPCWSTR pszXml)
 2     {
 3         pugi::xml_document xmlDoc;
 4         if(!xmlDoc.load_buffer(pszXml,wcslen(pszXml)*sizeof(wchar_t),pugi::parse_default,pugi::encoding_utf16)) return NULL;
 5         BOOL bLoaded=CreateChildren(xmlDoc);
 6         if(!bLoaded) return NULL;
 7         else return m_pLastChild;
 8     }
 9
10     BOOL SWindow::CreateChildren(pugi::xml_node xmlNode)
11     {
12         TestMainThread();
13         for (pugi::xml_node xmlChild=xmlNode.first_child(); xmlChild; xmlChild=xmlChild.next_sibling())
14         {
15             if(xmlChild.type() != pugi::node_element) continue;
16
17             if(_wcsicmp(xmlChild.name(),KLabelInclude)==0)
18             {//在窗口布局中支持include标签
19                 SStringT strSrc = S_CW2T(xmlChild.attribute(L"src").value());
20                 pugi::xml_document xmlDoc;
21                 SStringTList strLst;
22
23                 if(2 == ParseResID(strSrc,strLst))
24                 {
25                     LOADXML(xmlDoc,strLst[1],strLst[0]);
26                 }else
27                 {
28                     LOADXML(xmlDoc,strLst[0],RT_LAYOUT);
29                 }
30                 if(xmlDoc)
31                 {
32                     CreateChildren(xmlDoc.child(KLabelInclude));
33                 }else
34                 {
35                     SASSERT(FALSE);
36                 }
37             }else if(!xmlChild.get_userdata())//通过userdata来标记一个节点是否可以忽略
38             {
39                 SWindow *pChild = SApplication::getSingleton().CreateWindowByName(xmlChild.name());
40                 if(pChild)
41                 {
42                     InsertChild(pChild);
43                     pChild->InitFromXml(xmlChild);
44                 }
45             }
46         }
47
48         return TRUE;
49     }

注意上面代码的39行及43行。

39行意思是让SOUI系统new一个和标签匹配的SWindow对象,查看CreateWindowByName的代码,发现也是直接new一个对象,但这和在APP层new是不一样的,因为这个新的对象不做特别处理释放也是在SOUI模块内,所以APP层一般是不能直接new一个窗口对象的。

更重根的是第43行,你应该在XML里配置好布局属性及其它相关的皮肤属性。通过这一行SOUI把这些属性初始化到新创建的对象,系统才能正常显示新创建的控件。

时间: 2024-08-12 17:33:14

如何在SOUI窗口中动态创建新的SWindow?的相关文章

PB中外部数据源数据窗口中动态创建列

公司原来做的横向报表用pb的外部数据源的做的,只支持固定列,列数相当于是在数据窗口中固定好的,横向的数据项一多,列就支持不了,需要自己在跑到数据窗口中增加,改程序,于是想列的创建能不能改成动态的呢?通过数据窗口的语法工具,发现有办法: <DW Control Name>.Modify(& "create column( id=<an integer> tabsequence=<an integer> accelerator='<a single

如何在c程序中动态使用数组

C语言不允许对数组的大小作动态定义,不能在程序中临时输入数组大小,这就给编程带来一定的困难. 下面通过一个求平均数和标准差的小程序来展示如何在程序中动态定义数组大小: 1 /*如何在c程序中动态使用数组(calloc函数)*/ 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <math.h> 5 int main(){ 6 int num; //数据个数 7 double sum,ave,s2; //数据和.平

Python中动态创建类实例

Python中动态创建类实例 简介 在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢? 其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模块.如下: def createInstance(module_name, class_name, *args, **kwargs): module_meta = __import__(module_name, globals(), locals(), [class_n

OC中动态创建可变数组的问题.有一个数组,数组中有13个元素,先将该数组进行分组,每3个元素为一组,分为若干组,最后用一个数组统一管理这些分组.(要动态创建数组).两种方法

<span style="font-size:24px;">//////第一种方法 // NSMutableArray *arr = [NSMutableArray array]; // for (int i = 0; i < 13; i ++) { // [arr addObject:[NSString stringWithFormat:@"lanou%d",i + 1]]; // } // NSLog(@"%@",arr);

html中动态创建表格

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>dtTable.html</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equ

DOM中动态创建元素与jQuery中动态创建元素

DOM中动态创建元素与jQuery中动态创建元素 DOM中动态创建元素: 1. document.write("标签的代码")    缺点:页面中原有的元素会被覆盖掉 2. innerHTML 3. document.createElement("标签的名称") jQuery中动态创建元素: 1. $("标签的代码") 2. 对象.html("标签的代码") 原文地址:https://www.cnblogs.com/david

在代码中动态创建控件无法保存状态的问题

在网上找了点资料,算是明白了,这是我觉得有帮助的文章: 原文:http://blog.csdn.net/keleloveni/archive/2007/03/15/1530300.aspx 引文: 今天偶然看到有篇文章谈到了相关的问题,终于又解决了一个自己不是很明白的东西. 页面生命周期中的第一个阶段是实例化,在这个阶段中,自动生成的类会根据页面的 HTML 部分中定义的静态控件构建控件层次结构.构造控件层次结构时,声明性语法中指定的值会赋给添加的每个控件的属性.实例化之后是初始化阶段,在这个阶

BroadcastReceiver接收电量变化的广播-------在代码中动态创建接受者

本例为动态创建广播接收者即不是在AndroidManifest.xml文件中定义的广播接收着 代码: 1 package com.qf.broadcastreceiver01; 2 3 import android.app.Activity; 4 import android.app.AlertDialog; 5 import android.content.BroadcastReceiver; 6 import android.content.Context; 7 import android

jQuery中动态创建、添加元素的方法总结

<input type="button" value="创建元素" id="btn"> <div id="box"></div> <p id="main">这是文中一段话</p> //点击按钮,动态创建元素 //方法一:$()创建元素,后用append()方法添加.append() 还可以把其他地方元素添加进这个对象中. $('#btn').cli