[rshell]
[reactos.git] / base / system / logonui / NT5design.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Logon User Interface Host
4 * FILE: subsys/system/logonui/NT5design.c
5 * PROGRAMMERS: Ged Murphy (gedmurphy@reactos.org)
6 */
7
8 #include "logonui.h"
9
10
11 /* GLOBALS ******************************************************************/
12
13 #define NT5_TOP_BORDER_HEIGHT 80
14 #define NT5_BOTTOM_BORDER_HEIGHT 96
15
16
17 /* FUNCTIONS ****************************************************************/
18
19 static VOID
20 NT5_DrawLogoffCaptionText(LPWSTR lpText,
21 HDC hdcMem)
22 {
23 HFONT hFont;
24 LOGFONTW LogFont;
25 RECT TextRect;
26 INT PrevBkMode;
27
28 /* Setup the font we'll use */
29 ZeroMemory(&LogFont, sizeof(LOGFONTW));
30 LogFont.lfCharSet = DEFAULT_CHARSET;
31 LogFont.lfHeight = 22;
32 LogFont.lfWeight = 109; // From WinXP disassembly
33 wcscpy_s(LogFont.lfFaceName, LF_FACESIZE, L"Arial");
34
35 /* Create it */
36 hFont = CreateFontIndirectW(&LogFont);
37 if (hFont)
38 {
39 /* Set the font and font colour */
40 SelectObject(hdcMem, hFont);
41 SetTextColor(hdcMem, RGB(255, 255, 255));
42
43 /* Create the text rect */
44 TextRect.top = (g_pInfo->cy / 2) + 34;
45 TextRect.bottom = (g_pInfo->cy / 2) + 34 + (GetDeviceCaps(hdcMem, LOGPIXELSY));
46 TextRect.left = g_pInfo->cx / 3;
47 TextRect.right = (g_pInfo->cx / 2) + 35 + 137;
48
49 /* Set the background mode to transparent */
50 PrevBkMode = SetBkMode(hdcMem, TRANSPARENT);
51
52 /* Draw the text to the mem DC */
53 DrawTextW(hdcMem,
54 lpText,
55 -1,
56 &TextRect,
57 DT_NOPREFIX | DT_WORDBREAK | DT_RIGHT); // WinXP disassembly uses 0x812
58
59 /* Set the previous background mode */
60 SetBkMode(hdcMem, PrevBkMode);
61
62 /* Delete the font */
63 DeleteObject(hFont);
64 }
65 }
66
67 static VOID
68 NT5_DrawLogoffIcon(HDC hdcMem)
69 {
70 HBITMAP hBitmap;
71 BITMAP bitmap;
72 HDC hTempDC;
73
74 /* Load the XP logo */
75 hBitmap = (HBITMAP)LoadImageW(g_pInfo->hInstance,
76 MAKEINTRESOURCEW(IDB_MAIN_ROS_LOGO),
77 IMAGE_BITMAP,
78 0,
79 0,
80 LR_DEFAULTCOLOR);
81 if (hBitmap)
82 {
83 /* Get the bitmap dimensions */
84 GetObjectW(hBitmap, sizeof(BITMAP), &bitmap);
85
86 /* Create a temp DC for the bitmap */
87 hTempDC = CreateCompatibleDC(hdcMem);
88 if (hTempDC)
89 {
90 /* Select the bitmap onto the temp DC */
91 SelectObject(hTempDC, hBitmap);
92
93 /* Paint it onto the centre block */
94 BitBlt(hdcMem,
95 (g_pInfo->cx / 2) + 35,
96 (g_pInfo->cy / 2) - 72,
97 bitmap.bmWidth,
98 bitmap.bmHeight,
99 hTempDC,
100 0,
101 0,
102 SRCCOPY);
103
104 /* Delete the DC */
105 DeleteDC(hTempDC);
106 }
107
108 /* Delete the bitmap */
109 DeleteObject(hBitmap);
110 }
111 }
112
113 VOID
114 NT5_RefreshLogoffScreenText(LPWSTR lpText,
115 HDC hdcMem)
116 {
117 /* FIXME: clear previous text */
118
119 /* Draw the new text */
120 NT5_DrawLogoffCaptionText(lpText, hdcMem);
121 }
122
123 VOID
124 NT5_CreateLogoffScreen(LPWSTR lpText,
125 HDC hdcMem)
126 {
127 /* Draw the reactos logo */
128 NT5_DrawLogoffIcon(hdcMem);
129
130 /* Draw the first text string */
131 NT5_DrawLogoffCaptionText(lpText, hdcMem);
132 }
133
134 HDC
135 NT5_DrawBaseBackground(HDC hdcDesktop)
136 {
137 HBITMAP hBitmap = NULL;
138 HDC hdcMem = NULL;
139 BOOL bRet = FALSE;
140
141
142 /* Create an an off screen DC to match the desktop DC */
143 hdcMem = CreateCompatibleDC(hdcDesktop);
144 if (hdcMem)
145 {
146 /* Create a bitmap to draw the logoff screen onto */
147 hBitmap = CreateCompatibleBitmap(hdcDesktop, g_pInfo->cx, g_pInfo->cy);
148 if (hBitmap)
149 {
150 /* Select it onto our off screen DC*/
151 SelectObject(hdcMem, hBitmap);
152
153 /* Draw the centre block */
154 {
155 HBITMAP hTempBitmap;
156 HBRUSH hBrush;
157 BITMAP bitmap;
158 HDC hTempDC;
159
160 /* Paint the blue centre block */
161 hBrush = CreateSolidBrush(RGB(90, 126, 220));
162 SelectObject(hdcMem, hBrush);
163 PatBlt(hdcMem,
164 0,
165 NT5_TOP_BORDER_HEIGHT,
166 g_pInfo->cx,
167 g_pInfo->cy - NT5_TOP_BORDER_HEIGHT - NT5_BOTTOM_BORDER_HEIGHT,
168 PATCOPY);
169 DeleteObject(hBrush);
170
171 /* Load the shine effect */
172 hTempBitmap = (HBITMAP)LoadImageW(g_pInfo->hInstance,
173 MAKEINTRESOURCEW(IDB_MAIN_PANEL_SHINE),
174 IMAGE_BITMAP,
175 0,
176 0,
177 LR_DEFAULTCOLOR);
178 if (hTempBitmap)
179 {
180 /* Get the bitmap dimensions */
181 GetObjectW(hTempBitmap, sizeof(BITMAP), &bitmap);
182
183 /* Create a temp DC for the bitmap */
184 hTempDC = CreateCompatibleDC(hdcDesktop);
185 if (hTempDC)
186 {
187 /* Select the bitmap onto the temp DC */
188 SelectObject(hTempDC, hTempBitmap);
189
190 /* Paint it onto the top left of the centre block */
191 BitBlt(hdcMem,
192 0,
193 NT5_TOP_BORDER_HEIGHT,
194 bitmap.bmWidth,
195 bitmap.bmHeight,
196 hTempDC,
197 0,
198 0,
199 SRCCOPY);
200
201 /* Delete the DC */
202 DeleteDC(hTempDC);
203 }
204
205 /* Delete the bitmap */
206 DeleteObject(hTempBitmap);
207 }
208 }
209
210 /* Draw the top border */
211 {
212 HBITMAP hTempBitmap;
213 HBRUSH hBrush;
214 BITMAP bitmap;
215 HDC hTempDC;
216
217 /* Create the blue brush and paint the top bar */
218 hBrush = CreateSolidBrush(RGB(0, 48, 156));
219 SelectObject(hdcMem, hBrush);
220 PatBlt(hdcMem, 0, 0, g_pInfo->cx, NT5_TOP_BORDER_HEIGHT, PATCOPY);
221 DeleteObject(hBrush);
222
223 /* Load the top divider strip */
224 hTempBitmap = (HBITMAP)LoadImageW(g_pInfo->hInstance,
225 MAKEINTRESOURCEW(IDB_TOP_DIVIDER_STRIP),
226 IMAGE_BITMAP,
227 0,
228 0,
229 LR_DEFAULTCOLOR);
230 if (hTempBitmap)
231 {
232 /* Get the bitmap dimensions */
233 GetObjectW(hTempBitmap, sizeof(BITMAP), &bitmap);
234
235 /* Create a temp DC for the bitmap */
236 hTempDC = CreateCompatibleDC(hdcDesktop);
237 if (hTempDC)
238 {
239 /* Select the bitmap onto the temp DC */
240 SelectObject(hTempDC, hTempBitmap);
241
242 /* Paint the bitmap */
243 StretchBlt(hdcMem,
244 0,
245 NT5_TOP_BORDER_HEIGHT - bitmap.bmHeight,
246 g_pInfo->cx,
247 NT5_TOP_BORDER_HEIGHT,
248 hTempDC,
249 0,
250 0,
251 bitmap.bmWidth,
252 NT5_TOP_BORDER_HEIGHT,
253 SRCCOPY);
254
255 /* Delete the DC */
256 DeleteDC(hTempDC);
257 }
258
259 /* Delete the bitmap */
260 DeleteObject(hTempBitmap);
261 }
262 }
263
264 /* Draw the bottom border */
265 {
266 HBITMAP hTempBitmap;
267 TRIVERTEX vertex[2];
268 GRADIENT_RECT gRect;
269 BITMAP bitmap;
270 HDC hTempDC;
271
272 /*
273 * We paint the divider strip first as it's 3
274 * pixels high but MS only show 2 of them.
275 */
276
277 /* Load the bottom divider strip */
278 hTempBitmap = (HBITMAP)LoadImage(g_pInfo->hInstance,
279 MAKEINTRESOURCE(IDB_BOTTOM_DIVIDER_STRIP),
280 IMAGE_BITMAP,
281 0,
282 0,
283 LR_DEFAULTCOLOR);
284 if (hTempBitmap)
285 {
286 /* Get the bitmap dimensions */
287 GetObjectW(hTempBitmap, sizeof(BITMAP), &bitmap);
288
289 /* Create a temp DC for the bitmap */
290 hTempDC = CreateCompatibleDC(hdcDesktop);
291 if (hTempDC)
292 {
293 /* Select the bitmap onto the temp DC */
294 SelectObject(hTempDC, hTempBitmap);
295
296 /* Paint the bitmap */
297 StretchBlt(hdcMem,
298 0,
299 g_pInfo->cy - NT5_BOTTOM_BORDER_HEIGHT,
300 g_pInfo->cx,
301 g_pInfo->cy - NT5_BOTTOM_BORDER_HEIGHT + bitmap.bmHeight,
302 hTempDC,
303 0,
304 0,
305 bitmap.bmWidth,
306 g_pInfo->cy - NT5_BOTTOM_BORDER_HEIGHT + bitmap.bmHeight,
307 SRCCOPY);
308
309 /* Delete the DC */
310 DeleteDC(hTempDC);
311 }
312
313 /* Delete the bitmap */
314 DeleteObject(hTempBitmap);
315 }
316
317 /* Setup the left hand vertex */
318 vertex[0].x = 0;
319 vertex[0].y = g_pInfo->cy - NT5_BOTTOM_BORDER_HEIGHT + 2; // paint over 1 pixel of the bitmap
320 vertex[0].Red = 0x3900;
321 vertex[0].Green = 0x3400;
322 vertex[0].Blue = 0xAE00;
323 vertex[0].Alpha = 0x0000;
324
325 /* Setup the right hand vertex */
326 vertex[1].x = g_pInfo->cx;
327 vertex[1].y = g_pInfo->cy;
328 vertex[1].Red = 0x0000;
329 vertex[1].Green = 0x3000;
330 vertex[1].Blue = 0x9600;
331 vertex[1].Alpha = 0x0000;
332
333 /* Set the vertex structs */
334 gRect.UpperLeft = 0;
335 gRect.LowerRight = 1;
336
337 /* Paint the gradient across the bottom */
338 GradientFill(hdcMem,
339 vertex,
340 2,
341 &gRect,
342 1,
343 GRADIENT_FILL_RECT_H);
344 }
345
346 /* Delete the bitmap */
347 DeleteObject(hBitmap);
348 }
349 }
350
351 return hdcMem;
352 }
353
354 /* EOF */