1 // Windows/Window.h 2 3 #ifndef __WINDOWS_WINDOW_H 4 #define __WINDOWS_WINDOW_H 5 6 #include "../Common/MyWindows.h" 7 #include "../Common/MyString.h" 8 9 #include "Defs.h" 10 11 #ifndef UNDER_CE 12 13 #define MY__WM_CHANGEUISTATE 0x0127 14 #define MY__WM_UPDATEUISTATE 0x0128 15 #define MY__WM_QUERYUISTATE 0x0129 16 17 // LOWORD(wParam) values in WM_*UISTATE 18 #define MY__UIS_SET 1 19 #define MY__UIS_CLEAR 2 20 #define MY__UIS_INITIALIZE 3 21 22 // HIWORD(wParam) values in WM_*UISTATE 23 #define MY__UISF_HIDEFOCUS 0x1 24 #define MY__UISF_HIDEACCEL 0x2 25 #define MY__UISF_ACTIVE 0x4 26 27 #endif 28 29 namespace NWindows { 30 31 inline ATOM MyRegisterClass(CONST WNDCLASS *wndClass) 32 { return ::RegisterClass(wndClass); } 33 34 #ifndef _UNICODE 35 ATOM MyRegisterClass(CONST WNDCLASSW *wndClass); 36 #endif 37 38 #ifdef _UNICODE 39 inline bool MySetWindowText(HWND wnd, LPCWSTR s) { return BOOLToBool(::SetWindowText(wnd, s)); } 40 #else 41 bool MySetWindowText(HWND wnd, LPCWSTR s); 42 #endif 43 44 45 #ifdef UNDER_CE 46 #define GWLP_USERDATA GWL_USERDATA 47 #define GWLP_WNDPROC GWL_WNDPROC 48 #define BTNS_BUTTON TBSTYLE_BUTTON 49 #define WC_COMBOBOXW L"ComboBox" 50 #define DWLP_MSGRESULT DWL_MSGRESULT 51 #endif 52 53 class CWindow 54 { 55 private: 56 // bool ModifyStyleBase(int styleOffset, DWORD remove, DWORD add, UINT flags); 57 protected: 58 HWND _window; 59 public: 60 CWindow(HWND newWindow = NULL): _window(newWindow){}; 61 CWindow& operator=(HWND newWindow) 62 { 63 _window = newWindow; 64 return *this; 65 } 66 operator HWND() const { return _window; } 67 void Attach(HWND newWindow) { _window = newWindow; } 68 HWND Detach() 69 { 70 HWND window = _window; 71 _window = NULL; 72 return window; 73 } 74 75 bool Foreground() { return BOOLToBool(::SetForegroundWindow(_window)); } 76 77 HWND GetParent() const { return ::GetParent(_window); } 78 bool GetWindowRect(LPRECT rect) const { return BOOLToBool(::GetWindowRect(_window,rect)); } 79 #ifndef UNDER_CE 80 bool IsZoomed() const { return BOOLToBool(::IsZoomed(_window)); } 81 #endif 82 bool ClientToScreen(LPPOINT point) const { return BOOLToBool(::ClientToScreen(_window, point)); } 83 bool ScreenToClient(LPPOINT point) const { return BOOLToBool(::ScreenToClient(_window, point)); } 84 85 bool CreateEx(DWORD exStyle, LPCTSTR className, 86 LPCTSTR windowName, DWORD style, 87 int x, int y, int width, int height, 88 HWND parentWindow, HMENU idOrHMenu, 89 HINSTANCE instance, LPVOID createParam) 90 { 91 _window = ::CreateWindowEx(exStyle, className, windowName, 92 style, x, y, width, height, parentWindow, 93 idOrHMenu, instance, createParam); 94 return (_window != NULL); 95 } 96 97 bool Create(LPCTSTR className, 98 LPCTSTR windowName, DWORD style, 99 int x, int y, int width, int height, 100 HWND parentWindow, HMENU idOrHMenu, 101 HINSTANCE instance, LPVOID createParam) 102 { 103 _window = ::CreateWindow(className, windowName, 104 style, x, y, width, height, parentWindow, 105 idOrHMenu, instance, createParam); 106 return (_window != NULL); 107 } 108 109 #ifndef _UNICODE 110 bool Create(LPCWSTR className, 111 LPCWSTR windowName, DWORD style, 112 int x, int y, int width, int height, 113 HWND parentWindow, HMENU idOrHMenu, 114 HINSTANCE instance, LPVOID createParam); 115 bool CreateEx(DWORD exStyle, LPCWSTR className, 116 LPCWSTR windowName, DWORD style, 117 int x, int y, int width, int height, 118 HWND parentWindow, HMENU idOrHMenu, 119 HINSTANCE instance, LPVOID createParam); 120 #endif 121 122 123 bool Destroy() 124 { 125 if (_window == NULL) 126 return true; 127 bool result = BOOLToBool(::DestroyWindow(_window)); 128 if (result) 129 _window = NULL; 130 return result; 131 } 132 bool IsWindow() { return BOOLToBool(::IsWindow(_window)); } 133 bool Move(int x, int y, int width, int height, bool repaint = true) 134 { return BOOLToBool(::MoveWindow(_window, x, y, width, height, BoolToBOOL(repaint))); } 135 136 bool ChangeSubWindowSizeX(HWND hwnd, int xSize) 137 { 138 RECT rect; 139 ::GetWindowRect(hwnd, &rect); 140 POINT p1; 141 p1.x = rect.left; 142 p1.y = rect.top; 143 ScreenToClient(&p1); 144 return BOOLToBool(::MoveWindow(hwnd, p1.x, p1.y, xSize, rect.bottom - rect.top, TRUE)); 145 } 146 147 void ScreenToClient(RECT *rect) 148 { 149 POINT p1, p2; 150 p1.x = rect->left; 151 p1.y = rect->top; 152 p2.x = rect->right; 153 p2.y = rect->bottom; 154 ScreenToClient(&p1); 155 ScreenToClient(&p2); 156 157 rect->left = p1.x; 158 rect->top = p1.y; 159 rect->right = p2.x; 160 rect->bottom = p2.y; 161 } 162 163 bool GetClientRect(LPRECT rect) { return BOOLToBool(::GetClientRect(_window, rect)); } 164 bool Show(int cmdShow) { return BOOLToBool(::ShowWindow(_window, cmdShow)); } 165 bool Show_Bool(bool show) { return Show(show ? SW_SHOW: SW_HIDE); } 166 167 #ifndef UNDER_CE 168 bool SetPlacement(CONST WINDOWPLACEMENT *placement) { return BOOLToBool(::SetWindowPlacement(_window, placement)); } 169 bool GetPlacement(WINDOWPLACEMENT *placement) { return BOOLToBool(::GetWindowPlacement(_window, placement)); } 170 #endif 171 bool Update() { return BOOLToBool(::UpdateWindow(_window)); } 172 bool InvalidateRect(LPCRECT rect, bool backgroundErase = true) 173 { return BOOLToBool(::InvalidateRect(_window, rect, BoolToBOOL(backgroundErase))); } 174 void SetRedraw(bool redraw = true) { SendMsg(WM_SETREDRAW, BoolToBOOL(redraw), 0); } 175 176 LONG_PTR SetStyle(LONG_PTR style) { return SetLongPtr(GWL_STYLE, style); } 177 LONG_PTR GetStyle() const { return GetLongPtr(GWL_STYLE); } 178 // bool MyIsMaximized() const { return ((GetStyle() & WS_MAXIMIZE) != 0); } 179 180 LONG_PTR SetLong(int index, LONG newLongPtr) { return ::SetWindowLong(_window, index, newLongPtr); } 181 LONG_PTR GetLong(int index) const { return ::GetWindowLong(_window, index); } 182 LONG_PTR SetUserDataLong(LONG newLongPtr) { return SetLong(GWLP_USERDATA, newLongPtr); } 183 LONG_PTR GetUserDataLong() const { return GetLong(GWLP_USERDATA); } 184 185 186 #ifdef UNDER_CE 187 188 LONG_PTR SetLongPtr(int index, LONG_PTR newLongPtr) { return SetLong(index, newLongPtr); } 189 LONG_PTR GetLongPtr(int index) const { return GetLong(index); } 190 191 LONG_PTR SetUserDataLongPtr(LONG_PTR newLongPtr) { return SetUserDataLong(newLongPtr); } 192 LONG_PTR GetUserDataLongPtr() const { return GetUserDataLong(); } 193 194 #else 195 196 LONG_PTR SetLongPtr(int index, LONG_PTR newLongPtr) 197 { return ::SetWindowLongPtr(_window, index, 198 #ifndef _WIN64 199 (LONG) 200 #endif 201 newLongPtr); } 202 #ifndef _UNICODE 203 LONG_PTR SetLongPtrW(int index, LONG_PTR newLongPtr) 204 { return ::SetWindowLongPtrW(_window, index, 205 #ifndef _WIN64 206 (LONG) 207 #endif 208 newLongPtr); } 209 #endif 210 211 LONG_PTR GetLongPtr(int index) const { return ::GetWindowLongPtr(_window, index); } 212 LONG_PTR SetUserDataLongPtr(LONG_PTR newLongPtr) { return SetLongPtr(GWLP_USERDATA, newLongPtr); } 213 LONG_PTR GetUserDataLongPtr() const { return GetLongPtr(GWLP_USERDATA); } 214 215 #endif 216 217 /* 218 bool ModifyStyle(HWND hWnd, DWORD remove, DWORD add, UINT flags = 0) 219 { return ModifyStyleBase(GWL_STYLE, remove, add, flags); } 220 bool ModifyStyleEx(HWND hWnd, DWORD remove, DWORD add, UINT flags = 0) 221 { return ModifyStyleBase(GWL_EXSTYLE, remove, add, flags); } 222 */ 223 224 HWND SetFocus() { return ::SetFocus(_window); } 225 226 LRESULT SendMsg(UINT message, WPARAM wParam = 0, LPARAM lParam = 0) 227 { return ::SendMessage(_window, message, wParam, lParam); } 228 #ifndef _UNICODE 229 LRESULT SendMsgW(UINT message, WPARAM wParam = 0, LPARAM lParam = 0) 230 { return ::SendMessageW(_window, message, wParam, lParam); } 231 #endif 232 233 bool PostMsg(UINT message, WPARAM wParam = 0, LPARAM lParam = 0) 234 { return BOOLToBool(::PostMessage(_window, message, wParam, lParam)); } 235 #ifndef _UNICODE 236 bool PostMsgW(UINT message, WPARAM wParam = 0, LPARAM lParam = 0) 237 { return BOOLToBool(::PostMessageW(_window, message, wParam, lParam)); } 238 #endif 239 240 bool SetText(LPCTSTR s) { return BOOLToBool(::SetWindowText(_window, s)); } 241 #ifndef _UNICODE 242 bool SetText(LPCWSTR s) { return MySetWindowText(_window, s); } 243 #endif 244 245 int GetTextLength() const 246 { return GetWindowTextLength(_window); } 247 UINT GetText(LPTSTR string, int maxCount) const 248 { return GetWindowText(_window, string, maxCount); } 249 bool GetText(CSysString &s); 250 #ifndef _UNICODE 251 /* 252 UINT GetText(LPWSTR string, int maxCount) const 253 { return GetWindowTextW(_window, string, maxCount); } 254 */ 255 bool GetText(UString &s); 256 #endif 257 258 bool Enable(bool enable) 259 { return BOOLToBool(::EnableWindow(_window, BoolToBOOL(enable))); } 260 261 bool IsEnabled() 262 { return BOOLToBool(::IsWindowEnabled(_window)); } 263 264 #ifndef UNDER_CE 265 HMENU GetSystemMenu(bool revert) 266 { return ::GetSystemMenu(_window, BoolToBOOL(revert)); } 267 #endif 268 269 UINT_PTR SetTimer(UINT_PTR idEvent, UINT elapse, TIMERPROC timerFunc = 0) 270 { return ::SetTimer(_window, idEvent, elapse, timerFunc); } 271 bool KillTimer(UINT_PTR idEvent) 272 {return BOOLToBool(::KillTimer(_window, idEvent)); } 273 274 HICON SetIcon(WPARAM sizeType, HICON icon) { return (HICON)SendMsg(WM_SETICON, sizeType, (LPARAM)icon); } 275 }; 276 277 #define RECT_SIZE_X(r) ((r).right - (r).left) 278 #define RECT_SIZE_Y(r) ((r).bottom - (r).top) 279 280 inline bool IsKeyDown(int virtKey) { return (::GetKeyState(virtKey) & 0x8000) != 0; } 281 282 } 283 284 #endif 285