diff options
author | Igor Pavlov <87184205+ip7z@users.noreply.github.com> | 2021-12-27 00:00:00 +0000 |
---|---|---|
committer | Igor Pavlov <87184205+ip7z@users.noreply.github.com> | 2022-03-18 15:35:13 +0500 |
commit | f19f813537c7aea1c20749c914e756b54a9c3cf5 (patch) | |
tree | 816ba62ca7c0fa19f2eb46d9e9d6f7dd7c3a744d /CPP/Windows/Window.cpp | |
parent | 98e06a519b63b81986abe76d28887f6984a7732b (diff) | |
download | 7zip-21.07.tar.gz 7zip-21.07.tar.bz2 7zip-21.07.zip |
'21.07'21.07
Diffstat (limited to 'CPP/Windows/Window.cpp')
-rw-r--r-- | CPP/Windows/Window.cpp | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/CPP/Windows/Window.cpp b/CPP/Windows/Window.cpp new file mode 100644 index 0000000..32af4aa --- /dev/null +++ b/CPP/Windows/Window.cpp | |||
@@ -0,0 +1,179 @@ | |||
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 | ||
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 | |||
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 | |||
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 | ||
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 | |||
114 | bool CWindow::GetText(CSysString &s) | ||
115 | { | ||
116 | s.Empty(); | ||
117 | unsigned len = (unsigned)GetTextLength(); | ||
118 | if (len == 0) | ||
119 | return (::GetLastError() == ERROR_SUCCESS); | ||
120 | TCHAR *p = s.GetBuf(len); | ||
121 | { | ||
122 | unsigned len2 = (unsigned)GetText(p, (int)(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 | ||
133 | bool CWindow::GetText(UString &s) | ||
134 | { | ||
135 | if (g_IsNT) | ||
136 | { | ||
137 | s.Empty(); | ||
138 | unsigned len = (unsigned)GetWindowTextLengthW(_window); | ||
139 | if (len == 0) | ||
140 | return (::GetLastError() == ERROR_SUCCESS); | ||
141 | wchar_t *p = s.GetBuf(len); | ||
142 | { | ||
143 | unsigned len2 = (unsigned)GetWindowTextW(_window, p, (int)(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 | } | ||