Duilib教程-HelloDuilib及DuiDesigner的简单使用

一、HelloDuilib

1. 首先理解DUILIB显示的一个基本流程,如下图:

在Duilib中,WindowImplBase 这个类代表了图中 “CWndClass”。

所以我们需要做的是:

1)生成一个XML。

2)生成一个WindowImplBase对象。

3)加载XML。

4)显示窗口。

但是编写的时候,WindowImplBase已经帮我们做了许多工作,我们只需要指定XML路径,它就能够帮助我们自动加载,非常方便。

但是一般我不喜欢先编写XML,我喜欢先写MAIN函数,再编写占位函数,再一个个地实现占位函数。所以我们进入下一个步骤。

2. 建立工程。

1)如果是第一次使用DUILIB的话,你要把DUILIB加入到VS2008的环境变量中,我的Duilib保存在I:\GitHub\Duilib,设置的路径为:

包含路径:I:\GitHub\Duilib

源路径:I:\GitHub\Duilib

库路径:I:\GitHub\lib

如下图:

最后还要设置一下系统的环境变量为:I:\GitHub\Duilib\Bin,右键“我的电脑”->“属性”->“高级系统设置”,如果是XP的话,可能稍有不同,弹出的操作如下图:

2)新建一个WIN32工程,如下图:

然后一直“下一步”。

在HelloDuilib.cpp中,只保留下列代码,其余全删除。

#include "stdafx.h"
#include "HelloDuilib.h"

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)

{
}

在stdafx.h中加入以下代码:

#include <ObjBase.h>
#include <Duilib/UIlib.h>

using namespace DuiLib;

#ifdef _DEBUG
#pragma comment (lib, "duilib_ud.lib")
#else
#pragma comment (lib, "duilib_u.lib")
#endif

然后编译一下,如果编译没有问题,就进入下一步,当然你得先编译DUILIB源码,编译unicode_debug和unicode_release两个版本。当然,全部版本都编译更佳。

3)新建一个从 WindowImplBase继承的类 CHelloDuilibWnd,然后将它的头文件的代码修改如下:

class CHelloDuilibWnd :
public WindowImplBase
{
public:
CHelloDuilibWnd(void);
~CHelloDuilibWnd(void);

protected:
virtual CDuiString GetSkinFolder() { return _T ("skin"); };
virtual CDuiString GetSkinFile()  { return _T ("HelloDuilib.xml"); };
virtual LPCTSTR GetWindowClassName(void) const { return _T ("HelloDuilib_Wnd"); };
};

说明:

GetSkinFolder () 需要返回 皮肤XML 所在的文件夹

GetSkinFile () 需要返回 皮肤 XML 的文件名(也可以包含路径)

GetWindowClassName () 需要返回这个窗口的类名,这个类名用于 RegisterClass.

4)返回去编写 WinMain 函数,如下:

#include "stdafx.h"
#include "HelloDuilibWnd.h"
#include "HelloDuilib.h"

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)

{
CPaintManagerUI::SetInstance(hInstance);// 加载XML的时候,需要使用该句柄去定位EXE的路径,才能加载XML的路径

CHelloDuilibWnd* wnd = new CHelloDuilibWnd; // 生成对象
wnd->Create(NULL, NULL, UI_WNDSTYLE_DIALOG, 0); // 创建DLG窗口
wnd->CenterWindow(); // 窗口居中
wnd->ShowWindow(); // 显示
CPaintManagerUI::MessageLoop(); // 消息循环

delete wnd; // 删除对象

return 0;
}

3.我们再去创建皮肤XML。

首先,你得编译 DuiDesigner 这个工程,使用 DuiDesigner.sln 解决方案进行编译。在 bin中可以找到生成的 DuiDesigner.exe。打开,然后新建一个名为 HelloDuilib 的文件,该名称即为 CHelloDuilibWnd::GetSkinFile()返回的名称。

接下来,添加一个 VerticalLayout(点击下图中的1,再点击中间窗口位置,不是使用拖动的方式),然后选中这个VerticalLayout,再在最右边的属性栏中设置它的背景颜色。再在上面添加一个 Label 控件,将其Text修改为 “HelloDuilib”。

当然,你还可以添加按钮、EDIT等控件,还可以试验 BkColor2, BorderSize, BorderColor等属性。然后按 “CTRL+T”进行测试,我的测试结果如下:

按ESC即可退出测试,与VS的对话框测试一样的快捷键。

4.到 HelloDuilib 工程的生成目录下新一个文件夹“skin”,将生成的XML放到这个skin文件夹中,点击运行。

即可看到结果。

当然,你会发现你退不了程序,原因是使用了

CPaintManagerUI::MessageLoop(); // 消息循环

跳出该循环,必须使用 PostQuitMessage (0); 函数。

当然你可以使用:

Wnd->ShowModal () 用模态对话框代替非模态对话框显示

wnd->ShowWindow(); // 显示

CPaintManagerUI::MessageLoop(); // 消息循环

二、DuiDesigner的使用。

如上图,主要分为六大模块。

1为皮肤设计窗口,在上面添加控件规划你的皮肤。

2为WND窗口,请单击1与2,看属性栏变化。

3为控件添加窗口

4为属性设置窗口

5为窗口测试及控件对齐窗口

6为已添加控件层次查看窗口,当然它有三个TAB,只有控件层次才最有用。

在编写XML的时候,一定注意:

DUILIB XML一定要有一个底层 Layout!!!

不能直接在 WND上添加控件!

说明,这个工具可能会有诸多BUG,属性更改失效、时不时崩溃等,不过我遇到崩溃的情况比较少,新手可能会遇到较多,但不要抱怨,毕竟有这样一个工具已经是十分难能可贵了。

可能你已经看了属性栏中有诸多属性,你可以试着添加图片,修改颜色,修改边框等查看一下,然后你也可以看一下WND的属性,CAPION到底是什么,MINMAXINFO又是什么。

这一节最后,我可能会要求你做一些额外的工作:

1.请尝试除 UI_WNDSTYLE_DIALOG 外的其它窗口创建方式,查看有什么不一样。

2.XML是怎样加载的?

3.尝试添加按钮,并设置图片。

本节到此结束。

附带 HelloDuilib.zip

时间: 2024-12-13 13:45:44

Duilib教程-HelloDuilib及DuiDesigner的简单使用的相关文章

DuiLib学习笔记2——写一个简单的程序

我们要独立出来自己创建一个项目,在我们自己的项目上加皮肤这才是初衷.我的新建项目名为:duilibTest 在duilib根目录下面有个 Duilib入门文档.doc 我们就按这个教程开始入门 首先新建一个win32项目 去DuiLib根目录,把目录下DuiLib文件夹拷贝到新建项目的根目录.再把这个项目添加进我们解决方案中. 从教程里面把以下代码粘贴到我们项目的stdafx.h中 // Duilib使用设置部分 #pragma once #define WIN32_LEAN_AND_MEAN

【转】Struts1.x系列教程(2):简单的数据验证

转载地址:http://www.blogjava.net/nokiaguy/archive/2009/01/archive/2009/01/13/251197.html 简单验证从本质上说就是在服务端来验证客户端提交的form中的数据.这种验证只是对form中的数据规则进行检查,如必须输入用户ID,价格不能小于0或是对email格式的验证.在这个验证过程中,并不需要访问数据库.因此,简单验证需要在用户提交form后,并且在服务器处理form中的数据之前进行. 在进行完简单验证后,如果form中的

[简明python教程]学习笔记之编写简单备份脚本

[[email protected] 0503]# cat backup_ver3.py #!/usr/bin/python #filename:backup_ver3.py import os import time #source source=['/root/a.sh','/root/b.sh','/root/c.sh'] #source='/root/c.sh' #backup dir target_dir='/tmp/' today=target_dir+time.strftime('

Android基础入门教程——2.4.2 ListView简单实用

Android基础入门教程--2.4.2 ListView简单实用 标签(空格分隔): Android基础入门教程 本节引言: 一口气把Android入门网络编程的章节写完了,本节我们来继续学习没有讲完的UI控件部分, 回顾上一节,我们介绍了Adapter适配器的概念,然后学习了三个最简单的适配器的使用: ArrayAdapter,SimpleAdapter和SimpleCursorAdapter,而本节给大家讲解的是第一个 需搭配Adapter使用的UI控件:ListView,不过在版本中被R

duilib DirectUI库里面的一个简单的例子RichListDemo

http://blog.csdn.net/zengraoli/article/details/9993153 2013-08-16 00:08 3289人阅读 评论(2) 收藏 举报 目录(?)[+] 1.首先来看这里的CRichListWnd 已经不再是从CWindowWnd继承了 classCRichListWnd:publicWindowImplBase 从WindowImplBase中,可以看到有三个抽象函数: virtualCDuiStringGetSkinFolder()=0; vi

Duilib教程-控件练习

一.控件消息的响应. 在HelloDuilib例子中,程序不能退出,在这里,我将添加一个关闭按钮,当点击它时,调用PostQuitMessage进行退出. 首先在界面的右上角添加一个关闭按钮,并取名为“btnClose”. 然后在 CHelloDuilibWnd 中重载 WindowImplBase::Notify (); 代码如下: void CHelloDuilibWnd::Notify( TNotifyUI& msg ) { if (msg.sType == DUI_MSGTYPE_CLI

Duilib教程-自动布局2

在上一节中,我简单介绍了控件随父LAYOUT自由移动的设置.在这一节,我将介绍一种常见的情况:嵌入窗口. 在项目中,我们很少会100%的编写一个软件,特别是界面相关的,我们会使用以前已经编写好的窗口,或网上的开源模块.举一个简单的例子来说,如果你要编写一个视频播放器,关于视频的播放窗口,就用不着用DUI来实现,我们完全可以使用网上的开源库,嵌入一个播放的WND即可(当然有的库也支持回调的方式,用户可以在自己的窗口中将回调出来的图片进行自由绘制). 我们需要在窗口大小改变时,即时地改变播放窗口的大

android开发教程:android调用activity简单方法

在没看麦子学院的教学视频之前,觉得在一个apk中调用另外一个apk中的activity是件非常麻烦的事情,有时候很害怕遇见这类问题,但是看了android开发教程视频之后,觉得这本来是一件很简单的事情,所以写篇小文章供参考. 系统提供了很多可以直接调用的Activity,通过指定的Intent就可以调用,比如打开搜索的: Java代码 1. Intent intent = new Intent(Intent.ACTION_WEB_SEARCH); 2. intent.putExtra(Searc

DuiVision开发教程(2)-如何写一个简单的界面程序

基于DuiVision界面库开发的界面程序主要包括如下几部分内容: 1.资源定义,包括图片资源.各个窗口界面的xml定义文件 2.事件处理类代码,用于处理界面响应消息 3.其他业务逻辑代码 下面举例说明如何写一个简单的界面程序. 第一步:使用VC向导创建一个有两个tab页面的DuiVision工程 向导生成的解决方案文件如下: 默认有两个工程,分别是DuiVision库和应用程序工程.自动生成的代码目录中bin目录下的内容那个如下,bkimg目录存放窗口背景图片,skins目录存放图片资源,xm