zoukankan      html  css  js  c++  java
  • DirectUI界面编程(三)从XML文件中加载界面

    Duilib支持xml界面布局,使得界面设计与逻辑处理相分离,本节介绍如何从xml文件中加载界面元素。
    我们需要以下几个步骤:

    1. 创建并初始化CPaintManagerUI对象。
    2. 创建CDialogBuilder对象,调用CDialogBuilder对象的Create函数加载xml文件,该函数返回界面元素根节点。
    3. 调用CPaintManagerUI的AttachDialog將界面元素根节点附加到CPaintManagerUI对象中。
    4. 编写xml界面布局文件。

    案例代码如下:

    //代码清单tutorial3.cpp
    #include <Windows.h>
    #include "../DuiLib/StdAfx.h" 
    using namespace DuiLib;
    class CMyWnd : public CWindowWnd,public INotifyUI
    {
    public:
        CMyWnd(){}
        LPCTSTR GetWindowClassName() const
        {
            return L"MyWnd";
        }
        UINT GetClassStyle() const{
            return UI_CLASSSTYLE_FRAME|CS_DBLCLKS;
        }
        void Notify(TNotifyUI& msg)
        {
            if(msg.sType == L"click")
            {
                if(msg.pSender->GetName() == L"CloseBtn")
                {
                    if(IDOK == ::MessageBox(m_hWnd,L"退出程序?",L"提示信息",MB_OKCANCEL))
                    {
                        ::PostQuitMessage(0);
                    }
                }
            }
        }
        LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
        {
            switch(uMsg)
            {
            case WM_KEYDOWN:
                {
                    int nVirtKey = (int) wParam;
                    if(VK_ESCAPE == nVirtKey)
                    {
                        ::PostQuitMessage(0);
                    }
                } 
                break;
            case WM_CREATE:
                {
                    m_PaintMgr.Init(m_hWnd); 
                    //从xml中加载界面
                    CDialogBuilder builder;
                    m_pRoot = builder.Create(L"tutorial3.xml",(UINT)0,NULL,&m_PaintMgr);
    
                    m_PaintMgr.AttachDialog(m_pRoot); 
                    m_PaintMgr.AddNotifier(this);
                }
                break;  
            case WM_DESTROY:
                ::PostQuitMessage(0);
                break;
            } 
            LRESULT lRes=0;
            if(m_PaintMgr.MessageHandler(uMsg,wParam,lParam,lRes)) return lRes;
            return CWindowWnd::HandleMessage(uMsg,wParam,lParam);
        }
    
        ~CMyWnd(){
            delete m_pRoot;
        }
    private:
        CPaintManagerUI m_PaintMgr; 
        CControlUI* m_pRoot;
    };
    INT WinMain(HINSTANCE hInst,HINSTANCE hPreInst,LPSTR lpCmdLine,INT Show)
    {
        CPaintManagerUI::SetInstance(hInst);
        CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetResourcePath());
        //创建主窗口
        CMyWnd* pFrame = new CMyWnd();
        pFrame->Create(NULL,L"Tutorial3",UI_WNDSTYLE_FRAME,WS_EX_WINDOWEDGE);
        pFrame->CenterWindow();
        pFrame->ShowWindow(true); 
        CPaintManagerUI::MessageLoop(); 
        delete pFrame;
        return 0;
    }

    和上节相比我们在窗口消息WM_CREATE中创建了CDialogBuilder对象builder,调用Create方法加载界面布局文件tutorial3.xml。

     CDialogBuilder builder;
     m_pRoot = builder.Create(L"tutorial3.xml",(UINT)0,NULL,&m_PaintMgr);
     m_PaintMgr.AttachDialog(m_pRoot); 
    

    接下来的工作就是编写界面布局文件tutorial3.xml,内容如下:

    <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
    <Window   sizebox="4,4,6,6" size="800,600" >
        <VerticalLayout name="MainLayout"   >  
            <HorizontalLayout name="Content" bkcolor="#FFFF0000"> 
               <Button float="true" name="CloseBtn" text="关闭按钮" bkcolor="#FF0000FF" width="150" height="50" pos="200,300,0,0"  >
               </Button> 
            </HorizontalLayout> 
        </VerticalLayout>
    </Window>

    在界面布局文件中,我们同样定义一个名称为CloseBtn按钮。需要注意的一点是Duilib的界面布局xml文件必须是utf-8编码,大家尽量不要使用Windows自带的记事本编辑,可以使用UltraEdit和EditPlus將文件另存为utf-8编码格式。

    编译运行同样可以看到窗口中有一个按钮:

    这里写图片描述

    博文源码:https://github.com/rongbo-j/duilib-tutorial
    (参考tutorial3工程)

  • 相关阅读:
    Thymeleaf 用法
    如何使用FormData上传压缩裁剪后的图片Blob对象
    video播放视频以及相关事件
    将表单序列化为json对象
    滑动到底部自动加载下一页内容,手机H5页面
    获取URL参数
    关于循环往集合添加元素,而导致的元素覆盖问题
    SpringMVC传递数组参数
    SQL查询语句
    jQuery DOM节点操作
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6468640.html
Copyright © 2011-2022 走看看