DuiVision的源代码工程有两种类型:主程序和插件工程,可以通过人工方式创建DuiVision工程,也可以通过Visual Studio向导自动创建工程。
人工创建主程序的方法
1、创建一个基于DuiVision的界面程序是比较简单的,在VC中创建一个MFC对话框工程,注意工程要使用Unicode库:
工程创建之后,需要将默认对话框资源中的几个按钮和文字都删除,变成一个干净的对话框资源:
2、设置DuiVision的头文件和lib文件目录
将DuiVision的头文件和lib文件放在某个位置,并在工程的头文件和lib文件路径定义部分添加相应的目录。
然后在stdafx.h文件中添加如下几行对DuiVision的头文件和lib文件的引用。
#include "DuiVision.h"
Lib库采用在工程设置中添加引用库文件的方式,针对VC2008的DuiVision库文件分别是DuiVision.2008d.lib和DuiVision.2008.lib。
添加lib引用之后应该就可以编译代码了。
3、DuiVision库的初始化以及主窗口的定义
在主程序的App类InitInstance()函数中添加DuiVision库的引用代码,示例代码如下:
// 初始化DuiVision界面库,可以指定语言,dwLangID为表示自动判断当前语言
// 1116是Demo程序的应用程序ID,每个DUI应用程序应该使用不同的ID
// ID主要用于进程间通信传递命令行时候区分应用
// IDD_DUIVISIONDEMO_DIALOG是工程中创建的那个对话框资源ID,所有窗口都是共用此ID的
// 第三个参数可以指定资源文件名,如果不指定默认使用xml\resource.xml的定义进行资源的加载,资源文件名的定义方式参考下面的说明
DWORD dwLangID = 0;
new DuiSystem(m_hInstance, dwLangID, _T("DuiVisionDemo.ui"), 1116, IDD_DUIVISIONDEMO_DIALOG, "");
// 创建主窗口
CDlgBase* pMainDlg = DuiSystem::CreateDuiDialog(_T("dlg_main"), NULL, _T(""), TRUE);
// 给主窗口注册事件处理对象
CDuiHandlerMain* pHandler = new CDuiHandlerMain();
pHandler->SetDialog(pMainDlg);
DuiSystem::RegisterHandler(pMainDlg, pHandler);
// 初始化提示信息窗口
DuiSystem::Instance()->CreateNotifyMsgBox(_T("dlg_notifymsg"));
// 按照非模式对话框创建主窗口,可以设置为默认隐藏
pMainDlg->Create(pMainDlg->GetIDTemplate(), NULL);
//pMainDlg->ShowWindow(SW_HIDE);
INT_PTR nResponse = pMainDlg->RunModalLoop();
// 如果是按照模式对话框运行主窗口,只要改为如下代码就可以
//INT_PTR nResponse = pMainDlg->DoModal();
// 释放DuiVision界面库的资源
DuiSystem::Release();
如果已经定义了主窗口的XML定义文件,添加上面的代码之后应该就可以创建出主窗口了。这段代码做的事情主要是:
1、DuiVision库的初始化,并指定资源文件的位置(不指定则使用默认的位置)
2、根据dlg_main定义加载主窗口界面
3、创建主窗口的事件处理对象,并注册给主窗口(注册之后主窗口的事件都会自动发送给此事件处理对象的OnDuiMessage处理函数进行处理)
4、显示主窗口,使用非模态方式运行主窗口的消息循环
5、主界面关闭之后进行DuiVision库的释放
注意运行之前要把图片、xml定义都放在对应的位置,默认图片都在skins目录,xml定义文件都在xml目录。
DuiSystem构造函数第三个参数(资源文件名)的说明,资源文件名可以用下面几种格式:
1、不指定(为空),则使用默认的资源文件名xml\resource.xml,表示加载exe路径下的xml\resource.xml文件,根据此文件加载其余的资源;
2、指定xml文件,例如xml\resource.xml,表示加载指定的资源xml文件,根据此xml文件加载其余的资源,如果指定了xml文件路径则使用绝对路径,如果没有指定xml路径,则查找exe路径和exe下面的xml路径看有没有此文件,有的话就加载xml文件;
3、指定后缀是.ui的文件,后缀是.ui的文件表示是zip压缩文件,则首先加载此zip压缩文件到内存中,然后再从zip压缩文件中解压出相对路径是xml\resource.xml的文件进行加载,后续其余文件的加载过程和上面两种情况是相同的,如果zip压缩文件已经加载了,则加载其余文件的时候,会先查找物理路径下有没有文件,有的话就优先加载,物理路径下没有找到文件,则查找内存中的zip压缩文件中有没有文件,有的话就解压到内存并加载,加载内存文件时候会对内存文件进行缓存,下一次再加载相同的文件时候直接用内存缓存,不需要再进行解压缩;
4、指定前缀是res:的文件,表示从程序的资源中首先获取到资源zip压缩文件,后续的流程和.ui方式的zip压缩文件是相同的,这种情况下,参数res:后面跟的是程序中的资源ID,例如res:1116表示从程序资源中获取资源ID是1116的资源进行解压缩。
通过向导创建主程序和插件工程的方法
DuiVision提供了创建工程的VC向导,目前支持VC2008和VC2010,也可以稍微修改之后用于其他的VC版本,向导有两种安装方式,一种是通过向导的安装程序来安装,一种是通过一个javascript脚本来安装,因为向导的安装程序已经不更新了,我们推荐用js脚本方式来安装向导,安装方法如下:
更新github库,找到其中的DuiWizard\SetupWizard.js文件,运行这个javascript脚本就可以进行向导的安装,运行时候会提示是否安装VC2008、VC2010等版本的向导,这种方式安装向导的优点是如果DuiVision版本升级了,只需要更新github库,不需要再次安装向导,生成的工程就自动是最新版本了,因为这种方式生成的工程代码是直接从下载的代码目录下复制的。
向导安装之后,在VC中新建工程,可以看到模板中多了一个DuiVision应用程序模板:
选择此模板就可以创建DuiVision工程,创建工程一共有四个步骤,第一步是设置应用程序标题和版权信息:
第二步是选择创建的工程类型,有两种类型,DuiVision主程序和DuiVision插件:
第三步是设置界面中多个Tab页情况下每个Tab页的标题和事件处理类名字,如果不设置任何Tab页,也会自动创建一个默认Tab页:
第四步是工程的一些选项设置,如果是新建的一个解决方案工程,则默认会将DuiVision库的代码和资源文件拷贝到新建的解决方案目录下,如果是在现有解决方案中新建一个工程,则默认不拷贝,你也可以修改这个选项:
生成的工程中包含DuiVision库、生成的工程代码、bin目录和bin目录下的资源文件,针对创建的每个Tab页,都会在bin目录下的xml目录下生成对应的Tab页xml文件框架,DuiVision应用程序的xml文件在xml\app目录下,DuiVision从插件程序的xml文件在xml\plugin目录下。
向导中包含的DuiVision库可能不是最新的库,可以在工程生成之后,将工程目录下的DuiVision目录和bin目录下的一些基础资源文件替换为最新的文件。