UIObject.cpp 4.2 KB

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