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