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
MyRegisterClass(CONST WNDCLASS * wndClass)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
MySetWindowText(HWND wnd,LPCWSTR s)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:
_window(newWindow)60 CWindow(HWND newWindow = NULL): _window(newWindow){};
61 CWindow& operator=(HWND newWindow)
62 {
63 _window = newWindow;
64 return *this;
65 }
HWND()66 operator HWND() const { return _window; }
Attach(HWND newWindow)67 void Attach(HWND newWindow) { _window = newWindow; }
Detach()68 HWND Detach()
69 {
70 HWND window = _window;
71 _window = NULL;
72 return window;
73 }
74
Foreground()75 bool Foreground() { return BOOLToBool(::SetForegroundWindow(_window)); }
76
GetParent()77 HWND GetParent() const { return ::GetParent(_window); }
GetWindowRect(LPRECT rect)78 bool GetWindowRect(LPRECT rect) const { return BOOLToBool(::GetWindowRect(_window,rect)); }
79 #ifndef UNDER_CE
IsZoomed()80 bool IsZoomed() const { return BOOLToBool(::IsZoomed(_window)); }
81 #endif
ClientToScreen(LPPOINT point)82 bool ClientToScreen(LPPOINT point) const { return BOOLToBool(::ClientToScreen(_window, point)); }
ScreenToClient(LPPOINT point)83 bool ScreenToClient(LPPOINT point) const { return BOOLToBool(::ScreenToClient(_window, point)); }
84
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)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
Create(LPCTSTR className,LPCTSTR windowName,DWORD style,int x,int y,int width,int height,HWND parentWindow,HMENU idOrHMenu,HINSTANCE instance,LPVOID createParam)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
Destroy()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 }
IsWindow()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
ChangeSubWindowSizeX(HWND hwnd,int xSize)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
ScreenToClient(RECT * rect)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
GetClientRect(LPRECT rect)163 bool GetClientRect(LPRECT rect) { return BOOLToBool(::GetClientRect(_window, rect)); }
Show(int cmdShow)164 bool Show(int cmdShow) { return BOOLToBool(::ShowWindow(_window, cmdShow)); }
Show_Bool(bool show)165 bool Show_Bool(bool show) { return Show(show ? SW_SHOW: SW_HIDE); }
166
167 #ifndef UNDER_CE
SetPlacement(CONST WINDOWPLACEMENT * placement)168 bool SetPlacement(CONST WINDOWPLACEMENT *placement) { return BOOLToBool(::SetWindowPlacement(_window, placement)); }
GetPlacement(WINDOWPLACEMENT * placement)169 bool GetPlacement(WINDOWPLACEMENT *placement) { return BOOLToBool(::GetWindowPlacement(_window, placement)); }
170 #endif
Update()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
SetStyle(LONG_PTR style)176 LONG_PTR SetStyle(LONG_PTR style) { return SetLongPtr(GWL_STYLE, style); }
GetStyle()177 LONG_PTR GetStyle() const { return GetLongPtr(GWL_STYLE); }
178 // bool MyIsMaximized() const { return ((GetStyle() & WS_MAXIMIZE) != 0); }
179
SetLong(int index,LONG newLongPtr)180 LONG_PTR SetLong(int index, LONG newLongPtr) { return ::SetWindowLong(_window, index, newLongPtr); }
GetLong(int index)181 LONG_PTR GetLong(int index) const { return ::GetWindowLong(_window, index); }
SetUserDataLong(LONG newLongPtr)182 LONG_PTR SetUserDataLong(LONG newLongPtr) { return SetLong(GWLP_USERDATA, newLongPtr); }
GetUserDataLong()183 LONG_PTR GetUserDataLong() const { return GetLong(GWLP_USERDATA); }
184
185
186 #ifdef UNDER_CE
187
SetLongPtr(int index,LONG_PTR newLongPtr)188 LONG_PTR SetLongPtr(int index, LONG_PTR newLongPtr) { return SetLong(index, newLongPtr); }
GetLongPtr(int index)189 LONG_PTR GetLongPtr(int index) const { return GetLong(index); }
190
SetUserDataLongPtr(LONG_PTR newLongPtr)191 LONG_PTR SetUserDataLongPtr(LONG_PTR newLongPtr) { return SetUserDataLong(newLongPtr); }
GetUserDataLongPtr()192 LONG_PTR GetUserDataLongPtr() const { return GetUserDataLong(); }
193
194 #else
195
SetLongPtr(int index,LONG_PTR newLongPtr)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
SetLongPtrW(int index,LONG_PTR newLongPtr)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
GetLongPtr(int index)211 LONG_PTR GetLongPtr(int index) const { return ::GetWindowLongPtr(_window, index); }
SetUserDataLongPtr(LONG_PTR newLongPtr)212 LONG_PTR SetUserDataLongPtr(LONG_PTR newLongPtr) { return SetLongPtr(GWLP_USERDATA, newLongPtr); }
GetUserDataLongPtr()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
SetFocus()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
SetText(LPCTSTR s)240 bool SetText(LPCTSTR s) { return BOOLToBool(::SetWindowText(_window, s)); }
241 #ifndef _UNICODE
SetText(LPCWSTR s)242 bool SetText(LPCWSTR s) { return MySetWindowText(_window, s); }
243 #endif
244
GetTextLength()245 int GetTextLength() const
246 { return GetWindowTextLength(_window); }
GetText(LPTSTR string,int maxCount)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
Enable(bool enable)258 bool Enable(bool enable)
259 { return BOOLToBool(::EnableWindow(_window, BoolToBOOL(enable))); }
260
IsEnabled()261 bool IsEnabled()
262 { return BOOLToBool(::IsWindowEnabled(_window)); }
263
264 #ifndef UNDER_CE
GetSystemMenu(bool revert)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); }
KillTimer(UINT_PTR idEvent)271 bool KillTimer(UINT_PTR idEvent)
272 {return BOOLToBool(::KillTimer(_window, idEvent)); }
273
SetIcon(WPARAM sizeType,HICON icon)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
IsKeyDown(int virtKey)280 inline bool IsKeyDown(int virtKey) { return (::GetKeyState(virtKey) & 0x8000) != 0; }
281
282 }
283
284 #endif
285