[DDK]: Merge 46183 from header-branch.
[reactos.git] / rosapps / templates / old_wordpad / misc.c
1 #include "precomp.h"
2
3 static INT
4 LengthOfStrResource(IN HINSTANCE hInst,
5 IN UINT uID)
6 {
7 HRSRC hrSrc;
8 HGLOBAL hRes;
9 LPWSTR lpName, lpStr;
10
11 if (hInst == NULL)
12 {
13 return -1;
14 }
15
16 /* There are always blocks of 16 strings */
17 lpName = (LPWSTR)MAKEINTRESOURCE((uID >> 4) + 1);
18
19 /* Find the string table block */
20 if ((hrSrc = FindResourceW(hInst, lpName, (LPWSTR)RT_STRING)) &&
21 (hRes = LoadResource(hInst, hrSrc)) &&
22 (lpStr = (WCHAR*) LockResource(hRes)))
23 {
24 UINT x;
25
26 /* Find the string we're looking for */
27 uID &= 0xF; /* position in the block, same as % 16 */
28 for (x = 0; x < uID; x++)
29 {
30 lpStr += (*lpStr) + 1;
31 }
32
33 /* Found the string */
34 return (int)(*lpStr);
35 }
36 return -1;
37 }
38
39 INT
40 AllocAndLoadString(OUT LPTSTR *lpTarget,
41 IN HINSTANCE hInst,
42 IN UINT uID)
43 {
44 INT ln;
45
46 ln = LengthOfStrResource(hInst,
47 uID);
48 if (ln++ > 0)
49 {
50 (*lpTarget) = (LPTSTR)LocalAlloc(LMEM_FIXED,
51 ln * sizeof(TCHAR));
52 if ((*lpTarget) != NULL)
53 {
54 INT Ret;
55 if (!(Ret = LoadString(hInst, uID, *lpTarget, ln)))
56 {
57 LocalFree((HLOCAL)(*lpTarget));
58 }
59 return Ret;
60 }
61 }
62 return 0;
63 }
64
65 DWORD
66 LoadAndFormatString(IN HINSTANCE hInstance,
67 IN UINT uID,
68 OUT LPTSTR *lpTarget,
69 ...)
70 {
71 DWORD Ret = 0;
72 LPTSTR lpFormat;
73 va_list lArgs;
74
75 if (AllocAndLoadString(&lpFormat,
76 hInstance,
77 uID) > 0)
78 {
79 va_start(lArgs, lpTarget);
80 /* let's use FormatMessage to format it because it has the ability to allocate
81 memory automatically */
82 Ret = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING,
83 lpFormat,
84 0,
85 0,
86 (LPTSTR)lpTarget,
87 0,
88 &lArgs);
89 va_end(lArgs);
90
91 LocalFree((HLOCAL)lpFormat);
92 }
93
94 return Ret;
95 }
96
97 BOOL
98 StatusBarLoadAndFormatString(IN HWND hStatusBar,
99 IN INT PartId,
100 IN HINSTANCE hInstance,
101 IN UINT uID,
102 ...)
103 {
104 BOOL Ret = FALSE;
105 LPTSTR lpFormat, lpStr;
106 va_list lArgs;
107
108 if (AllocAndLoadString(&lpFormat,
109 hInstance,
110 uID) > 0)
111 {
112 va_start(lArgs, uID);
113 /* let's use FormatMessage to format it because it has the ability to allocate
114 memory automatically */
115 Ret = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING,
116 lpFormat,
117 0,
118 0,
119 (LPTSTR)&lpStr,
120 0,
121 &lArgs);
122 va_end(lArgs);
123
124 if (lpStr != NULL)
125 {
126 Ret = (BOOL)SendMessage(hStatusBar,
127 SB_SETTEXT,
128 (WPARAM)PartId,
129 (LPARAM)lpStr);
130 LocalFree((HLOCAL)lpStr);
131 }
132
133 LocalFree((HLOCAL)lpFormat);
134 }
135
136 return Ret;
137 }
138
139 BOOL
140 StatusBarLoadString(IN HWND hStatusBar,
141 IN INT PartId,
142 IN HINSTANCE hInstance,
143 IN UINT uID)
144 {
145 BOOL Ret = FALSE;
146 LPTSTR lpStr;
147
148 if (AllocAndLoadString(&lpStr,
149 hInstance,
150 uID) > 0)
151 {
152 Ret = (BOOL)SendMessage(hStatusBar,
153 SB_SETTEXT,
154 (WPARAM)PartId,
155 (LPARAM)lpStr);
156 LocalFree((HLOCAL)lpStr);
157 }
158
159 return Ret;
160 }
161
162
163 INT
164 GetTextFromEdit(OUT LPTSTR lpString,
165 IN HWND hDlg,
166 IN UINT Res)
167 {
168 INT len = GetWindowTextLength(GetDlgItem(hDlg, Res));
169 if(len > 0)
170 {
171 GetDlgItemText(hDlg,
172 Res,
173 lpString,
174 len + 1);
175 }
176 else
177 lpString = NULL;
178
179 return len;
180 }
181
182
183 VOID GetError(DWORD err)
184 {
185 LPVOID lpMsgBuf;
186
187 if (err == 0)
188 err = GetLastError();
189
190 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
191 FORMAT_MESSAGE_FROM_SYSTEM |
192 FORMAT_MESSAGE_IGNORE_INSERTS,
193 NULL,
194 err,
195 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
196 (LPTSTR) &lpMsgBuf,
197 0,
198 NULL );
199
200 MessageBox(NULL, (LPCTSTR) lpMsgBuf, _T("Error!"), MB_OK | MB_ICONERROR);
201
202 LocalFree(lpMsgBuf);
203 }
204