我们要独立出来自己创建一个项目,在我们自己的项目上加皮肤这才是初衷。我的新建项目名为:duilibTest

在duilib根目录下面有个 Duilib入门文档.doc 我们就按这个教程开始入门

首先新建一个win32项目

去DuiLib根目录,把目录下DuiLib文件夹拷贝到新建项目的根目录。再把这个项目添加进我们解决方案中。

从教程里面把以下代码粘贴到我们项目的stdafx.h中

// Duilib使用设置部分
#pragma once #define WIN32_LEAN_AND_MEAN
#define _CRT_SECURE_NO_DEPRECATE #include <windows.h>
#include <objbase.h> #include "..\DuiLib\UIlib.h" using namespace DuiLib; #ifdef _DEBUG
# ifdef _UNICODE
# pragma comment(lib, "..\\bin\\DuiLib_ud.lib")
# else
# pragma comment(lib, "..\\bin\\DuiLib_d.lib")
# endif
#else
# ifdef _UNICODE
# pragma comment(lib, "..\\bin\\DuiLib_u.lib")
# else
# pragma comment(lib, "..\\bin\\DuiLib.lib")
# endif
#endif

把duilibTest.cpp中,除了头文件引用的代码都删除,再把以下代码粘贴到duilibTest.cpp中

// 窗口实例及消息响应部分
class CFrameWindowWnd : public CWindowWnd, public INotifyUI
{
public:
CFrameWindowWnd() { };
LPCTSTR GetWindowClassName() const { return _T("UIMainFrame"); };
UINT GetClassStyle() const { return UI_CLASSSTYLE_FRAME | CS_DBLCLKS; };
void OnFinalMessage(HWND /*hWnd*/) { delete this; }; void Notify(TNotifyUI& msg)
{
if( msg.sType == _T("click") ) {
if( msg.pSender->GetName() == _T("closebtn") ) {
Close();
}
}
} LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if( uMsg == WM_CREATE ) {
m_pm.Init(m_hWnd);
CControlUI *pButton = new CButtonUI;
pButton->SetName(_T("closebtn"));
pButton->SetBkColor(0xFFFF0000);
m_pm.AttachDialog(pButton);
m_pm.AddNotifier(this);
return 0;
}
else if( uMsg == WM_DESTROY ) {
::PostQuitMessage(0);
}
LRESULT lRes = 0;
if( m_pm.MessageHandler(uMsg, wParam, lParam, lRes) ) return lRes;
return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
} public:
CPaintManagerUI m_pm;
}; // 程序入口及Duilib初始化部分
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPSTR /*lpCmdLine*/, int nCmdShow)
{
CPaintManagerUI::SetInstance(hInstance);
CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath()); CFrameWindowWnd* pFrame = new CFrameWindowWnd();
if( pFrame == NULL ) return 0;
pFrame->Create(NULL, _T("测试"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
pFrame->ShowWindow(true);
CPaintManagerUI::MessageLoop(); return 0;
}

此时编译可能会报错:LINK : fatal error LNK1104: 无法打开文件“..\bin\DuiLib_ud.lib”

一方面是没有拷贝lib文件进来,另外一方面,是编译duilib时应该采用UnicodeDebug模式

重新编译duilib后,在lib文件夹里找到DuiLib_ud.lib拷贝到bin文件夹里。把bin文件夹中的DuiLib_ud.dll拷贝到debug文件夹里。

再次编译duilibTest就能通过编译了。运行结果如下:

到了这一步说明你的duilib已经能正常使用了。接下来继续跟着文档走,我们来读取xml配置

首先改HandleMessage中的代码,把下面注释掉的代码改为新的

//CControlUI *pButton = new CButtonUI;
//pButton->SetName(_T("closebtn"));
//pButton->SetBkColor(0xFFFF0000);
//m_pm.AttachDialog(pButton);
CDialogBuilder builder;
CControlUI* pRoot = builder.Create(_T("test1.xml"), (UINT)0, NULL, &m_pm);
ASSERT(pRoot && "Failed to parse XML");
m_pm.AttachDialog(pRoot);

创建一个test1.xml,使用vs直接创建一个xml,确保xml文件编码是utf-8格式

在xml中写入如下代码

<?xml version="1.0" encoding="utf-8"?>
<Window mininfo="200,360" size=" 480,320 ">
<Font name="幼圆" size="16" default="true" />
<VerticalLayout bkcolor="#FFFF00FF">
<Button name="closebutton" height="20" text="测试按钮" maxwidth="120" />
<RichEdit name="testrichedit" bordercolor="#FF0000" bordersize="0" borderround="18,18" inset="4,2,4,2" bkcolor="#A0F2F5FA" bkcolor2="#A0FF0000" bkcolor3="#A0F2F5FA" font="1" multiline="true" vscrollbar="true" autovscroll="true" enabled="true" rich="true" readonly="false" text="测试richedit">
</RichEdit>
<Edit name="testedit" text="测试编辑框" />
</VerticalLayout>
</Window>

  

再把这xml个文件拷贝到debug下,调试运行程序,就出现如下效果了

ok,至此UI部分算是大概知道是怎么写的了,但是我们还差一个很重要的入门东西,就是事件响应。其实很喜欢这个库的作者们写的入门文档,正和我心意。

Duilib中的事件响应有两种方式:

1.在事件处理类(一般使用窗口类)中实现INotifyUI接口,然后在Notify函数中处理事件

Notify函数中处理就是我们前面看到的,通过if( msg.sType == _T("click") )判断是否为click事件,再通过msg.pSender->GetName() == _T("closebutton")来判断name,确定是哪个按钮触发的事件

2.使用代理机制处理事件

要复杂的多,占时没看的很明白,就不误人子弟了

DuiLib学习笔记2——写一个简单的程序的更多相关文章

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

    我们要独立出来自己创建一个项目,在我们自己的项目上加皮肤这才是初衷.我的新建项目名为:duilibTest 在duilib根目录下面有个 Duilib入门文档.doc 我们就按这个教程开始入门 首先新 ...

  2. Linux系统学习笔记之 1 一个简单的shell程序

    不看笔记,长时间不用自己都忘了,还是得经常看看笔记啊. 一个简单的shell程序 shell结构 1.#!指定执行脚本的shell 2.#注释行 3.命令和控制结构 创建shell程序的步骤 第一步: ...

  3. laravel学习:php写一个简单的ioc服务管理容器

    php写一个简单的ioc服务管理容器 原创: 陈晨 CoderStory 2018-01-14 最近学习laravel框架,了解到laravel核心是一个大容器,这个容器负责几乎所有服务组件的实例化以 ...

  4. 【opencv学习笔记五】一个简单程序:图像读取与显示

    今天我们来学习一个最简单的程序,即从文件读取图像并且创建窗口显示该图像. 目录 [imread]图像读取 [namedWindow]创建window窗口 [imshow]图像显示 [imwrite]图 ...

  5. python 学习笔记 12 -- 写一个脚本获取城市天气信息

    近期在玩树莓派,前面写过一篇在树莓派上使用1602液晶显示屏,那么可以显示后最重要的就是显示什么的问题了. 最easy想到的就是显示时间啊,CPU利用率啊.IP地址之类的.那么我认为呢,假设可以显示当 ...

  6. UNP学习笔记2——从一个简单的ECHO程序分析TCP客户/服务器之间的通信

    1 概述 编写一个简单的ECHO(回复)程序来分析TCP客户和服务器之间的通信流程,要求如下: 客户从标准输入读入一行文本,并发送给服务器 服务器从网络输入读取这个文本,并回复给客户 客户从网络输入读 ...

  7. Django 学习笔记之六 建立一个简单的博客应用程序

    最近在学习django时建立了一个简单的博客应用程序,现在把简单的步骤说一下.本人的用的版本是python 2.7.3和django 1.10.3,Windows10系统 1.首先通过命令建立项目和a ...

  8. Ruby学习笔记2 : 一个简单的Ruby网站,搭建ruby环境

    Ruby on Rails website 的基础是 请求-返回 循环. 首先是浏览器请求服务器, 第二步,Second, in our Rails application, the route ta ...

  9. [原创]java WEB学习笔记12:一个简单的serlet连接数据库实验

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

随机推荐

  1. BZOJ4500: 矩阵

    Description 有一个n*m的矩阵,初始每个格子的权值都为0,可以对矩阵执行两种操作: 1. 选择一行, 该行每个格子的权值加1或减1. 2. 选择一列, 该列每个格子的权值加1或减1. 现在 ...

  2. 最全的iOS面试题及答案-转载

    1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答: Object-c的类不可以多重继承:可以实现多个接口,通过实现 ...

  3. windows一些快捷键

    1.Win + __ 1)Win + L 锁屏 2)Win + E 资源管理器(就是打开硬盘) 3)Win + D 回到桌面 4)Win + Tab 3D方式切换程序窗口 5)Win + R 运行命令 ...

  4. Html Mailto标签详细使用方法

    Html中mailto标签是一个非常实用的贴近用户体验的标签,大多情况下人们都在这样使用 <a href="mailto:example@phplamp.com">ex ...

  5. 获取IP(windows和linux)

    #ifdef _WIN32 #include <winsock2.h> #include <Ws2tcpip.h> #pragma comment(lib,"ws2_ ...

  6. IE hack中主要的几个

    _: IE6; #*+.: IE6 IE7; black\0: IE8; black\9: IE所有; @media screen\9 { … }: IE6 IE7; @media \0screen\ ...

  7. backbone学习笔记一

    backbone是一个MVC单页面框架,针对传统的WEB开发B/S架构的缺点,即通过表现层的浏览器,功能层的WEB服务器,数据层的数据库服务器构架,而操作渲染过程太过复杂.

  8. SpringBoot配置Email发送功能

    相信使用过Spring的众多开发者都知道Spring提供了非常好用的 JavaMailSender接口实现邮件发送.在Spring Boot的Starter模块中也为此提供了自动化配置.下面通过实例看 ...

  9. NYOJ背包问题

    #include <stdio.h> struct group{ int value; int weight; }; void Sort(group bag[],int num) { in ...

  10. Rails problem

    总是wa~ #include <stdio.h> int main() { ]; ], b[]; while(scanf("%d %s %s", &n, a, ...