当前位置: 首页 > news >正文

Duilib 二

main函数

// DuilibDemo.cpp : 定义应用程序的入口点。
//#include "stdafx.h"
#include "DuilibDemo.h"int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInstance,_In_ LPTSTR    lpCmdLine,_In_ int       nCmdShow)
{UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);return 0;
}

创建Duilib Win32 窗体

#pragma once#include "UIlib.h"#ifdef _DEBUG
#pragma comment(lib,"Duilib_d.lib")
#else
#pragma comment(lib,"Duilib.lib")
#endifusing namespace DuiLib;class CDuilibWin32Wnd :public CWindowWnd
{
public:CDuilibWin32Wnd();~CDuilibWin32Wnd();protected:virtual LPCTSTR GetWindowClassName() const = 0;
};
#include "stdafx.h"
#include "DuilibWin32Wnd.h"CDuilibWin32Wnd::CDuilibWin32Wnd()
{
}CDuilibWin32Wnd::~CDuilibWin32Wnd()
{
}LPCTSTR CDuilibWin32Wnd::GetWindowClassName() const
{return L"DuilibWin32Window";
}

DuilibDemo.cpp : 定义应用程序的入口点


//#include "stdafx.h"
#include "DuilibDemo.h"
#include "DuilibWin32Wnd.h"int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInstance,_In_ LPTSTR    lpCmdLine,_In_ int       nCmdShow)
{UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);::CoInitialize(NULL);CPaintManagerUI::SetInstance(hInstance);//Duilib win32 窗体:CDuilibWin32Wnd duilibWin32Wnd;HWND hDuiWin32Wnd = duilibWin32Wnd.Create(NULL, L"DuilibWin32Wnd", WS_OVERLAPPEDWINDOW, NULL, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL);if (hDuiWin32Wnd == NULL){MessageBox(NULL, L"DuilibWin32窗体创建失败!", L"Err", MB_OK);return false;}duilibWin32Wnd.CenterWindow();duilibWin32Wnd.ShowWindow(SW_SHOW);CPaintManagerUI::MessageLoop();::CoUninitialize();return 0;
}

创建Duilib 支持XML 窗体

//WindowImplBase是Duilib在纯Win32窗体类的基础上融入Duilib特性(支持XML加载界面),给我们实现的一个支持Duilib特性的窗体类!(这样的一个Duilib窗体类,我们完全是可以自己写的)
exe运行目录:创建skin目录,书写XML界面文件(demo.xml)

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Window size="668,469" caption="0,0,0,56" roundcorner="4,4"><Font id="0" name="微软雅黑" size="12"/><Font id="1" name="微软雅黑" size="14"/><Font id="2" name="微软雅黑" size="16"/><Font id="3" name="微软雅黑" size="18"/><VerticalLayout bkcolor="#FFFFFFFF"><HorizontalLayout name="ListContainer" vscrollbar="true" ><List name="list_data"><ListContainerElement pos="0,0,400,30" minheight="30" maxheight="30" mouse="true" mousechild="true" bordersize="1"><HorizontalLayout><HorizontalLayout><VerticalLayout><Control /><Button name="sectionNameBtn" height="20" text="button" align="left" textcolor="#FF0000FF" font="4" padding="20,0,0,0" focusedtextcolor="#FF00FF00" pushedtextcolor="#FFFF0000" /><Control /></VerticalLayout></HorizontalLayout><HorizontalLayout width="120"><Label name="DurationLabel" text="label" align="center" textcolor="#FF000000" disabledtextcolor="#FFA7A6AA" />            </HorizontalLayout><HorizontalLayout width="60">				<VerticalLayout><Control /><Button name="playSectionBtn" text="play" align="center" width="50" height="20" font="1" bkcolor="#FF0090F0" textcolor="#FFFFFFFF"/><Control /></VerticalLayout></HorizontalLayout></HorizontalLayout>	</ListContainerElement>				</List></HorizontalLayout></VerticalLayout>
</Window>
#pragma once#include "UIlib.h"#ifdef _DEBUG
#pragma comment(lib,"Duilib_d.lib")
#else
#pragma comment(lib,"Duilib.lib")
#endifusing namespace DuiLib;class CDuilibXMLWnd : public WindowImplBase
{
public:CDuilibXMLWnd();~CDuilibXMLWnd();protected:virtual CDuiString GetSkinFolder();virtual CDuiString GetSkinFile();virtual LPCTSTR GetWindowClassName(void) const;
};

#include "stdafx.h"
#include "DuilibXMLWnd.h"CDuilibXMLWnd::CDuilibXMLWnd()
{
}CDuilibXMLWnd::~CDuilibXMLWnd()
{
}CDuiString CDuilibXMLWnd::GetSkinFolder()
{return L"./skin";
}CDuiString CDuilibXMLWnd::GetSkinFile()
{return L"Demo.xml";
}LPCTSTR CDuilibXMLWnd::GetWindowClassName(void) const
{return L"DuilibXMLWindow";
}
// DuilibDemo.cpp : 定义应用程序的入口点。
//#include "stdafx.h"
#include "DuilibDemo.h"
#include "DuilibWin32Wnd.h"
#include "DuilibXMLWnd.h"int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInstance,_In_ LPTSTR    lpCmdLine,_In_ int       nCmdShow)
{UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);::CoInitialize(NULL);CPaintManagerUI::SetInstance(hInstance);//Duilib win32 窗体://CDuilibWin32Wnd duilibWin32Wnd;//HWND hDuiWin32Wnd = duilibWin32Wnd.Create(NULL, L"DuilibWin32Wnd", WS_OVERLAPPEDWINDOW, NULL, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL);//if (hDuiWin32Wnd == NULL)//{//	MessageBox(NULL, L"DuilibWin32窗体创建失败!", L"Err", MB_OK);//	return false;//}//duilibWin32Wnd.CenterWindow();//duilibWin32Wnd.ShowWindow(SW_SHOW);CDuilibXMLWnd duilibXMLWnd;HWND hDuiXMLWnd = duilibXMLWnd.Create(NULL, L"DuilibXMLWnd", WS_OVERLAPPEDWINDOW, NULL, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL);if (hDuiXMLWnd == NULL){MessageBox(NULL, L"DuilibXMLWnd窗体创建失败!", L"Err", MB_OK);return false;}duilibXMLWnd.CenterWindow();duilibXMLWnd.ShowWindow(SW_SHOW);CPaintManagerUI::MessageLoop();::CoUninitialize();return 0;
}

7.实现Duilib 如何从原生Win32窗体(CWindowWnd)演变成支持Duilib特性(实现:WindowImplBase)的Duilib窗体!

//2.重写HandleMessage 接收处理窗口过程消息
class CBaseDuilibWnd :public CWindowWnd
{
public:CBaseDuilibWnd();~CBaseDuilibWnd();//
protected:	virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);//处理消息virtual LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);virtual LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);virtual LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);//virtual LPCTSTR GetWindowClassName() const;
private:CPaintManagerUI m_pUI;
};
//.cpp
LRESULT CBaseDuilibWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{LRESULT lRes = 0;BOOL bHandled = TRUE;switch (uMsg){//创建窗体case WM_CREATE:lRes = OnCreate(uMsg, wParam, lParam, bHandled);break;//销毁窗体case WM_DESTROY:PostQuitMessage(0);break;default:bHandled = FALSE;}if (bHandled){return lRes;}//消息流向Duilib消息处理if (m_pUI.MessageHandler(uMsg, wParam, lParam, lRes))return lRes;//消息流向系统默认处理return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
}

//处理窗体创建消息WM_CREATE:
LRESULT CBaseDuilibWnd::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{//窗体句柄给UI管理器m_pUI.Init(m_hWnd);//创建XML解析器CDialogBuilder builder;//解析并返回根UI节点CControlUI* pRoot = builder.Create(_T("Demo.xml"), (UINT)0, NULL, &m_pUI);ASSERT(pRoot && "Failed to parse XML");//将根节点加入UI管理器m_pUI.AttachDialog(pRoot);return 0;
}
#include "stdafx.h"
#include "DuilibDemo.h"
#include "BaseDuilibWnd.h"int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInstance,_In_ LPTSTR    lpCmdLine,_In_ int       nCmdShow)
{UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);//Duilib用到了COM所以需要进行COM初始化和销毁::CoInitialize(NULL);CPaintManagerUI::SetInstance(hInstance);/*custom XML Duilib 窗体*///设置资源路径 自己手写Duilib窗体类 skin放DuilibDemo工程目录或者将运行目录设置为exe所在目录DuiLib::CPaintManagerUI::SetResourcePath(TEXT("./skin"));CBaseDuilibWnd duilibBaseWnd;HWND hDuiXMLWnd = duilibBaseWnd.Create(NULL, L"DuilibBaseWnd", WS_OVERLAPPEDWINDOW, NULL, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL);if (hDuiXMLWnd == NULL){MessageBox(NULL, L"DuilibBaseWnd窗体创建失败!", L"Err", MB_OK);return false;}duilibBaseWnd.CenterWindow();duilibBaseWnd.ShowWindow(SW_SHOW);//Duilib消息循环CPaintManagerUI::MessageLoop();::CoUninitialize();return 0;
}
  1. 接收Duilib事件消息
//继承INotifyUI类,重写Notify接口
class CBaseDuilibWnd :public CWindowWnd,public INotifyUI
virtual void Notify(TNotifyUI& msg);
void CBaseDuilibWnd::Notify(TNotifyUI& msg)
{if (msg.sType == TEXT("windowinit")){OnInitWindow();}else if (msg.sType == TEXT("click")){CDuiString strName = msg.pSender->GetName();strName += L" click";MessageBox(NULL, strName, L"Info", NULL);}
}
//在窗体创建时(WM_CREATE)将当前窗体对象加入到Duilib事件通知里
m_pmUI.AddNotifier(this);

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • openfeign本地试用
  • 工厂模式 vs 策略模式:Java设计模式详细对比
  • 科学碳目标|科学碳倡议|SBTI认证|科学基础目标倡议
  • JSONB字段搜索走索引
  • 【人工智能】常用的人工智能框架、模型、使用方法、应用场景以及代码实例的概述
  • 嵌入式实时操作系统VxWorks面试题及参考答案(4万字长文)
  • 学习笔记第十九天
  • 网络编程先验知识1
  • Flake8 和 Autopep8 使用指南
  • 用AI生成海报设计!AI绘画大模型Flux的在线使用!
  • 【NLP】文本预处理的概念、处理方法、数学公式
  • K8s集群里 中Flannel的状态显示为CrashLoopBackOff 时
  • Stable Diffusion绘画 | 提示词基础原理
  • 深度学习线性代数基础
  • 坐标变换矩阵
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • [译] 怎样写一个基础的编译器
  • CSS3 变换
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • k8s如何管理Pod
  • Quartz初级教程
  • 漂亮刷新控件-iOS
  • 普通函数和构造函数的区别
  • 新书推荐|Windows黑客编程技术详解
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • # Java NIO(一)FileChannel
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #### go map 底层结构 ####
  • #etcd#安装时出错
  • #Java第九次作业--输入输出流和文件操作
  • #Linux(帮助手册)
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • $ git push -u origin master 推送到远程库出错
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (1)Hilt的基本概念和使用
  • (C语言)字符分类函数
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (zt)最盛行的警世狂言(爆笑)
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (四)图像的%2线性拉伸
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转)编辑寄语:因为爱心,所以美丽
  • .axf 转化 .bin文件 的方法
  • .env.development、.env.production、.env.staging
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET Core 中插件式开发实现
  • .NET Core 中的路径问题
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)