• duilib入门教程


    duilib使用手册

    1.简介

    duilib是一个开源 的directui 界面库,使用XML来描述界面风格,界面布局,将界面与逻辑分离,能够快速开发美观的界面。

    2.代码下载与编译

    2.1代码下载

    github网址:https://github.com/duilib/duilib
    下载后的代码结构如下:

    文件结构

    2.2编译

    打开根目录的Duilib.sln,github上的工程是VS2013的,使用VS2017打开时,会提示升级工程,点升级即可。如果没有升级成功,在工程配置中修改如下选项,选择win10的sdk和VS2017的工具集。

    sdk与工具集修改

    按照如下要求修改文件编码,解决由于编码格式的问题会导致vs2017下编码失败的问题。
    修改文件编码

    根据实际需求,选择对应的工程配置,静态库或者动态库,Unicode或者多字节等等。

    工程配置

    工程配置

    选择好工程配置之后,编译工程DuiLib即可。
    注意:生成duilib静态库时,需要添加预编译宏UILIB_STATIC

    3.使用

    3.1库链接与头文件包含

    使用duilib界面库,可以分为动态链接和静态链接两种方式。

    1.静态链接
    工程配置中添加对duilib.lib静态库的链接,并且添加预定义宏UILIB_STATIC

    2.动态链接
    将生成的duilib.dll拷贝到输出文件的同级目录下,同时添加对导入库duilib.lib的静态链接。

    3.头文件
    将如下标记的文件和文件夹拷贝,使用时包含UIlib.h文件即可。

    需要拷贝的文件

    3.2代码中的使用

    duilib提供了一个封装类WindowImplBase,从该类继承,并重写部分函数即可,详情参考demo代码:

    #include "..DuiLibUIlib.h"
    
    #ifdef _DEBUG
    #   ifdef _UNICODE
    #       pragma comment(lib, "DuiLib_ud.lib")
    #   else
    #       pragma comment(lib, "DuiLib_d.lib")
    #   endif
    #else
    #   ifdef _UNICODE
    #       pragma comment(lib, "DuiLib_u.lib")
    #   else
    #       pragma comment(lib, "DuiLib.lib")
    #   endif
    #endif
    
    using namespace DuiLib;
    
    
    class TestFrame : public WindowImplBase
    {
    public:
        TestFrame(){}
        ~TestFrame(){}
    
        virtual CDuiString GetSkinFolder()
        {
            return _T("");
        }
        virtual CDuiString GetSkinFile()
        {
            return _T("demo.xml");
        }
        virtual LPCTSTR GetWindowClassName(void) const
        {
            return _T("TestWindowClass");
        }
        virtual LRESULT OnClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
        {
            PostQuitMessage(0);
            return 0;
        }
    
        virtual void Notify(TNotifyUI& msg)
        {
            if (msg.sType == _T("click"))
            {
                if (msg.pSender->GetName() == _T("buttonName1"))
                {
                    ::MessageBox(NULL, _T("buttonName1 has been clicked"), _T(""), NULL);
                }
            }
        }
    
        
    private:
    
    };
    
    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPSTR /*lpCmdLine*/, int nCmdShow)
    {
        CPaintManagerUI::SetInstance(hInstance);
    
        HRESULT Hr = ::CoInitialize(NULL);
        if (FAILED(Hr)) return 0;
    
        TestFrame* pFrame = new TestFrame();
        if (pFrame == NULL) return 0;
        pFrame->Create(NULL, _T("TestWindow"), UI_WNDSTYLE_FRAME, 0, 0, 0, 0, 0);
        pFrame->CenterWindow();
        ::ShowWindow(*pFrame, SW_SHOW);
    
        CPaintManagerUI::MessageLoop();
    
        ::CoUninitialize();
        return 0;
    }
    

    对应的xml布局文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <Window size="600,360">
    	<VerticalLayout bkcolor="0xFF87CEEB">
    		<Control />
    		<HorizontalLayout height="40">
    			<Control />
    			<Button name="button1" text="button1" width="80" height="40" bkcolor="0xFF228B22" />
    			<Control />
    		</HorizontalLayout>
    		<Control />
    	</VerticalLayout>
    </Window>
    

    运行结果:

    运行结果

    关于duiliib的详细用法,可以参考源码工程中的demo,基本列举了所有控件的用法,包括各种布局情况。也可以参考博客:
    duilib布局详解
    duilib属性列表

  • 相关阅读:
    【JAVASCRIPT】JS实现淘宝,百度评分功能
    【数据结构】链式线性表的几种常用用法
    【JAVASCRIPT】无刷新评论
    【JAVASCRIPT】表单序列化问题
    【JAVASCRIPT】如何不使用jquery函数和ajax框架实现ajax效果
    图灵北京作译者交流会
    是起点,而非终点——评《程序员的思维修炼》
    2011图灵新春特献
    图灵2011.01书讯
    图灵2010.12书讯
  • 原文地址:https://www.cnblogs.com/lzm-cn/p/11422558.html
Copyright © 2020-2023  润新知