第三篇:用SOUI能做什么?

SOUI-DEMO界面预览

在回答SOUI能做什么之前,先看看SVN中demo工程的界面截图:

使用SOUI实现上面的界面主要的工作全在配置几个XML文件,基本不需要写C++代码。(如何配置XML布局将在后续文章中讲解)

从零开始生成一个使用SOUI的应用程序

以SOUI的demo为例,我们看在SOUI中如何一步一步实现一个应用程序。

首先使用Win32应用程序向导生成一个空项目。

新建一个如demo.cpp文件,定义一个_tWinMain函数。

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR /*lpstrCmdLine*/, int /*nCmdShow*/)
{
  return 0;
}

在项目的包含目录中包含$(SOUIPATH)\soui\include;$(SOUIPATH)\utilities\include;这两个目录。同时在库依赖中增加soui.lib utilities.lib。

$(SOUIPATH)是从SVN签出的trunk的根目录,如果安装了soui下的应用程序向导会自动为系统增加这个环境变量。

做好上述准备工作后在工程目录下建立一个如uires的目录,用来存放程序中用到的资源文件,包括布局使用的图片及XML布局文件。

在该目录下应该至少有一个uires.idx文件。uires.idx是一个XML文件,它定义程序中用到的所有其它资源的类型及名称。

demo中使用的uires.xml如下:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <resource>
 3   <UIDEF>
 4     <file name="xml_init" path="xml\init.xml"  />
 5   </UIDEF>
 6   <ICON>
 7     <file name="LOGO"  path="image\img_logo.ico" />
 8   </ICON>
 9   <CURSOR>
10     <file name="ANI_ARROW"  path="image\021.ani" />
11     <file name="CUR_TST" path="image\camera_capture.cur"/>
12   </CURSOR>
13   <LAYOUT>
14     <file name="maindlg" path="xml\dlg_main.xml"  />
15     <file name="menu_test" path="xml\menu_test.xml"  />
16     <file name="page_layout" path="xml\page_layout.xml"  />
17     <file name="page_treebox" path="xml\page_treebox.xml"  />
18     <file name="page_treectrl" path="xml\page_treectrl.xml"  />
19     <file name="page_misc" path="xml\page_misc.xml"  />
20     <file name="page_webkit" path="xml\page_webkit.xml"  />
21     <file name="page_about" path="xml\page_about.xml"  />
22   </LAYOUT>
23   <IMGX>
24     <file name="png_page_icons"   path="image\page_icons.png" />
25     <file name="png_small_icons"  path="image\small_icons.png" />
26
27     <file name="webbtn_back"  path="image\webbtn_back.png" />
28     <file name="webbtn_forward"  path="image\webbtn_forward.png" />
29     <file name="webbtn_refresh"  path="image\webbtn_refresh.png" />
30
31     <file name="png_treeicon"             path="image\TreeIcon.png"/>
32     <file name="png_menu_border"  path="image\menuborder.png" />
33
34     <file name="png_vscroll"  path="image\vscrollbar.png" />
35
36     <file name="png_tab_left"  path="image\tab_left.png" />
37     <file name="png_tab_left_splitter"  path="image\tab_left_splitter.png" />
38     <file name="png_tab_main"  path="image\tab_main.png" />
39     <file name="btn_menu" path="image\btn_menu.png"  />
40   </IMGX>
41   <GIF>
42     <file name="gif_horse"    path="image\horse.gif"/>
43     <file name="gif_penguin"    path="image\penguin.gif"/>
44   </GIF>
45   <rtf>
46     <file name="rtf_test"    path="rtf\RTF测试.rtf"/>
47   </rtf>
48   <script>
49     <file name="lua_test" path="lua\test.lua"/>
50   </script>
51   <translator>
52     <file name="lang_cn" path="translation files\lang_cn.xml"/>
53   </translator>
54 </resource>

如上所示,该XML有一个resource的根节点,下面可以是任意定义的类型(ICON, BITMAP,CURSOR除外,它们是预定义的类型,不能修改类型名)。

每个类型下面定义有file元素,元素中有两个属性:name 及 path。

name即资源的名称,path即资源的路径。所有资源建议采用相对路径,即相对于uires.idx文件的路径。

在程序中通过type及name来引用资源。

下面开始填空:

  1 int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR /*lpstrCmdLine*/, int /*nCmdShow*/)
  2 {
  3     //必须要调用OleInitialize来初始化运行环境
  4     HRESULT hRes = OleInitialize(NULL);
  5     SASSERT(SUCCEEDED(hRes));
  6
  7     int nRet = 0;
  8
  9     //定义一组组件加载辅助对象
 10     //SComLoader实现从DLL的指定函数创建符号SOUI要求的类COM组件。
 11     SComLoader imgDecLoader;
 12     SComLoader renderLoader;
 13     SComLoader transLoader;
 14     SComLoader scriptLoader;
 15     SComLoader zipResLoader;
 16
 17     //将程序的运行路径修改到demo所在的目录
 18     TCHAR szCurrentDir[MAX_PATH]={0};
 19     GetModuleFileName( NULL, szCurrentDir, sizeof(szCurrentDir) );
 20     LPTSTR lpInsertPos = _tcsrchr( szCurrentDir, _T(‘\\‘) );
 21     _tcscpy(lpInsertPos,_T("\\..\\demo"));
 22     SetCurrentDirectory(szCurrentDir);
 23
 24     {
 25         //定义一组类SOUI系统中使用的类COM组件
 26         //CAutoRefPtr是一个SOUI系统中使用的智能指针类
 27         CAutoRefPtr<IImgDecoderFactory> pImgDecoderFactory; //图片解码器,由imagedecoder-wid.dll模块提供
 28         CAutoRefPtr<IRenderFactory> pRenderFactory;         //UI渲染模块,由render-gdi.dll或者render-skia.dll提供
 29         CAutoRefPtr<ITranslatorMgr> trans;                  //多语言翻译模块,由translator.dll提供
 30         CAutoRefPtr<IScriptModule> pScriptLua;              //lua脚本模块,由scriptmodule-lua.dll提供
 31
 32         BOOL bLoaded=FALSE;
 33         int nType=MessageBox(GetActiveWindow(),_T("选择渲染类型:\n[yes]: Skia\n[no]:GDI\n[cancel]:Quit"),_T("select a render"),MB_ICONQUESTION|MB_YESNOCANCEL);
 34         if(nType == IDCANCEL) return -1;
 35         //从各组件中显示创建上述组件对象
 36         bLoaded=renderLoader.CreateInstance(nType==IDYES?COM_RENDER_SKIA:COM_RENDER_GDI,(IObjRef**)&pRenderFactory);
 37         SASSERT_FMT(bLoaded,_T("load module [%s] failed!"),nType==IDYES?COM_RENDER_SKIA:COM_RENDER_GDI);
 38         bLoaded=imgDecLoader.CreateInstance(COM_IMGDECODER,(IObjRef**)&pImgDecoderFactory);
 39         SASSERT_FMT(bLoaded,_T("load module [%s] failed!"),COM_IMGDECODER);
 40         bLoaded=transLoader.CreateInstance(COM_TRANSLATOR,(IObjRef**)&trans);
 41         SASSERT_FMT(bLoaded,_T("load module [%s] failed!"),COM_TRANSLATOR);
 42         //为渲染模块设置它需要引用的图片解码模块
 43         pRenderFactory->SetImgDecoderFactory(pImgDecoderFactory);
 44         //定义一个唯一的SApplication对象,SApplication管理整个应用程序的资源
 45         SApplication *theApp=new SApplication(pRenderFactory,hInstance);
 46
 47         //定义一人个资源提供对象,SOUI系统中实现了3种资源加载方式,分别是从文件加载,从EXE的资源加载及从ZIP压缩包加载
 48         CAutoRefPtr<IResProvider>   pResProvider;
 49 #if (RES_TYPE == 0)//从文件加载
 50         CreateResProvider(RES_FILE,(IObjRef**)&pResProvider);
 51         if(!pResProvider->Init((LPARAM)_T("uires"),0))
 52         {
 53             SASSERT(0);
 54             return 1;
 55         }
 56 #elif (RES_TYPE==1)//从EXE资源加载
 57         CreateResProvider(RES_PE,(IObjRef**)&pResProvider);
 58         pResProvider->Init((WPARAM)hInstance,0);
 59 #elif (RES_TYPE==2)//从ZIP包加载
 60         bLoaded=zipResLoader.CreateInstance(COM_ZIPRESPROVIDER,(IObjRef**)&pResProvider);
 61         SASSERT(bLoaded);
 62         ZIPRES_PARAM param;
 63         param.ZipFile(pRenderFactory, _T("uires.zip"));
 64         bLoaded = pResProvider->Init((WPARAM)&param,0);
 65         SASSERT(bLoaded);
 66 #endif
 67         //将创建的IResProvider交给SApplication对象
 68         theApp->AddResProvider(pResProvider);
 69
 70         if(trans)
 71         {//加载语言翻译包
 72             theApp->SetTranslator(trans);
 73             pugi::xml_document xmlLang;
 74             if(theApp->LoadXmlDocment(xmlLang,_T("lang_cn"),_T("translator")))
 75             {
 76                 CAutoRefPtr<ITranslator> langCN;
 77                 trans->CreateTranslator(&langCN);
 78                 langCN->Load(&xmlLang.child(L"language"),1);//1=LD_XML
 79                 trans->InstallTranslator(langCN);
 80             }
 81         }
 82 #ifdef DLL_SOUI
 83         //加载LUA脚本模块,注意,脚本模块只有在SOUI内核是以DLL方式编译时才能使用。
 84         bLoaded=scriptLoader.CreateInstance(COM_SCRIPT_LUA,(IObjRef**)&pScriptLua);
 85         SASSERT_FMT(bLoaded,_T("load module [%s] failed!"),COM_SCRIPT_LUA);
 86         if(pScriptLua)
 87         {
 88             theApp->SetScriptModule(pScriptLua);
 89             size_t sz=pResProvider->GetRawBufferSize(_T("script"),_T("lua_test"));
 90             if(sz)
 91             {
 92                 CMyBuffer<char> lua;
 93                 lua.Allocate(sz);
 94                 pResProvider->GetRawBuffer(_T("script"),_T("lua_test"),lua,sz);
 95                 pScriptLua->executeScriptBuffer(lua,sz);
 96             }
 97         }
 98 #endif//DLL_SOUI
 99
100         //向SApplication系统中注册由外部扩展的控件及SkinObj类
101         SWkeLoader wkeLoader;
102         if(wkeLoader.Init(_T("wke.dll")))
103         {
104             theApp->RegisterWndFactory(TplSWindowFactory<SWkeWebkit>());//注册WKE浏览器
105         }
106         theApp->RegisterWndFactory(TplSWindowFactory<SGifPlayer>());//注册GIFPlayer
107         theApp->RegisterSkinFactory(TplSkinFactory<SSkinGif>());//注册SkinGif
108         SSkinGif::Gdiplus_Startup();
109
110         //加载系统资源
111         HMODULE hSysResource=LoadLibrary(SYS_NAMED_RESOURCE);
112         if(hSysResource)
113         {
114             CAutoRefPtr<IResProvider> sysSesProvider;
115             CreateResProvider(RES_PE,(IObjRef**)&sysSesProvider);
116             sysSesProvider->Init((WPARAM)hSysResource,0);
117             theApp->LoadSystemNamedResource(sysSesProvider);
118         }
119
120         //加载全局资源描述XML
121         theApp->Init(_T("xml_init"));
122
123         {
124             //创建并显示使用SOUI布局应用程序窗口,为了保存窗口对象的析构先于其它对象,把它们缩进一层。
125             CMainDlg dlgMain;
126             dlgMain.Create(GetActiveWindow(),0,0,800,600);
127             dlgMain.GetNative()->SendMessage(WM_INITDIALOG);
128             dlgMain.CenterWindow();
129             dlgMain.ShowWindow(SW_SHOWNORMAL);
130             nRet=theApp->Run(dlgMain.m_hWnd);
131         }
132
133         //应用程序退出
134         delete theApp;
135         SSkinGif::Gdiplus_Shutdown();
136
137     }
138
139     OleUninitialize();
140     return nRet;
141 }

大家可能发现使用SOUI的这个main函数相对于其它程序可能要更加复杂,这是为了达到程序配置的灵活性需要付出的代价。

好在SOUI提供了应用程序向导,它会帮助你点两个按钮就生成一整套框架。

SOUI与其它应用程序开发框架

SOUI是一个使用纯Win32 SDK开发的UI库,内核部分使用了pugixml这个第三方库作为XML解析的模块,除此之外,不再依赖其它第三方库,同时所有使用的模块都可以通过源代码编译。

SOUI提供了一整套完整的UI开发框架,不需要依赖其它的如MFC,WTL等开发框架。同时由于SOUI是纯win32的SDK开发的,它理论上也可以和任意的其它开发框架共存。(实际处理中由于SOUI中使用的一些类的命名可能和其它框架冲突,因此可能需要注意命名空间的使用。)

第三篇:用SOUI能做什么?,布布扣,bubuko.com

时间: 2024-10-12 12:30:00

第三篇:用SOUI能做什么?的相关文章

C# Online ! 第三篇:连C#也不例外 ! 这是新手都要做的事情!!

玩过Online game的朋友一定都知道,游戏刚开始新手都会有一定要做的事情,可能是先去打木人,或是先找头上有惊叹号的人说说话,这样很快就可以练到LV5了喔!!这种简单的事情对新手来说,意义可是很重大的,从LV1(什么都没有) ~ LV5(好像还是什么都没有...但是等级至少比较高了嘛..),既然新手都有一些一定要做的事情,想必写程序也是一样,来去Bing一下吧!! "hello, world"这个是我查询出来的结果,这似乎是写程序的初心者一开始都必须做的事情啊...而且这是有典故的

第二十五篇:在SOUI中做事件分发处理

不同的SOUI控件可以产生不同的事件.SOUI系统中提供了两种事件处理方式:事件订阅 + 事件处理映射表(参见第八篇:SOUI中控件事件的响应) 事件订阅由于直接将事件及事件处理函数连接,不存在事件分发的问题,这里主要介绍使用事件映射表时的事件分发. 在回答这个问题前,首先了解一下什么是事件分发. 在大型项目中,程序逻辑可能非常复杂,如果将所有UI中控件的事件处理集中在一个消息/事件映射表里,代码的可维护性会变得非常差.解决这个问题常见的方法就是将事件进行分类(如根据来源分类),不同类别的事件采

认识元数据和IL(上) &lt;第三篇&gt;

说在,开篇之前 很早就有说说Metadata(元数据)和IL(中间语言)的想法了,一直在这篇开始才算脚踏实地的对这两个阶级兄弟投去些细关怀,虽然来得没有<第一回:恩怨情仇:is和as>那么迅速,但是Metadata和IL却是绝对重量级的内容,值得我们在任何时间关注,本文就是开始. 1 引言 你可曾想到,我们的C#代码,编译之后究竟为何物?你可曾认知,我们的可执行程序,运行之时的轨迹究竟为哪般?那么,本文通过对Metadata(元数据)和IL(Intermediate Language, 中间语

第三篇 读后感

      今天读了大道至简中的第三篇关于团队缺乏的不只是管理的文章,其中作者引用了<汉书>中的“言人三人众”,来说明团队是至少以三个人为规模的,而三人构成的团队,这样便具备了团队的一些基本特征:主从.监督和责任.团队并不是个体能够组成的,两个人同样不能成为一个团队,两人则互相支撑,正如古文中“从”字是二人互立的,并没有监督.老师课上所说的一个和尚有水喝,两个和尚抬水喝,三个和尚没水喝的故事,三个和尚之所以没水喝是因为没有能够的安排没有领导人,三个人本能比一个人有更高的效率,正如文中所说的的一

学习KnockOut第三篇之List

欲看此篇---------------------------------------------可先看上篇. 第一步,先搭建一个大概的框架起来.至于绑定什么的,我们稍后慢慢进行.可能会有人问为什么我那个位置要写一个form,关于这个呢,且埋一伏笔,稍后说明原由. 我们要做的是,当点击“Add”按钮时能将文本框里的值加入的下拉框里,当我们选中下拉框里的选项时点击"Remove"也能进行删除操作,同样,当点击“Sort”时也能对下拉框里的选项进行排序.有代码和图: 1 <!DOCT

LoadRunner用户行为模拟器 《第三篇》

用户行为模拟器简称VU,VU通过运行VU脚本模拟了用户对软件的操作行为.VU是基于网络协议的.很明显,被测服务器是通过各种各样的网络协议与客户端打交道的.VU要"骗过"被测服务器,当然就要遵守这些协议,按规矩.按步骤来执行动作,否则就会吃"闭门羹". 基于网络协议的脚本的一个好处是,我们可以使用相对少的硬件资源,来生成大量的虚拟用户负载.相比之下,WinRunner和QTP脚本时基于界面事件的,它在一台主机上同时只能运行一个虚拟用户的脚本,因为一个虚拟用户会占用整个

SQL Server索引的维护 - 索引碎片、填充因子 &lt;第三篇&gt;

实际上,索引的维护主要包括以下两个方面: 页拆分 碎片 这两个问题都和页密度有关,虽然两者的表现形式在本质上有所区别,但是故障排除工具是一样的,因为处理是相同的. 对于非常小的表(比64KB小得多),一个区中的页面可能属于多余一个的索引或表---这被称为混合区.如果数据库中有太多的小表,混合区帮助SQL Server节约磁盘空间. 随着表(或索引)增长并且请求超过8个页面,SQL Server创建专用于该表(或索引)的区并且从该区中分配页面.这样一个区被称为统一区,它可以为多达8个相同表或索引的

第三篇——第二部分——第五文 配置SQL Server镜像——域环境SQL Server镜像日常维护

本文接上面两篇搭建镜像的文章: 第三篇--第二部分--第三文 配置SQL Server镜像--域环境:http://blog.csdn.net/dba_huangzj/article/details/28904503第三篇--第二部分--第四文 配置SQL Server镜像--非域环境:http://blog.csdn.net/dba_huangzj/article/details/27652857 在搭建的过程中,可能你会遇到比较多的问题,下面介绍一些常见的问题及解决方案,另外把主要精力放到对

视觉SLAM中的数学基础 第三篇 李群与李代数

视觉SLAM中的数学基础 第三篇 李群与李代数 前言 在SLAM中,除了表达3D旋转与位移之外,我们还要对它们进行估计,因为SLAM整个过程就是在不断地估计机器人的位姿与地图.为了做这件事,需要对变换矩阵进行插值.求导.迭代等操作.例如,在经典ICP问题中,给定了两组3D点,我们要计算它们之间的变换矩阵.假设第一组的3D点为$\mathbf{P}=\{ \mathbf{p}_i | i = [1,2, \ldots, N] \}$,第二组3D点为$\mathbf{Q}=\{ \mathbf{q}