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