一、前言
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
#endif
class 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;
}