UIObject.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #include "stdafx.h"
  2. #include "UIObject.h"
  3. #include <map>
  4. #include "CCOS.Dev.Generator.RYGEN.h"
  5. using namespace std;
  6. using namespace CCOS::Dev::Detail::Generator;
  7. namespace nsGEN = CCOS::Dev::Detail::Generator;
  8. #define MAX_LOADSTRING 100
  9. TCHAR szTitle[MAX_LOADSTRING] = "GenRUIYING"; //标题栏文本
  10. TCHAR szWindowClass[MAX_LOADSTRING] = "GenRUIYING"; //主窗口类名
  11. ATOM MyRegisterClass(HINSTANCE hInstance); //注册窗口类
  12. BOOL InitInstance(HINSTANCE, int); //
  13. LRESULT CALLBACK WndTotalProc(HWND, UINT, WPARAM, LPARAM); //窗口函数
  14. map<HWND, UIObject*> g_UIObject_MAP; //消息处理窗口句柄集
  15. //注册窗口类
  16. ATOM MyRegisterClass()
  17. {
  18. WNDCLASSEX wcex;
  19. memset(&wcex, 0, sizeof(WNDCLASSEX));
  20. wcex.cbSize = sizeof(WNDCLASSEX); //窗口类内存大小
  21. wcex.style = CS_HREDRAW | CS_VREDRAW; //改变窗口大小则重画
  22. wcex.lpfnWndProc = WndTotalProc; //窗口函数为WndProc
  23. wcex.cbClsExtra = 0; //窗口类无扩展
  24. wcex.cbWndExtra = 0; //窗口示例无扩展
  25. wcex.hInstance = GetModuleHandle(NULL); //注册窗口类实例句柄
  26. //wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32UI)); //应用图标
  27. wcex.hCursor = LoadCursor(NULL, IDC_ARROW); //箭头光标
  28. wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); //白色背景
  29. //wcex.lpszMenuName = MAKEINTRESOURCE(IDC_WIN32UI); //菜单
  30. wcex.lpszClassName = szWindowClass; //窗口类名
  31. //wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); //
  32. return RegisterClassEx(&wcex); //注册窗口类
  33. }
  34. //调度消息函数
  35. void DispatchMsg()
  36. {
  37. MSG msg;
  38. // 主消息循环:
  39. while (GetMessage(&msg, NULL, 0, 0))
  40. {
  41. TranslateMessage(&msg); //消息转换
  42. DispatchMessage(&msg); //派送消息到窗口函数
  43. }
  44. }
  45. //创建窗口
  46. HWND CreateWnd(int nCmdShow)
  47. {
  48. HWND hWnd;
  49. hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
  50. CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, GetModuleHandle(NULL), NULL);
  51. if (hWnd)
  52. {
  53. ShowWindow(hWnd, nCmdShow); //显示窗口
  54. UpdateWindow(hWnd); //更新窗口客户区
  55. }
  56. return hWnd;
  57. }
  58. //窗口函数
  59. LRESULT CALLBACK WndTotalProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  60. {
  61. map<HWND, UIObject*>::iterator iter = g_UIObject_MAP.find(hWnd);
  62. if (iter != g_UIObject_MAP.end())
  63. {
  64. if (iter->second->m_pAdapter != nullptr && iter->second->m_hCallBackHandle != nullptr)
  65. {
  66. return iter->second->m_hCallBackHandle(iter->second->m_pAdapter,message, wParam, lParam);
  67. }
  68. }
  69. return DefWindowProc(hWnd, message, wParam, lParam);
  70. }
  71. //V2 UI类
  72. UIObject::UIObject()
  73. {
  74. }
  75. UIObject::~UIObject()
  76. {
  77. }
  78. //初始化
  79. void UIObject::Init(void* obj, tCallPredate func)
  80. {
  81. m_pAdapter = obj;
  82. m_hCallBackHandle = func;
  83. }
  84. //循环入口
  85. bool UIObject::Exec() //只会执行一次
  86. {
  87. //regist it
  88. g_UIObject_MAP[m_hWnd] = this;
  89. DispatchMsg();
  90. return false;
  91. }
  92. //开始线程
  93. bool UIObject::OnStartThread()
  94. {
  95. //创建UI窗口
  96. MyRegisterClass();
  97. #ifdef _DEBUG
  98. m_hWnd = CreateWnd(SW_SHOW);
  99. #else
  100. m_hWnd = CreateWnd(SW_HIDE);
  101. #endif
  102. return ((m_hWnd != 0));
  103. }
  104. //结束线程
  105. bool UIObject::OnEndThread()
  106. {
  107. //destroy ui
  108. if (m_hWnd)
  109. {
  110. DestroyWindow(m_hWnd);
  111. m_hWnd = 0;
  112. }
  113. return true;
  114. }
  115. //等待窗口创建成功
  116. bool UIObject::WaitAlive(DWORD Timeout)
  117. {
  118. while (Timeout > 0)
  119. {
  120. if (m_hWnd)
  121. {
  122. return true;
  123. }
  124. Sleep(200);
  125. if (Timeout > 200)
  126. {
  127. Timeout -= 200;
  128. }
  129. else
  130. {
  131. return false;
  132. }
  133. }
  134. return false;
  135. }
  136. //创建发生器对象连接
  137. bool UIObject::Create()
  138. {
  139. if (StartThread())
  140. {
  141. if (WaitAlive(5000))
  142. {
  143. return true;
  144. }
  145. StopThread(1000);
  146. }
  147. return false;
  148. }
  149. //获取UI窗口句柄
  150. HWND UIObject::GetUI()
  151. {
  152. return m_hWnd;
  153. }
  154. //销毁对象
  155. bool UIObject::Destrory()
  156. {
  157. PostMessage(m_hWnd, WM_CLOSE, 0, 0);
  158. StopThread(5000);
  159. m_hWnd = nullptr;
  160. return true;
  161. }