merge trunk head (37902)
[reactos.git] / rostests / winetests / GUI / misc.c
1 /*
2 * PROJECT: ReactOS API Test GUI
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE:
5 * PURPOSE: miscallanous functions
6 * COPYRIGHT: Copyright 2005 Thomas Weidenmueller <w3seek@reactos.org>
7 * Copyright 2006 - 2008 Ged Murphy <gedmurphy@gmail.com>
8 *
9 */
10
11 #include <precomp.h>
12
13 static INT
14 LengthOfStrResource(IN HINSTANCE hInst,
15 IN UINT uID)
16 {
17 HRSRC hrSrc;
18 HGLOBAL hRes;
19 LPWSTR lpName, lpStr;
20
21 if (hInst == NULL)
22 {
23 return -1;
24 }
25
26 /* There are always blocks of 16 strings */
27 lpName = (LPWSTR)MAKEINTRESOURCEW((uID >> 4) + 1);
28
29 /* Find the string table block */
30 if ((hrSrc = FindResourceW(hInst, lpName, (LPWSTR)RT_STRING)) &&
31 (hRes = LoadResource(hInst, hrSrc)) &&
32 (lpStr = (WCHAR*) LockResource(hRes)))
33 {
34 UINT x;
35
36 /* Find the string we're looking for */
37 uID &= 0xF; /* position in the block, same as % 16 */
38 for (x = 0; x < uID; x++)
39 {
40 lpStr += (*lpStr) + 1;
41 }
42
43 /* Found the string */
44 return (int)(*lpStr);
45 }
46 return -1;
47 }
48
49 INT
50 AllocAndLoadString(OUT LPWSTR *lpTarget,
51 IN HINSTANCE hInst,
52 IN UINT uID)
53 {
54 INT ln;
55
56 ln = LengthOfStrResource(hInst,
57 uID);
58 if (ln++ > 0)
59 {
60 (*lpTarget) = (LPTSTR)LocalAlloc(LMEM_FIXED,
61 ln * sizeof(TCHAR));
62 if ((*lpTarget) != NULL)
63 {
64 INT Ret;
65 if (!(Ret = LoadStringW(hInst, uID, *lpTarget, ln)))
66 {
67 LocalFree((HLOCAL)(*lpTarget));
68 }
69 return Ret;
70 }
71 }
72 return 0;
73 }
74
75 DWORD
76 LoadAndFormatString(IN HINSTANCE hInstance,
77 IN UINT uID,
78 OUT LPWSTR *lpTarget,
79 ...)
80 {
81 DWORD Ret = 0;
82 LPTSTR lpFormat;
83 va_list lArgs;
84
85 if (AllocAndLoadString(&lpFormat,
86 hInstance,
87 uID) > 0)
88 {
89 va_start(lArgs, lpTarget);
90 /* let's use Format to format it because it has the ability to allocate
91 memory automatically */
92 Ret = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING,
93 lpFormat,
94 0,
95 0,
96 (LPTSTR)lpTarget,
97 0,
98 &lArgs);
99 va_end(lArgs);
100
101 LocalFree((HLOCAL)lpFormat);
102 }
103
104 return Ret;
105 }
106
107 BOOL
108 StatusBarLoadAndFormatString(IN HWND hStatusBar,
109 IN INT PartId,
110 IN HINSTANCE hInstance,
111 IN UINT uID,
112 ...)
113 {
114 BOOL Ret = FALSE;
115 LPWSTR lpFormat, lpStr;
116 va_list lArgs;
117
118 if (AllocAndLoadString(&lpFormat,
119 hInstance,
120 uID) > 0)
121 {
122 va_start(lArgs, uID);
123 /* let's use FormatMessage to format it because it has the ability to allocate
124 memory automatically */
125 Ret = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING,
126 lpFormat,
127 0,
128 0,
129 (VOID*)&lpStr,
130 0,
131 &lArgs);
132 va_end(lArgs);
133
134 if (lpStr != NULL)
135 {
136 Ret = (BOOL)SendMessageW(hStatusBar,
137 SB_SETTEXT,
138 (WPARAM)PartId,
139 (LPARAM)lpStr);
140 LocalFree((HLOCAL)lpStr);
141 }
142
143 LocalFree((HLOCAL)lpFormat);
144 }
145
146 return Ret;
147 }
148
149 BOOL
150 StatusBarLoadString(IN HWND hStatusBar,
151 IN INT PartId,
152 IN HINSTANCE hInstance,
153 IN UINT uID)
154 {
155 BOOL Ret = FALSE;
156 LPWSTR lpStr;
157
158 if (AllocAndLoadString(&lpStr,
159 hInstance,
160 uID) > 0)
161 {
162 Ret = (BOOL)SendMessageW(hStatusBar,
163 SB_SETTEXT,
164 (WPARAM)PartId,
165 (LPARAM)lpStr);
166 LocalFree((HLOCAL)lpStr);
167 }
168
169 return Ret;
170 }
171
172
173 INT
174 GetTextFromEdit(OUT LPWSTR lpString,
175 IN HWND hDlg,
176 IN UINT Res)
177 {
178 INT len = GetWindowTextLengthW(GetDlgItem(hDlg, Res));
179 if(len > 0)
180 {
181 GetDlgItemTextW(hDlg,
182 Res,
183 lpString,
184 len + 1);
185 }
186 else
187 lpString = NULL;
188
189 return len;
190 }
191
192 VOID DisplayError(INT err)
193 {
194 LPWSTR lpMsgBuf = NULL;
195
196 FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |
197 FORMAT_MESSAGE_FROM_SYSTEM |
198 FORMAT_MESSAGE_IGNORE_INSERTS,
199 NULL,
200 err,
201 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
202 (VOID*)&lpMsgBuf,
203 0,
204 NULL );
205
206 MessageBoxW(NULL, lpMsgBuf, L"Error!", MB_OK | MB_ICONERROR);
207
208 LocalFree(lpMsgBuf);
209 }
210
211 VOID DisplayMessage(LPWSTR lpMsg)
212 {
213 MessageBoxW(NULL, lpMsg, L"Note!", MB_ICONEXCLAMATION|MB_OK);
214 }
215
216
217
218 HIMAGELIST
219 InitImageList(UINT StartResource,
220 UINT EndResource,
221 UINT Width,
222 UINT Height)
223 {
224 HICON hIcon;
225 HIMAGELIST hImageList;
226 UINT i;
227 INT Ret;
228
229 /* Create the toolbar icon image list */
230 hImageList = ImageList_Create(Width,
231 Height,
232 ILC_MASK | ILC_COLOR32,
233 EndResource - StartResource,
234 0);
235 if (hImageList == NULL)
236 return NULL;
237
238 /* Add all icons to the image list */
239 for (i = StartResource; i <= EndResource; i++)
240 {
241 hIcon = (HBITMAP)LoadImageW(hInstance,
242 MAKEINTRESOURCEW(i),
243 IMAGE_ICON,
244 Width,
245 Height,
246 LR_DEFAULTCOLOR);
247 if (hIcon == NULL)
248 goto fail;
249
250 Ret = ImageList_AddIcon(hImageList,
251 hIcon);
252 if (Ret == -1)
253 goto fail;
254
255 DestroyIcon(hIcon);
256 }
257
258 return hImageList;
259
260 fail:
261 ImageList_Destroy(hImageList);
262 return NULL;
263 }
264
265 DWORD
266 AnsiToUnicode(LPCSTR lpSrcStr,
267 LPWSTR *lpDstStr)
268 {
269 INT length;
270 INT ret = 0;
271
272 length = strlen(lpSrcStr) + 1;
273
274 *lpDstStr = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, length * sizeof(WCHAR));
275 if (*lpDstStr)
276 {
277 ret = MultiByteToWideChar(CP_ACP,
278 0,
279 lpSrcStr,
280 -1,
281 *lpDstStr,
282 length);
283 }
284
285 return ret;
286 }
287
288 DWORD
289 UnicodeToAnsi(LPCWSTR lpSrcStr,
290 LPSTR *lpDstStr)
291 {
292 INT length;
293 INT ret = 0;
294
295 length = wcslen(lpSrcStr) + 1;
296
297 *lpDstStr = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, length);
298 if (*lpDstStr)
299 {
300 ret = WideCharToMultiByte(CP_ACP,
301 0,
302 lpSrcStr,
303 -1,
304 *lpDstStr,
305 length,
306 NULL,
307 NULL);
308 }
309
310 return ret;
311 }