duilib——从XML文件中加载界面

前端之家收集整理的这篇文章主要介绍了duilib——从XML文件中加载界面前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Duilib支持xml界面布局文件,使得界面设计与逻辑处理相分离。
需要以下几个步骤:
1、创建并初始化CPaintManagerUI对象。
2、创建CDialogBuilder对象,调用CDialogBuilder对象的Create函数加载xml界面布局文件,该函数返回界面元素根节点。使用UIDesigner工具编写xml界面布局文件
3、调用CPaintManagerUI的AttachDialog將界面元素根节点附加到CPaintManagerUI对象中。
实例:

//Helloworld.h

  1. #pragma once
  2.  
  3. #include "resource.h"
  4.  
  5. #include "COMUTIL.H"
  6. #include <UIlib.h>
  7. using namespace DuiLib;
  8.  
  9. #ifdef _DEBUG
  10. # ifdef _UNICODE
  11. # pragma comment(lib,"DuiLib_ud.lib")
  12. # else
  13. # pragma comment(lib,"DuiLib_d.lib")
  14. # endif
  15. #else
  16. # ifdef _UNICODE
  17. # pragma comment(lib,"DuiLib_u.lib")
  18. # else
  19. # pragma comment(lib,"DuiLib.lib")
  20. # endif
  21. #endif

//Helloworld.cpp

  1. #include "Helloworld.h"
  2.  
  3. class CDuiFrameWnd : public CWindowWnd,public INotifyUI
  4. {
  5. public:
  6. CDuiFrameWnd()
  7. {
  8. m_pRoot = NULL;
  9. m_pHelloBtn = NULL;
  10. };
  11. virtual LPCTSTR GetWindowClassName() const { return _T("DUIMainFrame"); }
  12. UINT GetClassStyle() const { return UI_CLASSSTYLE_FRAME | CS_DBLCLKS; };
  13. void OnFinalMessage(HWND /*hWnd*/) { delete this; };
  14.  
  15. virtual void Notify(TNotifyUI & msg)
  16. {
  17. if(msg.sType == _T("click"))
  18. {
  19. if (msg.pSender->GetName() == _T("btnHello"))
  20. {
  21. ::MessageBox(NULL,_T("我是按钮"),_T("点击了按钮"),NULL);
  22. }
  23. }
  24. }
  25.  
  26. virtual LRESULT HandleMessage(UINT uMsg,WPARAM wParam,LPARAM lParam)
  27. {
  28. LRESULT lRes = 0;
  29.  
  30. if( uMsg == WM_CREATE )
  31. {
  32. m_PaintManager.Init(m_hWnd);
  33. //从xml中加载界面
  34. CDialogBuilder builder;
  35. m_pRoot = builder.Create("main.xml",(UINT)0,NULL,&m_PaintManager);
  36. m_PaintManager.AttachDialog(m_pRoot);
  37. m_PaintManager.AddNotifier(this); //添加控件等消息响应,这样消息就会传达到duilib的消息循环
  38. m_pHelloBtn = m_PaintManager.FindControl(_T("btnHello"));
  39. if(m_pHelloBtn != NULL)
  40. {
  41. m_pHelloBtn->SetBorderSize(10);
  42. m_pHelloBtn->SetBkColor(0xff00ff00);
  43. }
  44.  
  45. return lRes;
  46. }
  47. else if(uMsg == WM_PAINT)
  48. {
  49.  
  50. }
  51. else if( uMsg == WM_DESTROY ) {
  52. ::PostQuitMessage(0L);
  53. }
  54. else if( uMsg == WM_ERASEBKGND ) {
  55. return 1;
  56. }
  57.  
  58. lRes = 0;
  59. if(m_PaintManager.MessageHandler(uMsg,wParam,lParam,lRes) )
  60. return lRes;
  61.  
  62. return CWindowWnd::HandleMessage(uMsg,lParam);
  63. }
  64.  
  65. protected:
  66. CPaintManagerUI m_PaintManager;
  67. CControlUI *m_pHelloBtn;
  68. CControlUI *m_pRoot;
  69. };
  70.  
  71.  
  72. int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
  73. {
  74. CPaintManagerUI::SetInstance(hInstance);
  75. CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath());
  76. HRESULT Hr = ::CoInitialize(NULL);
  77. if(Failed(Hr))
  78. return 0;
  79.  
  80. CDuiFrameWnd* pFrame = new CDuiFrameWnd();
  81. if( pFrame == NULL )
  82. return 0;
  83.  
  84. pFrame->Create(NULL,_T("简单测试demo-2"),UI_WNDSTYLE_FRAME,WS_EX_WINDOWEDGE);
  85. pFrame->CenterWindow();
  86. pFrame->ShowWindow(true);
  87. CPaintManagerUI::MessageLoop();
  88. ::CoUninitialize();
  89. return 0;
  90. }

猜你在找的XML相关文章