1cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky// Windows/Control/Window2.cpp 2cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 3cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "StdAfx.h" 4cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 5cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#ifndef _UNICODE 6cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "../../Common/StringConvert.h" 7cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#endif 8cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 9cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "Window2.h" 10cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 11cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#ifndef _UNICODE 12cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyextern bool g_IsNT; 13cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#endif 14cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 15cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckynamespace NWindows { 16cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 17cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#ifndef _UNICODE 18cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyATOM MyRegisterClass(CONST WNDCLASSW *wndClass); 19cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#endif 20cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 21cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckynamespace NControl { 22cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 23cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#ifdef UNDER_CE 24cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#define MY_START_WM_CREATE WM_CREATE 25cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#else 26cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#define MY_START_WM_CREATE WM_NCCREATE 27cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#endif 28cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 29cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystatic LRESULT CALLBACK WindowProcedure(HWND aHWND, UINT message, WPARAM wParam, LPARAM lParam) 30cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 31cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CWindow tempWindow(aHWND); 32cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (message == MY_START_WM_CREATE) 33cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky tempWindow.SetUserDataLongPtr((LONG_PTR)(((LPCREATESTRUCT)lParam)->lpCreateParams)); 34cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CWindow2 *window = (CWindow2 *)(tempWindow.GetUserDataLongPtr()); 35cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (window != NULL && message == MY_START_WM_CREATE) 36cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky window->Attach(aHWND); 37cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (window == 0) 38cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 39cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky #ifndef _UNICODE 40cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (g_IsNT) 41cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return DefWindowProcW(aHWND, message, wParam, lParam); 42cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky else 43cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky #endif 44cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return DefWindowProc(aHWND, message, wParam, lParam); 45cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 46cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return window->OnMessage(message, wParam, lParam); 47cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 48cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 49cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckybool CWindow2::CreateEx(DWORD exStyle, LPCTSTR className, LPCTSTR windowName, 50cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky DWORD style, int x, int y, int width, int height, 51cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky HWND parentWindow, HMENU idOrHMenu, HINSTANCE instance) 52cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 53cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky WNDCLASS wc; 54cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (!::GetClassInfo(instance, className, &wc)) 55cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 56cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky // wc.style = CS_HREDRAW | CS_VREDRAW; 57cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky wc.style = 0; 58cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky wc.lpfnWndProc = WindowProcedure; 59cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky wc.cbClsExtra = 0; 60cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky wc.cbWndExtra = 0; 61cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky wc.hInstance = instance; 62cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky wc.hIcon = NULL; 63cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky wc.hCursor = LoadCursor(NULL, IDC_ARROW); 64cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); 65cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky wc.lpszMenuName = NULL; 66cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky wc.lpszClassName = className; 67cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (::RegisterClass(&wc) == 0) 68cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return false; 69cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 70cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return CWindow::CreateEx(exStyle, className, windowName, style, 71cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky x, y, width, height, parentWindow, idOrHMenu, instance, this); 72cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 73cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 74cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#ifndef _UNICODE 75cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 76cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckybool CWindow2::CreateEx(DWORD exStyle, LPCWSTR className, LPCWSTR windowName, 77cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky DWORD style, int x, int y, int width, int height, 78cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky HWND parentWindow, HMENU idOrHMenu, HINSTANCE instance) 79cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 80cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky bool needRegister; 81cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (g_IsNT) 82cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 83cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky WNDCLASSW wc; 84cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky needRegister = ::GetClassInfoW(instance, className, &wc) == 0; 85cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 86cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky else 87cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 88cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky WNDCLASSA windowClassA; 89cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky AString classNameA; 90cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky LPCSTR classNameP; 91cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (IS_INTRESOURCE(className)) 92cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky classNameP = (LPCSTR)className; 93cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky else 94cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 95cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky classNameA = GetSystemString(className); 96cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky classNameP = classNameA; 97cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 98cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky needRegister = ::GetClassInfoA(instance, classNameP, &windowClassA) == 0; 99cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 100cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (needRegister) 101cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 102cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky WNDCLASSW wc; 103cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky // wc.style = CS_HREDRAW | CS_VREDRAW; 104cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky wc.style = 0; 105cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky wc.lpfnWndProc = WindowProcedure; 106cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky wc.cbClsExtra = 0; 107cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky wc.cbWndExtra = 0; 108cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky wc.hInstance = instance; 109cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky wc.hIcon = NULL; 110cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky wc.hCursor = LoadCursor(NULL, IDC_ARROW); 111cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); 112cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky wc.lpszMenuName = NULL; 113cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky wc.lpszClassName = className; 114cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (MyRegisterClass(&wc) == 0) 115cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return false; 116cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 117cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return CWindow::CreateEx(exStyle, className, windowName, style, 118cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky x, y, width, height, parentWindow, idOrHMenu, instance, this); 119cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 120cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 121cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#endif 122cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 123cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyLRESULT CWindow2::DefProc(UINT message, WPARAM wParam, LPARAM lParam) 124cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 125cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky #ifndef _UNICODE 126cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (g_IsNT) 127cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return DefWindowProcW(_window, message, wParam, lParam); 128cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky else 129cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky #endif 130cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return DefWindowProc(_window, message, wParam, lParam); 131cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 132cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 133cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyLRESULT CWindow2::OnMessage(UINT message, WPARAM wParam, LPARAM lParam) 134cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 135cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky LRESULT result; 136cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky switch (message) 137cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 138cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky case WM_CREATE: 139cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (!OnCreate((CREATESTRUCT *)lParam)) 140cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return -1; 141cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky break; 142cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky case WM_COMMAND: 143cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (OnCommand(wParam, lParam, result)) 144cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return result; 145cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky break; 146cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky case WM_NOTIFY: 147cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (OnNotify((UINT)wParam, (LPNMHDR) lParam, result)) 148cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return result; 149cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky break; 150cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky case WM_DESTROY: 151cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky OnDestroy(); 152cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky break; 153cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky case WM_CLOSE: 154cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky OnClose(); 155cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return 0; 156cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky case WM_SIZE: 157cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (OnSize(wParam, LOWORD(lParam), HIWORD(lParam))) 158cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return 0; 159cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 160cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return DefProc(message, wParam, lParam); 161cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 162cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 163cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckybool CWindow2::OnCommand(WPARAM wParam, LPARAM lParam, LRESULT &result) 164cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 165cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return OnCommand(HIWORD(wParam), LOWORD(wParam), lParam, result); 166cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 167cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 168cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckybool CWindow2::OnCommand(int /* code */, int /* itemID */, LPARAM /* lParam */, LRESULT & /* result */) 169cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 170cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return false; 171cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky // return DefProc(message, wParam, lParam); 172cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky /* 173cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (code == BN_CLICKED) 174cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return OnButtonClicked(itemID, (HWND)lParam); 175cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky */ 176cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 177cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 178cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky/* 179cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckybool CDialog::OnButtonClicked(int buttonID, HWND buttonHWND) 180cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 181cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky switch(aButtonID) 182cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 183cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky case IDOK: 184cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky OnOK(); 185cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky break; 186cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky case IDCANCEL: 187cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky OnCancel(); 188cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky break; 189cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky case IDHELP: 190cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky OnHelp(); 191cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky break; 192cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky default: 193cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return false; 194cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 195cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return true; 196cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 197cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 198cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky*/ 199cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 200cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}} 201