• DuiLib学习笔记2——写一个简单的程序


    我们要独立出来自己创建一个项目,在我们自己的项目上加皮肤这才是初衷。我的新建项目名为:duilibTest

    在duilib根目录下面有个 Duilib入门文档.doc 我们就按这个教程开始入门

    首先新建一个win32项目

    去DuiLib根目录,把目录下DuiLib文件夹拷贝到新建项目的根目录。再把这个项目添加进我们解决方案中。

    从教程里面把以下代码粘贴到我们项目的stdafx.h中

    // Duilib使用设置部分
    #pragma once
    
    #define WIN32_LEAN_AND_MEAN	
    #define _CRT_SECURE_NO_DEPRECATE
    
    #include <windows.h>
    #include <objbase.h>
    
    #include "..DuiLibUIlib.h"
    
    using namespace DuiLib;
    
    #ifdef _DEBUG
    #   ifdef _UNICODE
    #       pragma comment(lib, "..\bin\DuiLib_ud.lib")
    #   else
    #       pragma comment(lib, "..\bin\DuiLib_d.lib")
    #   endif
    #else
    #   ifdef _UNICODE
    #       pragma comment(lib, "..\bin\DuiLib_u.lib")
    #   else
    #       pragma comment(lib, "..\bin\DuiLib.lib")
    #   endif
    #endif

    把duilibTest.cpp中,除了头文件引用的代码都删除,再把以下代码粘贴到duilibTest.cpp中

    // 窗口实例及消息响应部分
    class CFrameWindowWnd : public CWindowWnd, public INotifyUI
    {
    public:
        CFrameWindowWnd() { };
        LPCTSTR GetWindowClassName() const { return _T("UIMainFrame"); };
        UINT GetClassStyle() const { return UI_CLASSSTYLE_FRAME | CS_DBLCLKS; };
        void OnFinalMessage(HWND /*hWnd*/) { delete this; };
    
        void Notify(TNotifyUI& msg)
        {
            if( msg.sType == _T("click") ) {
                if( msg.pSender->GetName() == _T("closebtn") ) {
                    Close();
                }
            }
        }
    
        LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
        {
            if( uMsg == WM_CREATE ) {
                m_pm.Init(m_hWnd);
                CControlUI *pButton = new CButtonUI;
                pButton->SetName(_T("closebtn"));
                pButton->SetBkColor(0xFFFF0000);
                m_pm.AttachDialog(pButton);
                m_pm.AddNotifier(this);
                return 0;
            }
            else if( uMsg == WM_DESTROY ) {
                ::PostQuitMessage(0);
            }
            LRESULT lRes = 0;
            if( m_pm.MessageHandler(uMsg, wParam, lParam, lRes) ) return lRes;
            return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
        }
    
    public:
        CPaintManagerUI m_pm;
    };
    
    // 程序入口及Duilib初始化部分
    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPSTR /*lpCmdLine*/, int nCmdShow)
    {
        CPaintManagerUI::SetInstance(hInstance);
        CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath());
    
        CFrameWindowWnd* pFrame = new CFrameWindowWnd();
        if( pFrame == NULL ) return 0;
        pFrame->Create(NULL, _T("测试"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
        pFrame->ShowWindow(true);
        CPaintManagerUI::MessageLoop();
    
        return 0;
    }
    

    此时编译可能会报错:LINK : fatal error LNK1104: 无法打开文件“..inDuiLib_ud.lib” 

    一方面是没有拷贝lib文件进来,另外一方面,是编译duilib时应该采用UnicodeDebug模式

    重新编译duilib后,在lib文件夹里找到DuiLib_ud.lib拷贝到bin文件夹里。把bin文件夹中的DuiLib_ud.dll拷贝到debug文件夹里。

    再次编译duilibTest就能通过编译了。运行结果如下:

    到了这一步说明你的duilib已经能正常使用了。接下来继续跟着文档走,我们来读取xml配置

    首先改HandleMessage中的代码,把下面注释掉的代码改为新的

    //CControlUI *pButton = new CButtonUI;
    //pButton->SetName(_T("closebtn"));
    //pButton->SetBkColor(0xFFFF0000);
    //m_pm.AttachDialog(pButton);
    CDialogBuilder builder;
    CControlUI* pRoot = builder.Create(_T("test1.xml"), (UINT)0, NULL, &m_pm);
    ASSERT(pRoot && "Failed to parse XML");
    m_pm.AttachDialog(pRoot);
    

    创建一个test1.xml,使用vs直接创建一个xml,确保xml文件编码是utf-8格式

    在xml中写入如下代码

    <?xml version="1.0" encoding="utf-8"?>
    <Window mininfo="200,360" size=" 480,320 ">
      <Font name="幼圆" size="16" default="true" />
      <VerticalLayout bkcolor="#FFFF00FF">
        <Button name="closebutton" height="20" text="测试按钮" maxwidth="120" />
        <RichEdit name="testrichedit" bordercolor="#FF0000" bordersize="0" borderround="18,18" inset="4,2,4,2" bkcolor="#A0F2F5FA" bkcolor2="#A0FF0000" bkcolor3="#A0F2F5FA" font="1" multiline="true" vscrollbar="true" autovscroll="true" enabled="true" rich="true" readonly="false" text="测试richedit">
        </RichEdit>
        <Edit name="testedit" text="测试编辑框" />
      </VerticalLayout>
    </Window>
    

      

    再把这xml个文件拷贝到debug下,调试运行程序,就出现如下效果了

    ok,至此UI部分算是大概知道是怎么写的了,但是我们还差一个很重要的入门东西,就是事件响应。其实很喜欢这个库的作者们写的入门文档,正和我心意。

    Duilib中的事件响应有两种方式:

    1.在事件处理类(一般使用窗口类)中实现INotifyUI接口,然后在Notify函数中处理事件

    Notify函数中处理就是我们前面看到的,通过if( msg.sType == _T("click") )判断是否为click事件,再通过msg.pSender->GetName() == _T("closebutton")来判断name,确定是哪个按钮触发的事件

    2.使用代理机制处理事件

    要复杂的多,占时没看的很明白,就不误人子弟了

  • 相关阅读:
    打造自己的性能测试类
    网站配置之最佳实践
    C#控制台窗口居中显示(转)
    将PDM文件导出成CHM帮助文件
    分享使用NPOI导出Excel树状结构的数据,如部门用户菜单权限
    Oracle 给已创建的表增加自增长列
    托管调试助手“NonComVisibleBaseClass”检测到问题
    翻页效果
    Excel表格转Json数据结构
    关于2D渲染的一些小想法
  • 原文地址:https://www.cnblogs.com/duguxue/p/3814935.html
Copyright © 2020-2023  润新知