1// Windows/Window.h 2 3#ifndef ZIP7_INC_WINDOWS_WINDOW_H 4#define ZIP7_INC_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#ifdef WM_CHANGEUISTATE 13#define Z7_WIN_WM_CHANGEUISTATE WM_CHANGEUISTATE 14#define Z7_WIN_WM_UPDATEUISTATE WM_UPDATEUISTATE 15#define Z7_WIN_WM_QUERYUISTATE WM_QUERYUISTATE 16#else 17// these are defined for (_WIN32_WINNT >= 0x0500): 18#define Z7_WIN_WM_CHANGEUISTATE 0x0127 19#define Z7_WIN_WM_UPDATEUISTATE 0x0128 20#define Z7_WIN_WM_QUERYUISTATE 0x0129 21#endif 22 23#ifdef UIS_SET 24 25#define Z7_WIN_UIS_SET UIS_SET 26#define Z7_WIN_UIS_CLEAR UIS_CLEAR 27#define Z7_WIN_UIS_INITIALIZE UIS_INITIALIZE 28 29#define Z7_WIN_UISF_HIDEFOCUS UISF_HIDEFOCUS 30#define Z7_WIN_UISF_HIDEACCEL UISF_HIDEACCEL 31 32#else 33// these are defined for (_WIN32_WINNT >= 0x0500): 34// LOWORD(wParam) values in WM_*UISTATE 35#define Z7_WIN_UIS_SET 1 36#define Z7_WIN_UIS_CLEAR 2 37#define Z7_WIN_UIS_INITIALIZE 3 38 39// HIWORD(wParam) values in WM_*UISTATE 40#define Z7_WIN_UISF_HIDEFOCUS 0x1 41#define Z7_WIN_UISF_HIDEACCEL 0x2 42// defined for for (_WIN32_WINNT >= 0x0501): 43// #define Z7_WIN_UISF_ACTIVE 0x4 44 45#endif 46 47#endif // UNDER_CE 48 49 50#ifdef Z7_OLD_WIN_SDK 51 52// #define VK_OEM_1 0xBA // ';:' for US 53#define VK_OEM_PLUS 0xBB // '+' any country 54// #define VK_OEM_COMMA 0xBC // ',' any country 55#define VK_OEM_MINUS 0xBD // '-' any country 56// #define VK_OEM_PERIOD 0xBE // '.' any country 57// #define VK_OEM_2 0xBF // '/?' for US 58// #define VK_OEM_3 0xC0 // '`~' for US 59 60// #ifndef GWLP_USERDATA 61#define GWLP_WNDPROC (-4) 62#define GWLP_USERDATA (-21) 63// #endif 64#define DWLP_MSGRESULT 0 65// #define DWLP_DLGPROC DWLP_MSGRESULT + sizeof(LRESULT) 66// #define DWLP_USER DWLP_DLGPROC + sizeof(DLGPROC) 67 68#define BTNS_BUTTON TBSTYLE_BUTTON // 0x0000 69 70/* 71vc6 defines INT_PTR via long: 72 typedef long INT_PTR, *PINT_PTR; 73 typedef unsigned long UINT_PTR, *PUINT_PTR; 74but newer sdk (sdk2003+) defines INT_PTR via int: 75 typedef _W64 int INT_PTR, *PINT_PTR; 76 typedef _W64 unsigned int UINT_PTR, *PUINT_PTR; 77*/ 78 79#define IS_INTRESOURCE(_r) (((ULONG_PTR)(_r) >> 16) == 0) 80 81#define GetWindowLongPtrA GetWindowLongA 82#define GetWindowLongPtrW GetWindowLongW 83#ifdef UNICODE 84#define GetWindowLongPtr GetWindowLongPtrW 85#else 86#define GetWindowLongPtr GetWindowLongPtrA 87#endif // !UNICODE 88 89#define SetWindowLongPtrA SetWindowLongA 90#define SetWindowLongPtrW SetWindowLongW 91#ifdef UNICODE 92#define SetWindowLongPtr SetWindowLongPtrW 93#else 94#define SetWindowLongPtr SetWindowLongPtrA 95#endif // !UNICODE 96 97#define ListView_SetCheckState(hwndLV, i, fCheck) \ 98 ListView_SetItemState(hwndLV, i, INDEXTOSTATEIMAGEMASK((fCheck)?2:1), LVIS_STATEIMAGEMASK) 99 100#endif // Z7_OLD_WIN_SDK 101 102inline bool LRESULTToBool(LRESULT v) { return (v != FALSE); } 103 104#define MY_int_TO_WPARAM(i) ((WPARAM)(INT_PTR)(i)) 105 106namespace NWindows { 107 108inline ATOM MyRegisterClass(CONST WNDCLASS *wndClass) 109 { return ::RegisterClass(wndClass); } 110 111#ifndef _UNICODE 112ATOM MyRegisterClass(CONST WNDCLASSW *wndClass); 113#endif 114 115#ifdef _UNICODE 116inline bool MySetWindowText(HWND wnd, LPCWSTR s) { return BOOLToBool(::SetWindowText(wnd, s)); } 117#else 118bool MySetWindowText(HWND wnd, LPCWSTR s); 119#endif 120 121 122#ifdef UNDER_CE 123#define GWLP_USERDATA GWL_USERDATA 124#define GWLP_WNDPROC GWL_WNDPROC 125#define BTNS_BUTTON TBSTYLE_BUTTON 126#define WC_COMBOBOXW L"ComboBox" 127#define DWLP_MSGRESULT DWL_MSGRESULT 128#endif 129 130class CWindow 131{ 132 Z7_CLASS_NO_COPY(CWindow) 133private: 134 // bool ModifyStyleBase(int styleOffset, DWORD remove, DWORD add, UINT flags); 135protected: 136 HWND _window; 137public: 138 CWindow(HWND newWindow = NULL): _window(newWindow) {} 139 CWindow& operator=(HWND newWindow) 140 { 141 _window = newWindow; 142 return *this; 143 } 144 operator HWND() const { return _window; } 145 void Attach(HWND newWindow) { _window = newWindow; } 146 HWND Detach() 147 { 148 HWND window = _window; 149 _window = NULL; 150 return window; 151 } 152 153 bool Foreground() { return BOOLToBool(::SetForegroundWindow(_window)); } 154 155 HWND GetParent() const { return ::GetParent(_window); } 156 bool GetWindowRect(LPRECT rect) const { return BOOLToBool(::GetWindowRect(_window,rect)); } 157 #ifndef UNDER_CE 158 bool IsZoomed() const { return BOOLToBool(::IsZoomed(_window)); } 159 #endif 160 bool ClientToScreen(LPPOINT point) const { return BOOLToBool(::ClientToScreen(_window, point)); } 161 bool ScreenToClient(LPPOINT point) const { return BOOLToBool(::ScreenToClient(_window, point)); } 162 163 bool CreateEx(DWORD exStyle, LPCTSTR className, 164 LPCTSTR windowName, DWORD style, 165 int x, int y, int width, int height, 166 HWND parentWindow, HMENU idOrHMenu, 167 HINSTANCE instance, LPVOID createParam) 168 { 169 _window = ::CreateWindowEx(exStyle, className, windowName, 170 style, x, y, width, height, parentWindow, 171 idOrHMenu, instance, createParam); 172 return (_window != NULL); 173 } 174 175 bool Create(LPCTSTR className, 176 LPCTSTR windowName, DWORD style, 177 int x, int y, int width, int height, 178 HWND parentWindow, HMENU idOrHMenu, 179 HINSTANCE instance, LPVOID createParam) 180 { 181 _window = ::CreateWindow(className, windowName, 182 style, x, y, width, height, parentWindow, 183 idOrHMenu, instance, createParam); 184 return (_window != NULL); 185 } 186 187 #ifndef _UNICODE 188 bool Create(LPCWSTR className, 189 LPCWSTR windowName, DWORD style, 190 int x, int y, int width, int height, 191 HWND parentWindow, HMENU idOrHMenu, 192 HINSTANCE instance, LPVOID createParam); 193 bool CreateEx(DWORD exStyle, LPCWSTR className, 194 LPCWSTR windowName, DWORD style, 195 int x, int y, int width, int height, 196 HWND parentWindow, HMENU idOrHMenu, 197 HINSTANCE instance, LPVOID createParam); 198 #endif 199 200 201 bool Destroy() 202 { 203 if (_window == NULL) 204 return true; 205 bool result = BOOLToBool(::DestroyWindow(_window)); 206 if (result) 207 _window = NULL; 208 return result; 209 } 210 bool IsWindow() { return BOOLToBool(::IsWindow(_window)); } 211 bool Move(int x, int y, int width, int height, bool repaint = true) 212 { return BOOLToBool(::MoveWindow(_window, x, y, width, height, BoolToBOOL(repaint))); } 213 214 bool ChangeSubWindowSizeX(HWND hwnd, int xSize) 215 { 216 RECT rect; 217 ::GetWindowRect(hwnd, &rect); 218 POINT p1; 219 p1.x = rect.left; 220 p1.y = rect.top; 221 ScreenToClient(&p1); 222 return BOOLToBool(::MoveWindow(hwnd, p1.x, p1.y, xSize, rect.bottom - rect.top, TRUE)); 223 } 224 225 void ScreenToClient(RECT *rect) 226 { 227 POINT p1, p2; 228 p1.x = rect->left; 229 p1.y = rect->top; 230 p2.x = rect->right; 231 p2.y = rect->bottom; 232 ScreenToClient(&p1); 233 ScreenToClient(&p2); 234 235 rect->left = p1.x; 236 rect->top = p1.y; 237 rect->right = p2.x; 238 rect->bottom = p2.y; 239 } 240 241 bool GetClientRect(LPRECT rect) { return BOOLToBool(::GetClientRect(_window, rect)); } 242 bool Show(int cmdShow) { return BOOLToBool(::ShowWindow(_window, cmdShow)); } 243 bool Show_Bool(bool show) { return Show(show ? SW_SHOW: SW_HIDE); } 244 245 #ifndef UNDER_CE 246 bool SetPlacement(CONST WINDOWPLACEMENT *placement) { return BOOLToBool(::SetWindowPlacement(_window, placement)); } 247 bool GetPlacement(WINDOWPLACEMENT *placement) { return BOOLToBool(::GetWindowPlacement(_window, placement)); } 248 #endif 249 bool Update() { return BOOLToBool(::UpdateWindow(_window)); } 250 bool InvalidateRect(LPCRECT rect, bool backgroundErase = true) 251 { return BOOLToBool(::InvalidateRect(_window, rect, BoolToBOOL(backgroundErase))); } 252 void SetRedraw(bool redraw = true) { SendMsg(WM_SETREDRAW, (WPARAM)BoolToBOOL(redraw), 0); } 253 254 LONG_PTR SetStyle(LONG_PTR style) { return SetLongPtr(GWL_STYLE, style); } 255 // LONG_PTR SetStyle(DWORD style) { return SetLongPtr(GWL_STYLE, (LONG_PTR)style); } 256 LONG_PTR GetStyle() const { return GetLongPtr(GWL_STYLE); } 257 // bool MyIsMaximized() const { return ((GetStyle() & WS_MAXIMIZE) != 0); } 258 259 LONG_PTR SetLong(int index, LONG newLongPtr) { return ::SetWindowLong(_window, index, newLongPtr); } 260 LONG_PTR GetLong(int index) const { return ::GetWindowLong(_window, index); } 261 LONG_PTR SetUserDataLong(LONG newLongPtr) { return SetLong(GWLP_USERDATA, newLongPtr); } 262 LONG_PTR GetUserDataLong() const { return GetLong(GWLP_USERDATA); } 263 264 265 #ifdef UNDER_CE 266 267 LONG_PTR SetLongPtr(int index, LONG_PTR newLongPtr) { return SetLong(index, newLongPtr); } 268 LONG_PTR GetLongPtr(int index) const { return GetLong(index); } 269 270 LONG_PTR SetUserDataLongPtr(LONG_PTR newLongPtr) { return SetUserDataLong(newLongPtr); } 271 LONG_PTR GetUserDataLongPtr() const { return GetUserDataLong(); } 272 273 #else 274 275 LONG_PTR SetLongPtr(int index, LONG_PTR newLongPtr) 276 { return ::SetWindowLongPtr(_window, index, 277 #ifndef _WIN64 278 (LONG) 279 #endif 280 newLongPtr); } 281 #ifndef _UNICODE 282 LONG_PTR SetLongPtrW(int index, LONG_PTR newLongPtr) 283 { return ::SetWindowLongPtrW(_window, index, 284 #ifndef _WIN64 285 (LONG) 286 #endif 287 newLongPtr); } 288 #endif 289 290 LONG_PTR GetLongPtr(int index) const { return ::GetWindowLongPtr(_window, index); } 291 LONG_PTR SetUserDataLongPtr(LONG_PTR newLongPtr) { return SetLongPtr(GWLP_USERDATA, newLongPtr); } 292 LONG_PTR GetUserDataLongPtr() const { return GetLongPtr(GWLP_USERDATA); } 293 294 #endif 295 296 /* 297 bool ModifyStyle(HWND hWnd, DWORD remove, DWORD add, UINT flags = 0) 298 { return ModifyStyleBase(GWL_STYLE, remove, add, flags); } 299 bool ModifyStyleEx(HWND hWnd, DWORD remove, DWORD add, UINT flags = 0) 300 { return ModifyStyleBase(GWL_EXSTYLE, remove, add, flags); } 301 */ 302 303 HWND SetFocus() { return ::SetFocus(_window); } 304 305 LRESULT SendMsg(UINT message, WPARAM wParam = 0, LPARAM lParam = 0) 306 { return ::SendMessage(_window, message, wParam, lParam); } 307 #ifndef _UNICODE 308 LRESULT SendMsgW(UINT message, WPARAM wParam = 0, LPARAM lParam = 0) 309 { return ::SendMessageW(_window, message, wParam, lParam); } 310 #endif 311 312 bool PostMsg(UINT message, WPARAM wParam = 0, LPARAM lParam = 0) 313 { return BOOLToBool(::PostMessage(_window, message, wParam, lParam)); } 314 #ifndef _UNICODE 315 bool PostMsgW(UINT message, WPARAM wParam = 0, LPARAM lParam = 0) 316 { return BOOLToBool(::PostMessageW(_window, message, wParam, lParam)); } 317 #endif 318 319 bool SetText(LPCTSTR s) { return BOOLToBool(::SetWindowText(_window, s)); } 320 #ifndef _UNICODE 321 bool SetText(LPCWSTR s) { return MySetWindowText(_window, s); } 322 #endif 323 324 int GetTextLength() const 325 { return GetWindowTextLength(_window); } 326 int GetText(LPTSTR string, int maxCount) const 327 { return GetWindowText(_window, string, maxCount); } 328 bool GetText(CSysString &s) const; 329 #ifndef _UNICODE 330 /* 331 UINT GetText(LPWSTR string, int maxCount) const 332 { return GetWindowTextW(_window, string, maxCount); } 333 */ 334 bool GetText(UString &s) const; 335 #endif 336 337 bool Enable(bool enable) 338 { return BOOLToBool(::EnableWindow(_window, BoolToBOOL(enable))); } 339 340 bool IsEnabled() const 341 { return BOOLToBool(::IsWindowEnabled(_window)); } 342 343 #ifndef UNDER_CE 344 HMENU GetSystemMenu(bool revert) 345 { return ::GetSystemMenu(_window, BoolToBOOL(revert)); } 346 #endif 347 348 UINT_PTR SetTimer(UINT_PTR idEvent, UINT elapse, TIMERPROC timerFunc = NULL) 349 { return ::SetTimer(_window, idEvent, elapse, timerFunc); } 350 bool KillTimer(UINT_PTR idEvent) 351 {return BOOLToBool(::KillTimer(_window, idEvent)); } 352 353 HICON SetIcon(WPARAM sizeType, HICON icon) { return (HICON)SendMsg(WM_SETICON, sizeType, (LPARAM)icon); } 354}; 355 356#define RECT_SIZE_X(r) ((r).right - (r).left) 357#define RECT_SIZE_Y(r) ((r).bottom - (r).top) 358 359inline bool IsKeyDown(int virtKey) { return (::GetKeyState(virtKey) & 0x8000) != 0; } 360 361} 362 363#endif 364