• 2021 Duilib最新入门教程(三)Duilib调用动态库示例


      先介绍下Duilib例子的相关原理,有个大概的认识,再列举具体的步骤。

    原理

      使用Duilib编写一个界面软件,本质上还是一个Win32的软件,只不过这个软件的界面不使用Windows自带的控件,而是交给Duilib绘制界面。
      关于消息处理,底层还是处理Window消息,但Duilib会进一步转化成Duilib消息,方便编写响应的逻辑。
      
      基本流程:
        Win32的入口函数:_tWinMain
        Duilib生成界面:CDialogBuilder
        Duilib绘制界面:CPaintManagerUI
        处理Window消息:CWindowWnd
        处理Duilib消息: INotifyUI

      调用动态库需要三件套:
        1、头文件
        2、导入库
        3、动态库

    步骤

      
    1、创建新项目

      
    2、选择Windows桌面向导

      
    3、设置项目名字

      
    4、勾上空项目,选择桌面应用程序

      
    5、引入Duilib的头文件和导入库


      
    6、复制Duilib的动态库
      从duilib-masterin目录中复制动态库文件到DuilibMinDemoDuilibMinDemo目录
      动态库文件包括:DuiLib.dll、DuiLib_d.dll、DuiLib_u.dll、DuiLib_ud.dll

      
    7、添加main.cpp

      
    8、编写代码

    #include "UIlib.h"                      // 引入头文件:UIlib.h
    using namespace DuiLib;                 // 使用命名空间:DuiLib
    #pragma comment(lib, "DuiLib_ud.lib")   // 加载导入库:DuiLib_ud.lib
    //CWindowWnd:处理Window消息 INotifyUI:处理Duilib消息
    class CDuilibWnd : public CWindowWnd, public INotifyUI  
    {
    public:
    	virtual LPCTSTR GetWindowClassName() const { return _T("DuiWnd"); }
    	// 响应消息 重写INotifyUI::Notify
    	virtual void Notify(TNotifyUI& msg) 
    	{
    		//if (msg.sType == DUI_MSGTYPE_CLICK)
    		if (msg.sType == _T("click"))	
    		{
    			if (msg.pSender->GetName() == _T("btn"))
    			{
    				::MessageBox(NULL, _T("按钮内容"), _T("按钮标题"), NULL);
    			}
    		}
    	}
    	// 重写CWindowWnd::HandleMessage处理消息
    	virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) 
    	{
    		LRESULT lRes = 0;
    		// 初始化窗口消息
    		if (uMsg == WM_CREATE) 				   
            {
    			// 初始化绘制管理器,m_hWnd句柄在一个消息WM_NCCREATE中赋值
    			m_PaintManager.Init(m_hWnd);		
    			
    			// 使用XML布局文件生成界面
    			CDialogBuilder builder;				
    			CControlUI* pRoot = builder.Create(_T("duilib.xml"), 0, NULL, &m_PaintManager);
    			ASSERT(pRoot && "Failed to parse XML");
    			// 添加CControlUI对象,用于管理界面
    			m_PaintManager.AttachDialog(pRoot);	
    			// 添加INotifyUI对象,用于处理消息
    			m_PaintManager.AddNotifier(this);	
    			return lRes;
    		}
    		// CPaintManagerUI处理消息
    		if (m_PaintManager.MessageHandler(uMsg, wParam, lParam, lRes)) return lRes;	
    		// CWindowWnd兜底处理消息
    		return __super::HandleMessage(uMsg, wParam, lParam);						
    	}
    protected:
    	// 绘制管理器:负责绘制界面和管理消息
    	CPaintManagerUI m_PaintManager;				
    };
    int APIENTRY _tWinMain(
    	_In_ HINSTANCE hInstance, 
    	_In_opt_ HINSTANCE hPrevInstance, 
    	_In_ LPWSTR lpCmdLine, 
    	_In_ int nShowCmd )
    {
    	// 绘制管理器CPaintManagerUI绑定窗口句柄
    	CPaintManagerUI::SetInstance(hInstance);    
    	// 绘制管理器CPaintManagerUI设置资源目录,用于加载XML
    	CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath()); 
    	// 创建窗口
    	CDuilibWnd duilibWnd;  
    	duilibWnd.Create(NULL, _T("标题"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE); 
    	// 显示窗口并且监听消息
    	duilibWnd.ShowModal();  
    	return 0;
    }
    

      
    9、添加界面文件
      DuilibMinDemoDebug 加上界面文件:duilib.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <Window size="240,100">
        <HorizontalLayout bkcolor="#FFFFFFFF">
    		<Button name="btn" text="按钮" height="40" width="80" bordersize="1,1,1,1" bordercolor="#FFBCBCBC"/>
        </HorizontalLayout>
    </Window>
    

      
    10、运行效果

      
    Duilib技术交流群:799142530
    源码地址:https://github.com/KongKong20/DuilibTutor

  • 相关阅读:
    重学SQL Server 笔记(二)
    H.E mapreduce操作HBase(转载)
    Paxos算法能帮助我们做什么呢? 如下几点:
    Hive入门3–Hive与HBase的整合(转载)
    Hadoop的I / O管道剖析
    install jdk in ubuntu( please notice diffrent verstion and change the name in the configuration)
    sudo bin/hadoop namenode format
    asp.net + ext grid程序示例(提供源码下载)
    摩尔定律
    it's time go to sleep ,i will be continue!
  • 原文地址:https://www.cnblogs.com/wwgk/p/14314523.html
Copyright © 2020-2023  润新知