一、前言

MFC做出来的界面有点接受不了的丑,想要做好看还要搞什么第三方界面库,所以找个第三方的duilib开源界面库来尝试一下。

duilib 是国内首个开源 的directui 界面库,它提供了一个所见即所得的开发工具——UIDesigner,它只有主框架窗口,其余的空间全部采用绘制的方式实现,所以对于控件来说没有句柄和窗口类等内容,它通过UIDesigner工具将用户定义的窗口保存在xml文件中,在创建窗口时读取xml文件中的内容,来绘制相应的控件。目前有许多界面采用duilib编写,大家可以去网上搜集相关资料。

二、下载编译

下载地址:https://github.com/duilib/duilib

下载解压得到下面文件,找到图中的duilib.sln打开工程后点击全部生成(我在这里升级到了VS2019)

编译完成后,找到.lib 和.dll文件

三、新建工程

创建新工程,选择空项目


工程目录下新建lib文件夹和include文件夹

其中lib文件夹中放入duilib_d.lib

其中include文件夹放入以下文件,这些文件原本位于解压目录下的Duilib目录中

四、工程配置

保持和生成库一致,debug 32位 多字节

添加include和lib目录

由于Windows窗口界面都是win32工程,而我们创建的是空项目,所以下面两处需要替换为WINDOWS,当然你也可以直接生成一个win32工程,将不需要的代码删除。

五、代码

新建一个FramWnd类
FramWnd.h

// Duilib使用设置部分
#pragma once#define WIN32_LEAN_AND_MEAN
#define _CRT_SECURE_NO_DEPRECATE#include <windows.h>
#include <objbase.h>#include "../include/UIlib.h"using namespace DuiLib;#ifdef _DEBUG
#   ifdef _UNICODE
#       pragma comment(lib, "..\\bin\\DuiLib_ud.lib")
#   else
#       pragma comment(lib, "..\\lib\\DuiLib_d.lib")
#   endif
#else
#   ifdef _UNICODE
#       pragma comment(lib, "..\\bin\\DuiLib_u.lib")
#   else
#       pragma comment(lib, "..\\bin\\DuiLib.lib")
#   endif
#endifclass CFrameWnd : public CWindowWnd, public INotifyUI
{public:CFrameWnd();LPCTSTR GetWindowClassName()const;UINT GetClassStyle() const ;void OnFinalMessage(HWND /*hWnd*/);void Notify(TNotifyUI& msg);LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);public:CPaintManagerUI m_pm;
};

FramWnd.cpp

#include "FrameWnd.h"CFrameWnd::CFrameWnd()
{}LPCTSTR CFrameWnd::GetWindowClassName()const
{ return _T("UIMainFrame");
}UINT CFrameWnd::GetClassStyle() const
{return UI_CLASSSTYLE_FRAME | CS_DBLCLKS;
}void CFrameWnd::OnFinalMessage(HWND /*hWnd*/)
{delete this;
}void CFrameWnd::Notify(TNotifyUI& msg)
{if (msg.sType == _T("click")) {if (msg.pSender->GetName() == _T("closebtn")) {Close();}}
}LRESULT CFrameWnd::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);
}

添加一个main.cpp

#include "FrameWnd.h"int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPSTR /*lpCmdLine*/, int nCmdShow)
{CPaintManagerUI::SetInstance(hInstance);CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath());CFrameWnd* pFrame = new CFrameWnd();if (pFrame == NULL) return 0;pFrame->Create(NULL, _T("测试"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);pFrame->ShowWindow(true);CPaintManagerUI::MessageLoop();return 0;
}

六、运行


下一篇:Duilib的简单使用(二、xml实现界面与业务分离)

Duilib的简单使用(一、duilib demo)相关推荐

  1. 一个简单的Webservice的demo(中)_前端页面调用

    首先新建项目,这里有两种调用方式,为了能方便理解,新建页面WebserviceTest如下图: 先引用写好的服务,这里用上次写好的服务.见上次写的一个简单的Webservice的demo,简单模拟服务 ...

  2. swift for循环_Swift | 实战一个简单的素数计算器demo

    Swift 实战一个简单的素数计算器demo 本期我们来介绍如何用storyboard来实现一个素数计算器demo,storyboard可以明确地知道界面上的组件与代码的关系,而且比起仅用代码写要方便 ...

  3. 示例演示公告通知标题无缝向上滚动,文字段落无缝向上滚动,简单的wangeditor富文本编辑器,简单的音乐播放demo...

    用于工作需求接触了公告通知标题内容的无缝向上滚动功能以及使用简单的wang富文本编辑器配置简单的音乐插件demo. 在写之前要先引入相应的js,jquery: 首先是通知标题的无缝向上滚动,这个网上很 ...

  4. 创建一个简单的springboot项目demo

    springboot的核心功能: 1:起步依赖 2:核心注入; 创建一个简单的springboot项目demo步骤: 1:创建一个maven项目 2:pom.xml添加起步依赖 <parent& ...

  5. springboot 整合minio client 简单使用 视频流展示demo

    springboot 整合minio client 简单使用 视频流展示demo 不好意思 本人没有强迫症 代码随便造 知识来源于百度,感谢百度合作伙伴以及各位网友demo的帮助 源码:https:/ ...

  6. 简单的vue小demo——小黑记事本

    简单的vue小demo--小黑记事本 整体效果:完整代码在这里 一个简单的记事本,可实现简单的添加,删除,统计,清空,隐藏. 1.新增 1.1生成列表结果(v-for数组) 1.2获取用户输入(v-m ...

  7. UIAutomator2 一个简单的练手demo,自动刷东方头条

    UIAutomator2 一个简单的练手demo,自动刷东方头条 兼容不是很好,还有情况没有写 import uiautomator2 as u2 import timen = 0#连接设备 # if ...

  8. Qt + Opencv 实现的一个简单文字识别的demo

    Qt + Opencv 实现的一个简单文字识别的demo 很久没用Qt了,这两天结合Opencv整了一个简单文字识别的demo,太久没用了,很多东西都忘记了,中间碰到了几个不大不小的坑,最后都解决了, ...

  9. Gecco的简单使用(附demo)该文章仅用于学习,谢谢

    Gecco的简单使用(附demo)该文章仅用于学习,谢谢 Gecco的Maven的xml引入 Gecco的简单代码 1.Frist 第一个,用于锁定需要爬取的代码块,如下面代码的@HtmlField( ...

最新文章

  1. Java开发买低压本还是标压本_标压和低压,笔记本怎么选才最香?
  2. SpringJDBC的简单应用
  3. vscode 使用ssh密钥登录远程Linux -- vscode remote linux ssh key
  4. [导入]★ 你知道JavaScript里数组的最大长度允许多少吗 ★
  5. Linux疑难杂症解决方案100篇(四)-SHELL编程预留题目解析
  6. 网页附加题写出下图的html,附加题(写HTML文件):根据给定的博客名单,自动生成HTML网页...
  7. calendar类计算时间距离_日期时间--JAVA成长之路
  8. mongodb如何写入图片_CTO之瞳-数据库-MongoDB
  9. 三轴加速度传感器和六轴惯性传感器_一文读懂汽车MEMS惯性传感器的七大应用(上)...
  10. 服务器iis配置 所需文件,iis服务器配置手册.pdf
  11. 出现警告defaultlib library conflicts with use of other libs; use /NODEFAULTLIB:library .
  12. Spring Boot Security 整合 OAuth2 设计安全API接口服务
  13. cad2007错误1308 html,win7系统安装CAD2008提示“错误1308,源文件未找到“的解决方法...
  14. 开源FTP客户端FileZilla Pro 3.53完整版
  15. 00002-微信小游戏--触摸事件
  16. 通讯录管理系统 C++
  17. android直播音频开发准备
  18. POST http://域名:8080/项目/base/api/login/user/login net::ERR_CONNECTION_RESET 错误
  19. 可清空所选时间的jquery.datetimepicker时间插件
  20. 【泛微ecology】ecology的补丁包升级

热门文章

  1. 同济大学和东南大学计算机哪个好,2019高考:同为985/211的东南大学和同济大学哪个更好?...
  2. 列表的索引、切片、运算
  3. 深度学习——深度聚类 小调研
  4. 我的世界服务器自动刷矿机,我的世界自动刷矿机怎么制作 | 我的世界 | MC世界侠...
  5. Linux常用命令——远程传输文件(scp/rsync)
  6. 计算机安全选项卡,没有安全选项卡的win10系统文件夹的解决方案
  7. qt运行时插件目录设置
  8. 用户数据报协议UDP和传输控制协议TCP
  9. 优化问题中:如何得到对偶目标函数
  10. 仿GPS的4星定位程序