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, ); // 创建DLG窗口
wnd->CenterWindow(); // 窗口居中
wnd->ShowWindow(); // 显示
CPaintManagerUI::MessageLoop(); // 消息循环 delete wnd; // 删除对象 return ;
}
3.我们再去创建皮肤XML。
首先,你得编译 DuiDesigner 这个工程,使用 DuiDesigner.sln 解决方案进行编译。在 bin中可以找到生成的 DuiDesigner.exe。打开,然后新建一个名为 HelloDuilib 的文件,该名称即为 CHelloDuilibWnd::GetSkinFile()返回的名称。
接下来,添加一个 VerticalLayout(点击下图中的,再点击中间窗口位置,不是使用拖动的方式),然后选中这个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.尝试添加按钮,并设置图片。
本节到此结束。
Duilib教程-HelloDuilib及DuiDesigner的简单使用的更多相关文章
- 【教程】新手如何制作简单MAD和AMV,学不会那都是时辰
[教程]新手如何制作简单MAD和AMV,学不会那都是时 http://tieba.baidu.com/p/2303522172 [菜鸟教你做MAD]Vegas制作MAD入门教程 http://tieb ...
- Directx11教程(52) 实例(instancing)的简单应用
原文:Directx11教程(52) 实例(instancing)的简单应用 有些时候,我们需要在场景中渲染大量的重复的物体,比如体育场中的观众,森林里面的树木等等,这些物体具有相似的形状,比如很多树 ...
- ❤️这应该是Postman最详细的中文使用教程了❤️(新手使用,简单明了)
️这应该是Postman最详细的中文使用教程了️(新手使用,简单明了) 在前后端分离开发时,后端工作人员完成系统接口开发后,需要与前端人员对接,测试调试接口,验证接口的正确性可用性.而这要求前端开发进 ...
- Duilib教程-简单介绍
在读这篇博客的时候,可能您已经对duilib有一定的了解.所以,我并不打算对duilib进行过多的介绍.它的内核首先由外国人编写,后来由国人一个小组接过来继续编写,于是就有了现在的Duilib. 1. ...
- Duilib教程-控件练习
一.控件消息的响应. 在HelloDuilib例子中,程序不能退出,在这里,我将添加一个关闭按钮,当点击它时,调用PostQuitMessage进行退出. 首先在界面的右上角添加一个关闭按钮,并取名为 ...
- yii2实战教程之新手入门指南-简单博客管理系统
作者:白狼 出处:http://www.manks.top/document/easy_blog_manage_system.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文 ...
- DuiLib学习笔记2——写一个简单的程序
我们要独立出来自己创建一个项目,在我们自己的项目上加皮肤这才是初衷.我的新建项目名为:duilibTest 在duilib根目录下面有个 Duilib入门文档.doc 我们就按这个教程开始入门 首先新 ...
- ExtJS入门教程01,Window如此简单,你怎能不会?
这是一系列ExtJS教程,今天的是第一篇,主要介绍ExtJS中Window的基本用法.希望大家能够支持! 来吧,创建一个漂亮的弹出窗 var win = Ext.create("Ext.Wi ...
- JXLS 2.4.0系列教程(一)——最简单的模板导出
Java中实现excel根据模板导出数据的方法有很多,一般简单的可以通过操作POI进行.还可以使用一些工具很轻松的实现模板导出.这些工具现在还在维护,而且做得比较好的国内的有easyPOI,国外的就是 ...
随机推荐
- python pip 升级
首先安装python,在百度中搜索python,进入python官网.点击download,选择电脑对应的系统进行下载,此处以windows系统的python 3.5.1进行介绍,点击即可下载. ...
- rabbitmq系列(一)-基本概念理解
1.简介 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue protocol)的开源实现.AMQP高级消息队列,说白了就是一个开源的消息中间件.它能解决 ...
- 【Unity笔记】UGUI中Canvas屏幕适配
1.通过RectTransform中的Anchors和Pivot来进行控件和窗体的布局适配. Anchors控制当前Panel相对于父窗体的布局位置,可以设置为居中或者左上角,当父窗体拉伸的时候当前P ...
- 【Unity】动态调用其他脚本的函数
本文转载自:http://blog.csdn.net/smilingeyes/article/details/17767269 第一种,被调用脚本函数为static类型,调用时直接用 脚本名.函数名( ...
- 【WPF】使用Popup控件做浮窗/提示框
需求:当鼠标移入某个区域时,弹出一个浮窗,以便用户进行下一步操作. 效果如下图: 当鼠标移入左上角的[多选显示]框内,出现下面的浮窗(悬浮在原UI之上).当在浮窗外点击鼠标左键时,隐藏该浮窗. 由于该 ...
- C语言 · 三个整数的排序
算法提高 三个整数的排序 时间限制:1.0s 内存限制:256.0MB 问题描述 输入三个数,比较其大小,并从大到小输出. 输入格式 一行三个整数. 输出格式 一行三个整数,从大到小 ...
- Java 并发编程学习笔记 理解CLH队列锁算法
CLH算法实现 CLH队列中的结点QNode中含有一个locked字段,该字段若为true表示该线程需要获取锁,且不释放锁,为false表示线程释放了锁.结点之间是通过隐形的链表相连,之所以叫隐形的链 ...
- java中静态方法的使用
JAVA中使用静态方法 编程时我们心里一定要清楚静态方法和类的非静态方法方法的区别: 最根本区别从编译角度来说吧: 1) 静态(static)方法是编译时直接加载加载到内存中(离cpu最近的一块内存区 ...
- [JavaScript]JS调用PHP和PHP调用JS的方法举例
http://blog.csdn.net/pleasecallmewhy/article/details/8592571 body { background: #C7EDCC !important; ...
- golang 数组以及slice切片
老虞学GoLang笔记-数组和切片 数组 Arrays 数组是内置(build-in)类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值.在初始化后长度是固定的,无法修改其 ...