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"));

 

posted on   chuncn  阅读(4773)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
历史上的今天:
2011-03-23 c++ zlib(qt)压缩与解压缩

导航

< 2012年3月 >
26 27 28 29 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
1 2 3 4 5 6 7
点击右上角即可分享
微信分享提示