#include "stdafx.h" #include "UIObject.h" #include #include "GEN_i.h" #include "CCOS.Dev.Generator.V2Adapter.h" using namespace std; using namespace CCOS::Dev::Detail::Generator; namespace nsGEN = CCOS::Dev::Detail::Generator; #define MAX_LOADSTRING 100 TCHAR szTitle[MAX_LOADSTRING] = "GenAdapterV2"; //标题栏文本 TCHAR szWindowClass[MAX_LOADSTRING] = "GenAdapterV2"; //主窗口类名 ATOM MyRegisterClass(HINSTANCE hInstance); //注册窗口类 BOOL InitInstance(HINSTANCE, int); // LRESULT CALLBACK WndTotalProc(HWND, UINT, WPARAM, LPARAM); //窗口函数 map g_UIObject_MAP; //消息处理窗口句柄集 //注册窗口类 ATOM MyRegisterClass() { WNDCLASSEX wcex; memset(&wcex, 0, sizeof(WNDCLASSEX)); wcex.cbSize = sizeof(WNDCLASSEX); //窗口类内存大小 wcex.style = CS_HREDRAW | CS_VREDRAW; //改变窗口大小则重画 wcex.lpfnWndProc = WndTotalProc; //窗口函数为WndProc wcex.cbClsExtra = 0; //窗口类无扩展 wcex.cbWndExtra = 0; //窗口示例无扩展 wcex.hInstance = GetModuleHandle(NULL); //注册窗口类实例句柄 //wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32UI)); //应用图标 wcex.hCursor = LoadCursor(NULL, IDC_ARROW); //箭头光标 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); //白色背景 //wcex.lpszMenuName = MAKEINTRESOURCE(IDC_WIN32UI); //菜单 wcex.lpszClassName = szWindowClass; //窗口类名 //wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); // return RegisterClassEx(&wcex); //注册窗口类 } //调度消息函数 void DispatchMsg() { MSG msg; // 主消息循环: while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); //消息转换 DispatchMessage(&msg); //派送消息到窗口函数 } } //创建窗口 HWND CreateWnd(int nCmdShow) { HWND hWnd; hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, GetModuleHandle(NULL), NULL); if (hWnd) { ShowWindow(hWnd, nCmdShow); //显示窗口 UpdateWindow(hWnd); //更新窗口客户区 } return hWnd; } //窗口函数 LRESULT CALLBACK WndTotalProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { map::iterator iter = g_UIObject_MAP.find(hWnd); if (iter != g_UIObject_MAP.end()) { if (iter->second->m_pAdapter != nullptr && iter->second->m_hCallBackHandle != nullptr) { return iter->second->m_hCallBackHandle(iter->second->m_pAdapter,message, wParam, lParam); } } return DefWindowProc(hWnd, message, wParam, lParam); } //V2 UI类 UIObject::UIObject() { } UIObject::~UIObject() { } //初始化 void UIObject::Init(void* obj, tCallPredate func) { m_pAdapter = obj; m_hCallBackHandle = func; } //循环入口 bool UIObject::Exec() //只会执行一次 { //regist it g_UIObject_MAP[m_hWnd] = this; DispatchMsg(); return false; } //开始线程 bool UIObject::OnStartThread() { //创建UI窗口 MyRegisterClass(); #ifdef _DEBUG m_hWnd = CreateWnd(SW_SHOW); #else m_hWnd = CreateWnd(SW_HIDE); #endif bool Init = false; if (m_hWnd) { Init = GEN_InitGen(m_hWnd); } return ((m_hWnd != 0) && (Init == true)); } //结束线程 bool UIObject::OnEndThread() { //destroy ui if (m_hWnd) { DestroyWindow(m_hWnd); m_hWnd = 0; } return true; } //等待窗口创建成功 bool UIObject::WaitAlive(DWORD Timeout) { while (Timeout > 0) { if (m_hWnd) { return true; } Sleep(200); if (Timeout > 200) { Timeout -= 200; } else { return false; } } return false; } //创建发生器对象连接 bool UIObject::Create() { if (StartThread()) { if (WaitAlive(5000)) { return true; } StopThread(1000); } return false; } //获取UI窗口句柄 HWND UIObject::GetUI() { return m_hWnd; } //销毁对象 bool UIObject::Destrory() { PostMessage(m_hWnd, WM_CLOSE, 0, 0); StopThread(5000); m_hWnd = nullptr; return true; }