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, (WPARAM)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   int 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