赞
踩
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; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。