12DUILib经典教程(实例)
副标题[/!--empirenews.page--]
Duilib经典实例教程;1基本框架;一个简单的Duilib程序一般是下面这个样子的:;//Duilib使用设置部分;#pragmaonce;#defineWIN32_LEAN_AND_ME;#define_CRT_SECURE_NO_DE;#include<windows.h>;#include<objbase.h>;#include& Duilib经典实例教程 1 基本框架 一个简单的Duilib程序一般是下面这个样子的: // Duilib使用设置部分 #pragma once #define WIN32_LEAN_AND_MEAN #define _CRT_SECURE_NO_DEPRECATE #include <windows.h> #include <objbase.h> #include "..DuiLibUIlib.h" using namespace DuiLib; #ifdef _DEBUG # ifdef _UNICODE # pragma comment(lib,"..binDuiLib_ud.lib") # else # pragma comment(lib,"..binDuiLib_d.lib") # endif #else # ifdef _UNICODE # pragma comment(lib,"..binDuiLib_u.lib") # else # pragma comment(lib,"..binDuiLib.lib") # endif #endif // 窗口实例及消息响应部分 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,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; } 可以看出,这个程序分三个部分: ? ? ? Duilib使用设置部分,这个部分都是一些使用Duilib所需要的头文件和自动链接到相应的Duilib库,一般来说基本上不用改动。 窗口实例及消息响应部分,基本的窗口实现类和简单的消息响应,需要重点关注的是void Notify(TNotifyUI& msg)中的事件处理,这是Duilib程序最重要的部分。 程序入口及Duilib初始化部分,Duilib初始化和窗口创建。 编译这个程序,出现如下效果: 点击红色区域的任意位置,窗口会立即关闭。这样我们就完成了最简单的一个Duilib程序编写,虽然这个例子还不能展现Duilib的强大,但也算是麻雀虽小,肝胆俱全了。 因为很多美观的界面都不使用系统的标题栏和边框这些非客户区绘制,我们也把这掉,修改CFrameWindowWnd:: HandleMessage为: LRESULT HandleMessage(UINT uMsg,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); } else if( uMsg == WM_NCACTIVATE ) { if( !::IsIconic(m_hWnd) ) { return (wParam == 0) ? TRUE : FALSE; } } else if( uMsg == WM_NCCALCSIZE ) { return 0; } else if( uMsg == WM_NCPAINT ) { return 0; } LRESULT lRes = 0; if( m_pm.MessageHandler(uMsg,lParam); } 编译运行,我们得到如下效果: 2 编写界面xml 为了使用xml进行界面布局,需要把前面的Duilib程序框架中的HandleMessage稍微改动一下: LRESULT HandleMessage(UINT uMsg,LPARAM lParam) { if( uMsg == WM_CREATE ) { m_pm.Init(m_hWnd); CDialogBuilder builder; CControlUI* pRoot = builder.Create(_T("test1.xml"),(UINT)0,NULL,&m_pm); ASSERT(pRoot && "Failed to parse XML"); m_pm.AttachDialog(pRoot); m_pm.AddNotifier(this); return 0; } else if( uMsg == WM_DESTROY ) { ::PostQuitMessage(0); } else if( uMsg == WM_NCACTIVATE ) { if( !::IsIconic(m_hWnd) ) { return (wParam == 0) ? TRUE : FALSE; } } else if( uMsg == WM_NCCALCSIZE ) { return 0; } else if( uMsg == WM_NCPAINT ) { return 0; } LRESULT lRes = 0; if( m_pm.MessageHandler(uMsg,lParam); } 灰色部分表示改动的部分。 然后我们来编写一个简单的xml: <?xml version="1.0" encoding="UTF-8"?> <Window mininfo="200,360" size=" 480,320 "> (编辑:瑞安网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- remote-desktop – 我应该打开哪个端口来允许远程桌面?
- 21个必知的机器学习开源工具,涵盖5大领域
- windows-7 – 如何在Windows 7中强制更新用户的组成员身份?
- 用于QA测试的Windows桌面(XP,Vista或Win7)EC2 AMI
- 怎么制作Linux系统安装盘,U盘启动盘
- Windows – IIS 7.5 – 更新web.config时禁用不重写的Relap
- Windows 10 5月更新:这10个新功能你不能错过
- 微软需要修复的五个最大的Windows 11问题,处理后,潜力巨大
- win10系统如何硬盘分区
- .net – 如何在Windows窗体应用程序中创建复合键盘快捷键?