// Windows/Control/Window2.cpp #include "StdAfx.h" #ifndef _UNICODE #include "../../Common/StringConvert.h" #endif #include "Window2.h" #ifndef _UNICODE extern bool g_IsNT; #endif namespace NWindows { #ifndef _UNICODE ATOM MyRegisterClass(CONST WNDCLASSW *wndClass); #endif namespace NControl { #ifdef UNDER_CE #define MY_START_WM_CREATE WM_CREATE #else #define MY_START_WM_CREATE WM_NCCREATE #endif static LRESULT CALLBACK WindowProcedure(HWND aHWND, UINT message, WPARAM wParam, LPARAM lParam) { CWindow tempWindow(aHWND); if (message == MY_START_WM_CREATE) tempWindow.SetUserDataLongPtr((LONG_PTR)(((LPCREATESTRUCT)lParam)->lpCreateParams)); CWindow2 *window = (CWindow2 *)(tempWindow.GetUserDataLongPtr()); if (window != NULL && message == MY_START_WM_CREATE) window->Attach(aHWND); if (window == 0) { #ifndef _UNICODE if (g_IsNT) return DefWindowProcW(aHWND, message, wParam, lParam); else #endif return DefWindowProc(aHWND, message, wParam, lParam); } return window->OnMessage(message, wParam, lParam); } bool CWindow2::CreateEx(DWORD exStyle, LPCTSTR className, LPCTSTR windowName, DWORD style, int x, int y, int width, int height, HWND parentWindow, HMENU idOrHMenu, HINSTANCE instance) { WNDCLASS wc; if (!::GetClassInfo(instance, className, &wc)) { // wc.style = CS_HREDRAW | CS_VREDRAW; wc.style = 0; wc.lpfnWndProc = WindowProcedure; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = instance; wc.hIcon = NULL; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wc.lpszMenuName = NULL; wc.lpszClassName = className; if (::RegisterClass(&wc) == 0) return false; } return CWindow::CreateEx(exStyle, className, windowName, style, x, y, width, height, parentWindow, idOrHMenu, instance, this); } #ifndef _UNICODE bool CWindow2::CreateEx(DWORD exStyle, LPCWSTR className, LPCWSTR windowName, DWORD style, int x, int y, int width, int height, HWND parentWindow, HMENU idOrHMenu, HINSTANCE instance) { bool needRegister; if (g_IsNT) { WNDCLASSW wc; needRegister = ::GetClassInfoW(instance, className, &wc) == 0; } else { WNDCLASSA windowClassA; AString classNameA; LPCSTR classNameP; if (IS_INTRESOURCE(className)) classNameP = (LPCSTR)className; else { classNameA = GetSystemString(className); classNameP = classNameA; } needRegister = ::GetClassInfoA(instance, classNameP, &windowClassA) == 0; } if (needRegister) { WNDCLASSW wc; // wc.style = CS_HREDRAW | CS_VREDRAW; wc.style = 0; wc.lpfnWndProc = WindowProcedure; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = instance; wc.hIcon = NULL; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wc.lpszMenuName = NULL; wc.lpszClassName = className; if (MyRegisterClass(&wc) == 0) return false; } return CWindow::CreateEx(exStyle, className, windowName, style, x, y, width, height, parentWindow, idOrHMenu, instance, this); } #endif LRESULT CWindow2::DefProc(UINT message, WPARAM wParam, LPARAM lParam) { #ifndef _UNICODE if (g_IsNT) return DefWindowProcW(_window, message, wParam, lParam); else #endif return DefWindowProc(_window, message, wParam, lParam); } LRESULT CWindow2::OnMessage(UINT message, WPARAM wParam, LPARAM lParam) { LRESULT result; switch (message) { case WM_CREATE: if (!OnCreate((CREATESTRUCT *)lParam)) return -1; break; case WM_COMMAND: if (OnCommand(wParam, lParam, result)) return result; break; case WM_NOTIFY: if (OnNotify((UINT)wParam, (LPNMHDR) lParam, result)) return result; break; case WM_DESTROY: OnDestroy(); break; case WM_CLOSE: OnClose(); return 0; case WM_SIZE: if (OnSize(wParam, LOWORD(lParam), HIWORD(lParam))) return 0; } return DefProc(message, wParam, lParam); } bool CWindow2::OnCommand(WPARAM wParam, LPARAM lParam, LRESULT &result) { return OnCommand(HIWORD(wParam), LOWORD(wParam), lParam, result); } bool CWindow2::OnCommand(int /* code */, int /* itemID */, LPARAM /* lParam */, LRESULT & /* result */) { return false; // return DefProc(message, wParam, lParam); /* if (code == BN_CLICKED) return OnButtonClicked(itemID, (HWND)lParam); */ } /* bool CDialog::OnButtonClicked(int buttonID, HWND buttonHWND) { switch (buttonID) { case IDOK: OnOK(); break; case IDCANCEL: OnCancel(); break; case IDHELP: OnHelp(); break; default: return false; } return true; } */ }}