前面那些教程都是为了让小伙伴们从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.  
  5. CDialogBuilder builder;
  6. CControlUI* pRoot = builder.Create(_T("duilib.xml"), (UINT), NULL, &m_PaintManager); // duilib.xml需要放到exe目录下
  7. ASSERT(pRoot && "Failed to parse XML");
  8.  
  9. m_PaintManager.AttachDialog(pRoot);
  10. m_PaintManager.AddNotifier(this); // 添加控件等消息响应,这样消息就会传达到duilib的消息循环,我们可以在Notify函数里做消息处理
  11. return lRes;
  12. }

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

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

 
 
 

2013 duilib入门简明教程 -- XML配置界面(6)的更多相关文章

  1. duilib入门简明教程 -- XML配置界面(6)

       前面那些教程都是为了让小伙伴们从win32.MFC过渡到duilib,让大家觉得duilib不是那么陌生,如果大家现在还对duilib非常陌生的话,那就说明前面的教程做得不好,请大家在下面留言, ...

  2. duilib入门简明教程 -- XML配置界面(6) (转)

    原文转自:http://www.cnblogs.com/Alberl/p/3343699.html     前面那些教程都是为了让小伙伴们从win32.MFC过渡到duilib,让大家觉得duilib ...

  3. 2013 duilib入门简明教程 -- XML基础类(7)

    现在大家应该对XML描述界面不那么陌生了,那么我们做进一步介绍. 前面的教程我们写了很多代码,为的是让大家了解下基本流程,其实duilib已经对常用的操作做了很好的包装,正式使用时无需像前面的教程那样 ...

  4. 2013 duilib入门简明教程 -- 总结 (20)

        duilib的入门系列就到尾声了,再次提醒下,Alberl用的duilib版本是SVN上第个版本,时间是2013.08.15~       这里给出Alberl最后汇总的一个工程,戳我下载,效 ...

  5. 2013 duilib入门简明教程 -- 自绘控件 (15)

        在[2013 duilib入门简明教程 -- 复杂控件介绍 (13)]中虽然介绍了界面设计器上的所有控件,但是还有一些控件并没有被放到界面设计器上,还有一些常用控件duilib并没有提供(比如 ...

  6. 2013 duilib入门简明教程 -- 事件处理和消息响应 (17)

        界面的显示方面就都讲完啦,下面来介绍下控件的响应.     前面的教程只讲了按钮和Tab的响应,即在Notify函数里处理.其实duilib还提供了另外一种响应的方法,即消息映射DUI_BEG ...

  7. 2013 duilib入门简明教程 -- FAQ (19)

        虽然前面的教程几乎把所有的知识点都罗列了,但是有很多问题经常在群里出现,所以这里再次整理一下.     需要注意的是,在下面的问题中,除了加上XML属性外,主窗口必须继承自WindowImpl ...

  8. 2013 duilib入门简明教程 -- 第一个程序 Hello World(3)

    小伙伴们有点迫不及待了么,来看一看Hello World吧: 新建一个空的win32项目,新建一个main.cpp文件,将以下代码复制进去: #include <windows.h> #i ...

  9. 2013 duilib入门简明教程 -- 部分bug (11)

     一.WindowImplBase的bug     在第8个教程[2013 duilib入门简明教程 -- 完整的自绘标题栏(8)]中,可以发现窗口最大化之后有两个问题,     1.最大化按钮的样式 ...

随机推荐

  1. Http、Https请求工具类

    最近在做微信开发,使用http调用第三方服务API,有些是需要https协议,通过资料和自己编码,写了个支持http和https的工具类,经验证可用,现贴出来保留,也供需要的人使用(有不足的地方,也请 ...

  2. IO(1)

    java的IO主要在java.io包下,包括字节流和字符流. 1 File File类可以对文件和目录进行操作,就是不能访问文件本身,其常用方法包括: 1)String getName(),返回fil ...

  3. NPM 使用淘宝镜像

    --registry https://registry.npm.taobao.org

  4. xml_TO_object

    一般对于开发人员拿到的xml文件都是配置文件,所以对于我们来说,最主要要做的事情是将xml的内容封装成对象. 下面展示代码 package javaDom4j; import java.util.Ar ...

  5. Echart地图城市用json返回格式

    用Echarts中,使用地图的series部分中展示城市如果用json返回数据的话,js不能直接用字符串使用.需要处理一下. php中的部分 json返回的数据 js中获取json信息 用ajax实现 ...

  6. java微信公众号开发----搭建ngrok环境

    下载ngrok,一个能够在公网安全访问内网Web主机的工具 下载地址:http://download.csdn.net/download/u014252425/9389847,亲测可用 下载完成后,进 ...

  7. Oldboy-Homework-Week2.2

    一.关于Python全栈开发第二周所讲内容的回忆(上篇)6.列表(list).元组(tuple).字典(dictionary)7.字符串.及其字符串格式化输出8.for循环二.详细内容6.1列表:列表 ...

  8. 还原后缀名为.bak的数据库备份文件

    1.打开SQL Server Management Studio,随便右击击一个数据库选择任务-->还原-->数据库 4.在弹出来的窗口中的源选项中选择设备-->点选择设备--> ...

  9. webstorm2016注册码

    43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QTczWVlKIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiI ...

  10. [IOS]Swift 遍历预制的本地资源文件

    我事先放了一堆svg文件,但是我是批量使用的,想要直接遍历他们加入到一个list中来,那我直接就遍历他们的名称,把他们的名字组成一个array. var ss:NSString = NSBundle. ...