win32 DirectUI控件开发与调用指南
相较于win32/mfc,directui(win32)更加轻量化,在开发方式上更加现代化,使得其在c++应用方面成为主流,官方中提到了可以开发控件(插件),也就是说新的库可以不写在dui里,而独立出来。研究了许久终于知道如何玩,故此总结一下:
一、创建Dui DLL控件库
使用vc或vs创建一个win32 dll类型的项目,头文件PriceTableUI.h如下:
#pragma once class DuiLib_API PriceTableUI : public CContainerUI //注意要导出类<br>{ public : PriceTableUI(); ~PriceTableUI(); LPCTSTR GetClass() const ; LPVOID GetInterface( LPCTSTR pstrName); void DoEvent(TEventUI& event); void PaintText( HDC hDC); }; |
对应的代码PriceTableUI.cpp如下:
#include "StdAfx.h" #include "PriceTableUI.h" PriceTableUI::PriceTableUI() { } PriceTableUI::~PriceTableUI() { } LPCTSTR PriceTableUI::GetClass() const { return _T( "PriceTableUI" ); } LPVOID PriceTableUI::GetInterface( LPCTSTR pstrName ) { if ( _tcscmp(pstrName, _T( "PriceTable" )) == 0 ) return static_cast <PriceTableUI*>( this ); return CControlUI::GetInterface(pstrName); } void PriceTableUI::DoEvent( TEventUI& event ) { if ( event.Type == UIEVENT_SETFOCUS ) { m_bFocused = true ; return ; } if ( event.Type == UIEVENT_KILLFOCUS ) { m_bFocused = false ; return ; } if ( event.Type == UIEVENT_MOUSEENTER ) //鼠标进入控件 { return ; } if ( event.Type == UIEVENT_MOUSELEAVE ) //鼠标离开控件 { return ; } //其它事件(消息)go to 到dui里自己看了 CControlUI::DoEvent(event); } void PriceTableUI::PaintText( HDC hDC ) { RECT rect = m_rcPaint; HBRUSH redHBrush = CreateSolidBrush(RGB(255,0,0)); FillRect(hDC,&rect,redHBrush); TextOut(hDC,rect.left,rect.top, "china mobile" , strlen ( "china mobile" )); } |
为了简化,这个示例没有对基类函数进一步实现,有需求自行去dui库里复制过来或者自己扩展即可。
二、在主程序中定向自定义控件
ControlEx.h如下:
#pragma once #include "stdafx.h" class CDialogBuilderCallbackEx : public IDialogBuilderCallback { public : CControlUI* CreateControl( LPCTSTR pstrClass) { if ( _tcscmp(pstrClass, "PriceTable" ) == 0 ) return new PriceTableUI; return NULL; } }; |
三、调用控件
如此,即可在dui的xml界面文件里使用<PriceTable />或在程序中调用,比如:
PriceTableUI* table=static_cast<PriceTableUI*>(m_pm.FindControl("table1"));
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
2011-03-23 c++ zlib(qt)压缩与解压缩