1 // Windows/Window.cpp
2 
3 #include "StdAfx.h"
4 
5 #ifndef _UNICODE
6 #include "../Common/StringConvert.h"
7 #endif
8 #include "Window.h"
9 
10 #ifndef _UNICODE
11 extern bool g_IsNT;
12 #endif
13 
14 namespace NWindows {
15 
16 #ifndef _UNICODE
MyRegisterClass(CONST WNDCLASSW * wndClass)17 ATOM MyRegisterClass(CONST WNDCLASSW *wndClass)
18 {
19   if (g_IsNT)
20     return RegisterClassW(wndClass);
21   WNDCLASSA wndClassA;
22   wndClassA.style = wndClass->style;
23   wndClassA.lpfnWndProc = wndClass->lpfnWndProc;
24   wndClassA.cbClsExtra = wndClass->cbClsExtra;
25   wndClassA.cbWndExtra = wndClass->cbWndExtra;
26   wndClassA.hInstance = wndClass->hInstance;
27   wndClassA.hIcon = wndClass->hIcon;
28   wndClassA.hCursor = wndClass->hCursor;
29   wndClassA.hbrBackground = wndClass->hbrBackground;
30   AString menuName;
31   AString className;
32   if (IS_INTRESOURCE(wndClass->lpszMenuName))
33     wndClassA.lpszMenuName = (LPCSTR)wndClass->lpszMenuName;
34   else
35   {
36     menuName = GetSystemString(wndClass->lpszMenuName);
37     wndClassA.lpszMenuName = menuName;
38   }
39   if (IS_INTRESOURCE(wndClass->lpszClassName))
40     wndClassA.lpszClassName = (LPCSTR)wndClass->lpszClassName;
41   else
42   {
43     className = GetSystemString(wndClass->lpszClassName);
44     wndClassA.lpszClassName = className;
45   }
46   return RegisterClassA(&wndClassA);
47 }
48 
Create(LPCWSTR className,LPCWSTR windowName,DWORD style,int x,int y,int width,int height,HWND parentWindow,HMENU idOrHMenu,HINSTANCE instance,LPVOID createParam)49 bool CWindow::Create(LPCWSTR className,
50       LPCWSTR windowName, DWORD style,
51       int x, int y, int width, int height,
52       HWND parentWindow, HMENU idOrHMenu,
53       HINSTANCE instance, LPVOID createParam)
54 {
55   if (g_IsNT)
56   {
57     _window = ::CreateWindowW(className, windowName,
58         style, x, y, width, height, parentWindow,
59         idOrHMenu, instance, createParam);
60      return (_window != NULL);
61   }
62   return Create(GetSystemString(className), GetSystemString(windowName),
63         style, x, y, width, height, parentWindow,
64         idOrHMenu, instance, createParam);
65 }
66 
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)67 bool CWindow::CreateEx(DWORD exStyle, LPCWSTR className,
68       LPCWSTR windowName, DWORD style,
69       int x, int y, int width, int height,
70       HWND parentWindow, HMENU idOrHMenu,
71       HINSTANCE instance, LPVOID createParam)
72 {
73   if (g_IsNT)
74   {
75     _window = ::CreateWindowExW(exStyle, className, windowName,
76       style, x, y, width, height, parentWindow,
77       idOrHMenu, instance, createParam);
78      return (_window != NULL);
79   }
80   AString classNameA;
81   LPCSTR classNameP;
82   if (IS_INTRESOURCE(className))
83     classNameP = (LPCSTR)className;
84   else
85   {
86     classNameA = GetSystemString(className);
87     classNameP = classNameA;
88   }
89   AString windowNameA;
90   LPCSTR windowNameP;
91   if (IS_INTRESOURCE(windowName))
92     windowNameP = (LPCSTR)windowName;
93   else
94   {
95     windowNameA = GetSystemString(windowName);
96     windowNameP = windowNameA;
97   }
98   return CreateEx(exStyle, classNameP, windowNameP,
99       style, x, y, width, height, parentWindow,
100       idOrHMenu, instance, createParam);
101 }
102 
103 #endif
104 
105 #ifndef _UNICODE
MySetWindowText(HWND wnd,LPCWSTR s)106 bool MySetWindowText(HWND wnd, LPCWSTR s)
107 {
108   if (g_IsNT)
109     return BOOLToBool(::SetWindowTextW(wnd, s));
110   return BOOLToBool(::SetWindowTextA(wnd, UnicodeStringToMultiByte(s)));
111 }
112 #endif
113 
GetText(CSysString & s)114 bool CWindow::GetText(CSysString &s)
115 {
116   s.Empty();
117   int len = GetTextLength();
118   if (len == 0)
119     return (::GetLastError() == ERROR_SUCCESS);
120   TCHAR *p = s.GetBuf(len);
121   {
122     int len2 = GetText(p, len + 1);
123     if (len > len2)
124       len = len2;
125   }
126   s.ReleaseBuf_CalcLen(len);
127   if (len == 0)
128     return (::GetLastError() == ERROR_SUCCESS);
129   return true;
130 }
131 
132 #ifndef _UNICODE
GetText(UString & s)133 bool CWindow::GetText(UString &s)
134 {
135   if (g_IsNT)
136   {
137     s.Empty();
138     int len = GetWindowTextLengthW(_window);
139     if (len == 0)
140       return (::GetLastError() == ERROR_SUCCESS);
141     wchar_t *p = s.GetBuf(len);
142     {
143       int len2 = GetWindowTextW(_window, p, len + 1);
144       if (len > len2)
145         len = len2;
146     }
147     s.ReleaseBuf_CalcLen(len);
148     if (len == 0)
149       return (::GetLastError() == ERROR_SUCCESS);
150     return true;
151   }
152   CSysString sysString;
153   bool result = GetText(sysString);
154   MultiByteToUnicodeString2(s, sysString);
155   return result;
156 }
157 #endif
158 
159 
160 /*
161 bool CWindow::ModifyStyleBase(int styleOffset,
162   DWORD remove, DWORD add, UINT flags)
163 {
164   DWORD style = GetWindowLong(styleOffset);
165   DWORD newStyle = (style & ~remove) | add;
166   if (style == newStyle)
167     return false; // it is not good
168 
169   SetWindowLong(styleOffset, newStyle);
170   if (flags != 0)
171   {
172     ::SetWindowPos(_window, NULL, 0, 0, 0, 0,
173       SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | flags);
174   }
175   return TRUE;
176 }
177 */
178 
179 }
180