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