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

我们要独立出来自己创建一个项目,在我们自己的项目上加皮肤这才是初衷。我的新建项目名为: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——写一个简单的程序

时间: 2024-10-24 13:19:03

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

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

最近在玩树莓派,前面写过一篇在树莓派上使用1602液晶显示屏,那么能够显示后最重要的就是显示什么的问题了.最容易想到的就是显示时间啊,CPU利用率啊,IP地址之类的.那么我觉得呢,如果能够显示当前时间.温度也是甚好的,作为一个桌面小时钟还是很精致的. 1. 目前有哪些工具 目前比较好用的应该是 weather-util, 之前我获取天气信息一般都是通过它. 使用起来也很简单: (1) Debian/Ubuntu 用户使用 sudo apt-get install weather-util 安装

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

不看笔记,长时间不用自己都忘了,还是得经常看看笔记啊. 一个简单的shell程序 shell结构 1.#!指定执行脚本的shell 2.#注释行 3.命令和控制结构 创建shell程序的步骤 第一步:创建一个包含命令和控制结构的文件 第二步:修改这个文件的权限使它可以执行. 使用chmod u+x 第三步:执行shell sh /test/example.sh Shell变量 变量:是shell传递数据的一种方法,用来代表每个取值的符号名 shell有两类变量:临时变量和永久变量 临时变量是sh

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

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

《python灰帽子》学习笔记:写一个windos 调试器(一)

一.开发内容介绍 为了对一个进程进行调试,你首先必须用一些方法把调试器和进程连接起来.所以, 我们的调试器要不然就是装载一个可执行程序然后运行它, 要不然就是动态的附加到一个运行的进程.Windows 的调试接口(Windows debugging API)提供了一个非常简单的方法完成这两点. 运行一个程序和附加到一个程序有细微的差别. 打开一个程序的优点在于他能在程序运行任何代码之前完全的控制程序. 这在分析病毒或者恶意代码的时候非常有用. 附加到一个进程,仅仅是强行的进入一个已经运行了的进程

单片机 学习笔记(二)——简单小程序

今天收获了单片机的几个简单小程序:     延时程序: void Delay(unsigned int xx) //输入 xx :ms { while(xx--) { Delay1ms(); } } void Delay1ms() //@11.0592MHz 1ms { unsigned char i, j; _nop_(); _nop_(); _nop_(); i = 11; j = 190; do { while (--j); } while (--i); } 流水灯程序: #include

JSP/Servlet Web 学习笔记 DayFour —— 实现一个简单的JSP/Servlet交互

小实例说明: a)实现一个由JSP负责前台显示,Servlet负责后台处理的交互小实例 b)JSP页面由表单获取一个开始数字,一个结束数字,交给Servlet打印响应的乘法表. 未解决的问题: a)跳转貌似不能识别目录中的HTML文件,所以我把源码复制到JSP中,结果能找到. b)Servlet获取到JSP传过来的数据后,如果想在JSP页面out.print相关的JS代码貌似不能实现 目前的效果是:在当前的Servlet页面弹出了JS alert()弹窗 再重定向回之前的JSP页面. 源码: <

ArcGIS API for JavaScript 学习笔记 (一) --第一个WebGIS应用程序

说明:本地部署后续我会尝试. 简单介绍: 开发环境是Visual Studio 2012,因为它为所有的.aspx文件..htm文件以及外部的.js文件提供了IntelliSense(智能提示),相当于其他软件的代码自动补全功能,非常方便.接下来是我的第一个Javascript API 应用程序.ESRI在其arcgis online中提供了在线的ArcGIS API for JavaScript,在web应用中直接引用即可,无需下载安装:当然也可以下载API,然后部署到自己的web服务器,在这

用JS写一个简单的程序,算出100中7的倍数的最大值

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> </body> <script type="text/javascript"> //方法一: var max=1; for(var i=1;i<=100;i++){ if(i%

用JS 写一个简单的程序,切换七彩盒子背景

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> .stage{ width: 210px; height: 250px; margin: 50px auto; } #box{ margin-top: 20px; width: 210px; heig