zoukankan      html  css  js  c++  java
  • duilib教程之duilib入门简明教程6.XML配置界面

    前面那些教程都是为了让小伙伴们从win32、MFC过渡到duilib,让大家觉得duilib不是那么陌生,如果大家现在还对duilib非常陌生的话,那就说明前面的教程做得不好,请大家在下面留言,我会一一查看,并做出改进。    从这个教程开始就是见证奇迹的时刻啦~(^o^)/~ 

        其实duilib主打的界面制作方式是XML + UI引擎 + win32框架,其实和浏览器HTML + CSS + 渲染引擎的方式非常类似,可以将其理解为一个非常mini的浏览器。
        而用duilib写界面时,大部分是在写XML,类似于写HTML,这点可能会让习惯MFC等windows界面的伙伴们有点不习惯,需要克服克服,相信在看完Alberl的教程之后,就会习惯啦~

        前面的教程所使用的界面制作方式大家应该不算陌生,那么如果用XML来实现,会是什么样子呢?  
        其实也是很简单的,
        1、把if( uMsg == WM_CREATE ) 里面的代码改成下面这样:

    1. if( uMsg == WM_CREATE ) 
    2.         {
    3.             m_PaintManager.Init(m_hWnd);
    4.             CDialogBuilder builder;
    5.             CControlUI* pRoot = builder.Create(_T("duilib.xml"), (UINT)0, NULL, &m_PaintManager);   // duilib.xml需要放到exe目录下
    6.             ASSERT(pRoot && "Failed to parse XML");
    7.             m_PaintManager.AttachDialog(pRoot);
    8.             m_PaintManager.AddNotifier(this);   // 添加控件等消息响应,这样消息就会传达到duilib的消息循环,我们可以在Notify函数里做消息处理
    9.             return lRes;
    10.         }
    复制代码


       2、设置XML的路径:    在CPaintManagerUI::SetInstance(hInstance); 下面调用SetResourcePath函数:

    1. CPaintManagerUI::SetInstance(hInstance);
    2.     CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath());   // 设置资源的默认路径(此处设置为和exe在同一目录)
    复制代码


    3、建立XML:    新建一个XML,文件名为“duilib.xml”,保存为UTF-8格式(不要使用windows自带的记事本编辑,可以使用UltraEdit、EditPlus等编辑器),内容如下:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <Window size="800,600"> <!-- 窗口的初始尺寸 -->
    3.     <HorizontalLayout bkcolor="#FF00FF00"> <!-- 整个窗口的背景 -->
    4.     </HorizontalLayout>
    5. </Window>
    复制代码




    4、将"duilib.xml"放到exe目录下。  现在即可看到一个绿色的窗口,是不是也很简单呢。
      那么我们继续来添加Hello World按钮吧~O(∩_∩)O~
      上面的XML只是描述了窗口的大小和背景色,但是并没有添加按钮,下面我们添加一个Hello 按钮,只需在XML里面添加一行即可:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <Window size="800,600"> <!-- 窗口的初始尺寸 -->
    3.     <HorizontalLayout bkcolor="#FF00FF00"> <!-- 整个窗口的背景 -->
    4.         <Button name="btnHello" text="Hello World"/> <!-- 按钮的属性,如名称、文本 -->
    5.     </HorizontalLayout>
    6. </Window>
    复制代码





     再次运行一下exe,是不是又看到了熟悉的画面,怎么样,写XML很简单吧~O(∩_∩)O~   :
     

      不过大家可以发现,改成XML后,窗口启动后不居中了,怎么办呢?
    在duiFrame.ShowModal上面那行加上duiFrame.CenterWindow();就可以啦
    main.cpp的完整代码如下:



    1. #pragma once
    2. #include 
    3. using namespace DuiLib;
    4. #ifdef _DEBUG
    5. #   ifdef _UNICODE
    6. #       pragma comment(lib, "DuiLib_ud.lib")
    7. #   else
    8. #       pragma comment(lib, "DuiLib_d.lib")
    9. #   endif
    10. #else
    11. #   ifdef _UNICODE
    12. #       pragma comment(lib, "DuiLib_u.lib")
    13. #   else
    14. #       pragma comment(lib, "DuiLib.lib")
    15. #   endif
    16. #endif
    17. class CDuiFrameWnd : public CWindowWnd, public INotifyUI
    18. {
    19. public:
    20.     virtual LPCTSTR GetWindowClassName() const { return _T("DUIMainFrame"); }
    21.     virtual void    Notify(TNotifyUI& msg) 
    22.     {
    23.         if(msg.sType == _T("click"))
    24.         {
    25.             if(msg.pSender->GetName() == _T("btnHello")) 
    26.             {
    27.                 ::MessageBox(NULL, _T("我是按钮"), _T("点击了按钮"), NULL);
    28.             }
    29.         }
    30.     }
    31.     virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
    32.     {
    33.         LRESULT lRes = 0;
    34.         if( uMsg == WM_CREATE ) 
    35.         {
    36.             m_PaintManager.Init(m_hWnd);
    37.             CDialogBuilder builder;
    38.             CControlUI* pRoot = builder.Create(_T("duilib.xml"), (UINT)0, NULL, &m_PaintManager);   // duilib.xml需要放到exe目录下
    39.             ASSERT(pRoot && "Failed to parse XML");
    40.             m_PaintManager.AttachDialog(pRoot);
    41.             m_PaintManager.AddNotifier(this);   // 添加控件等消息响应,这样消息就会传达到duilib的消息循环,我们可以在Notify函数里做消息处理
    42.             return lRes;
    43.         }
    44.         // 以下3个消息WM_NCACTIVATE、WM_NCCALCSIZE、WM_NCPAINT用于屏蔽系统标题栏
    45.         else if( uMsg == WM_NCACTIVATE ) 
    46.         {
    47.             if( !::IsIconic(m_hWnd) ) 
    48.             {
    49.                 return (wParam == 0) ? TRUE : FALSE;
    50.             }
    51.         }
    52.         else if( uMsg == WM_NCCALCSIZE ) 
    53.         {
    54.             return 0;
    55.         }
    56.         else if( uMsg == WM_NCPAINT ) 
    57.         {
    58.             return 0;
    59.         }
    60.         if( m_PaintManager.MessageHandler(uMsg, wParam, lParam, lRes) ) 
    61.         {
    62.             return lRes;
    63.         }
    64.         return __super::HandleMessage(uMsg, wParam, lParam);
    65.     }
    66. protected:
    67.     CPaintManagerUI m_PaintManager;
    68. };
    69. int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
    70. {
    71.     CPaintManagerUI::SetInstance(hInstance);
    72.     CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath());   // 设置资源的默认路径(此处设置为和exe在同一目录)
    73.     CDuiFrameWnd duiFrame;
    74.     duiFrame.Create(NULL, _T("DUIWnd"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
    75.     duiFrame.CenterWindow();
    76.     duiFrame.ShowModal();
    77.     return 0;
    78. }
    复制代码


    注意:以上已给出完整代码,由于最前面的17行是#include等信息,基本不会变动,所以后面的教程不再列出这些代码。

  • 相关阅读:
    Git连接Github
    全民来打飞机~~(设计探讨)
    mongo学习
    redis aop持久化
    redis的超时删除策略
    redis 学习,没事的时候看看增长知识面
    MySQL query / clause execution order
    用redis做超时判断 感觉写的很有意思
    python 编码问题(转载)
    git 个人学习
  • 原文地址:https://www.cnblogs.com/blogpro/p/11427052.html
Copyright © 2011-2022 走看看