[DESK.CPL]
[reactos.git] / reactos / dll / cpl / desk / preview.c
index be3adf1..c4a8d16 100644 (file)
@@ -3,11 +3,13 @@
  * LICENSE:     GPL - See COPYING in the top level directory
  * FILE:        lib/cpl/desk/preview.c
  * PURPOSE:     Draws the preview control
- * COPYRIGHT:   Copyright 2006, 2007 Eric Kohl (email?)
+ * COPYRIGHT:   Copyright 2006, 2007 Eric Kohl
  */
 
 #include "desk.h"
+#include "theme.h"
 #include "preview.h"
+#include "draw.h"
 
 static const TCHAR szPreviewWndClass[] = TEXT("PreviewWndClass");
 
@@ -15,19 +17,11 @@ typedef struct _PREVIEW_DATA
 {
     HWND hwndParent;
 
-    DWORD clrDesktop;
-    HBRUSH hbrDesktop;
-
-    DWORD clrWindow;
-    HBRUSH hbrWindow;
+    THEME Theme;
 
-    DWORD clrScrollbar;
     HBRUSH hbrScrollbar;
-
-    DWORD clrActiveCaptionText;
-    DWORD clrInactiveCaptionText;
-    DWORD clrWindowText;
-    DWORD clrButtonText;
+    HBRUSH hbrDesktop;
+    HBRUSH hbrWindow;
 
     INT cxEdge;
     INT cyEdge;
@@ -35,6 +29,7 @@ typedef struct _PREVIEW_DATA
     INT cySizeFrame;
 
     INT cyCaption;
+    INT cyBorder;
     INT cyMenu;
     INT cxScrollbar;
 
@@ -65,135 +60,70 @@ typedef struct _PREVIEW_DATA
     LPTSTR lpMessText;
     LPTSTR lpButText;
 
-    LOGFONT lfCaptionFont;
-    LOGFONT lfMenuFont;
-    LOGFONT lfMessageFont;
-
     HFONT hCaptionFont;
     HFONT hMenuFont;
     HFONT hMessageFont;
+    HFONT hClientFont;
 
     HMENU hMenu;
 
 } PREVIEW_DATA, *PPREVIEW_DATA;
 
 
-
-static VOID
-DrawCaptionButtons(HDC hdc, LPRECT lpRect, BOOL bMinMax, int x)
+static VOID UpdatePreviewTheme(HWND hwnd, PPREVIEW_DATA pPreviewData, THEME *theme)
 {
-    RECT rc3;
-    RECT rc4;
-    RECT rc5;
-
-    rc3.left = lpRect->right - 2 - x;
-    rc3.top = lpRect->top + 2;
-    rc3.right = lpRect->right - 2;
-    rc3.bottom = lpRect->bottom - 2;
-
-    DrawFrameControl(hdc, &rc3, DFC_CAPTION, DFCS_CAPTIONCLOSE);
-
-    if (bMinMax)
-    {
-        rc4.left = rc3.left - x - 2;
-        rc4.top = rc3.top;
-        rc4.right = rc3.right - x - 2;
-        rc4.bottom = rc3.bottom;
-
-        DrawFrameControl(hdc, &rc4, DFC_CAPTION, DFCS_CAPTIONMAX);
-
-        rc5.left = rc4.left - x;
-        rc5.top = rc4.top;
-        rc5.right = rc4.right - x;
-        rc5.bottom = rc4.bottom;
-
-        DrawFrameControl(hdc, &rc5, DFC_CAPTION, DFCS_CAPTIONMIN);
-    }
+    if (pPreviewData->hbrScrollbar != NULL)
+        DeleteObject(pPreviewData->hbrScrollbar);
+    pPreviewData->hbrScrollbar = CreateSolidBrush(theme->crColor[COLOR_SCROLLBAR]);
+    if (pPreviewData->hbrDesktop != NULL)
+        DeleteObject(pPreviewData->hbrDesktop);
+    pPreviewData->hbrDesktop = CreateSolidBrush(theme->crColor[COLOR_DESKTOP]);
+    if (pPreviewData->hbrWindow != NULL)
+        DeleteObject(pPreviewData->hbrWindow);
+    pPreviewData->hbrWindow = CreateSolidBrush(theme->crColor[COLOR_WINDOW]);
+
+    pPreviewData->cxEdge = theme->Size[SIZE_EDGE_X] - 2;        /* SM_CXEDGE */
+    pPreviewData->cyEdge = theme->Size[SIZE_EDGE_Y] - 2;        /* SM_CYEDGE */
+
+    pPreviewData->cySizeFrame = theme->Size[SIZE_FRAME_Y] - 1;  /* SM_CYSIZEFRAME */
+
+    pPreviewData->cyCaption = theme->Size[SIZE_CAPTION_Y];      /* SM_CYCAPTION */
+    pPreviewData->cyMenu = theme->Size[SIZE_MENU_Y];            /* SM_CYMENU */
+    pPreviewData->cxScrollbar = theme->Size[SIZE_SCROLL_X];     /* SM_CXVSCROLL */
+    pPreviewData->cyBorder = theme->Size[SIZE_BORDER_Y];        /* SM_CYBORDER */
+
+    if (pPreviewData->hCaptionFont != NULL)
+        DeleteObject(pPreviewData->hCaptionFont);
+    pPreviewData->hCaptionFont = CreateFontIndirect(&theme->lfFont[FONT_CAPTION]);
+
+    if (pPreviewData->hMenuFont != NULL)
+        DeleteObject(pPreviewData->hMenuFont);
+    pPreviewData->hMenuFont = CreateFontIndirect(&theme->lfFont[FONT_MENU]);
+
+    if (pPreviewData->hMessageFont != NULL)
+        DeleteObject(pPreviewData->hMessageFont);
+    pPreviewData->hMessageFont = CreateFontIndirect(&theme->lfFont[FONT_DIALOG]);
+
+    pPreviewData->Theme = *theme;
+    InvalidateRect(hwnd, NULL, FALSE);
 }
 
-
-static VOID
-DrawScrollbar(HDC hdc, LPRECT rc, HBRUSH hbrScrollbar)
-{
-    RECT rcTop;
-    RECT rcBottom;
-    RECT rcMiddle;
-    int width;
-
-    width = rc->right - rc->left;
-
-    rcTop.left = rc->left;
-    rcTop.right = rc->right;
-    rcTop.top = rc->top;
-    rcTop.bottom = rc->top + width;
-
-    rcMiddle.left = rc->left;
-    rcMiddle.right = rc->right;
-    rcMiddle.top = rc->top + width;
-    rcMiddle.bottom = rc->bottom - width;
-
-    rcBottom.left = rc->left;
-    rcBottom.right = rc->right;
-    rcBottom.top = rc->bottom - width;
-    rcBottom.bottom = rc->bottom;
-
-    DrawFrameControl(hdc, &rcTop, DFC_SCROLL, DFCS_SCROLLUP);
-    DrawFrameControl(hdc, &rcBottom, DFC_SCROLL, DFCS_SCROLLDOWN);
-
-    FillRect(hdc, &rcMiddle, hbrScrollbar);
-}
-
-
 static VOID
 OnCreate(HWND hwnd, PPREVIEW_DATA pPreviewData)
 {
-    NONCLIENTMETRICS NonClientMetrics;
-
-    pPreviewData->clrScrollbar = GetSysColor(COLOR_SCROLLBAR);
-    pPreviewData->hbrScrollbar = CreateSolidBrush(pPreviewData->clrScrollbar);
-
-    pPreviewData->clrDesktop = GetSysColor(COLOR_DESKTOP);
-    pPreviewData->hbrDesktop = CreateSolidBrush(pPreviewData->clrDesktop);
-    pPreviewData->clrWindow = GetSysColor(COLOR_WINDOW);
-    pPreviewData->hbrWindow = CreateSolidBrush(pPreviewData->clrWindow);
-
-    pPreviewData->clrActiveCaptionText = GetSysColor(COLOR_CAPTIONTEXT);
-    pPreviewData->clrInactiveCaptionText = GetSysColor(COLOR_INACTIVECAPTIONTEXT);
-    pPreviewData->clrWindowText = GetSysColor(COLOR_WINDOWTEXT);
-    pPreviewData->clrButtonText = GetSysColor(COLOR_BTNTEXT);
-
-    pPreviewData->cxEdge = GetSystemMetrics(SM_CXEDGE);
-    pPreviewData->cyEdge = GetSystemMetrics(SM_CXEDGE);
-
-    pPreviewData->cySizeFrame = GetSystemMetrics(SM_CYSIZEFRAME);
+    THEME *theme;
 
-    pPreviewData->cyCaption = GetSystemMetrics(SM_CYCAPTION);
-    pPreviewData->cyMenu = GetSystemMetrics(SM_CYMENU);
-    pPreviewData->cxScrollbar = GetSystemMetrics(SM_CXVSCROLL);
-
-    /* load font info */
-    NonClientMetrics.cbSize = sizeof(NONCLIENTMETRICS);
-    SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &NonClientMetrics, 0);
-
-    pPreviewData->lfCaptionFont = NonClientMetrics.lfCaptionFont;
-    pPreviewData->hCaptionFont = CreateFontIndirect(&pPreviewData->lfCaptionFont);
-
-    pPreviewData->lfMenuFont = NonClientMetrics.lfMenuFont;
-    pPreviewData->hMenuFont = CreateFontIndirect(&pPreviewData->lfMenuFont);
-
-    pPreviewData->lfMessageFont = NonClientMetrics.lfMessageFont;
-    pPreviewData->hMessageFont = CreateFontIndirect(&pPreviewData->lfMessageFont);
+    pPreviewData->hClientFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
 
     /* Load and modify the menu */
     pPreviewData->hMenu = LoadMenu(hApplet, MAKEINTRESOURCE(IDR_PREVIEW_MENU));
-    EnableMenuItem(pPreviewData->hMenu, ID_MENU_DISABLED,
-                   MF_BYCOMMAND | MF_DISABLED);
+    EnableMenuItem(pPreviewData->hMenu,
+                   1, MF_BYPOSITION | MF_GRAYED);
     HiliteMenuItem(hwnd, pPreviewData->hMenu,
-                   ID_MENU_SELECTED, MF_BYCOMMAND | MF_HILITE);
+                   2, MF_BYPOSITION | MF_HILITE);
 
 //    GetMenuItemRect(hwnd, pPreviewData->hMenu,
-//                    ID_MENU_SELECTED, &pPreviewData->rcSelectedMenuItem);
-
+//                    2, &pPreviewData->rcSelectedMenuItem);
 
     AllocAndLoadString(&pPreviewData->lpInAct, hApplet, IDS_INACTWIN);
     AllocAndLoadString(&pPreviewData->lpAct, hApplet, IDS_ACTWIN);
@@ -201,6 +131,11 @@ OnCreate(HWND hwnd, PPREVIEW_DATA pPreviewData)
     AllocAndLoadString(&pPreviewData->lpMessBox, hApplet, IDS_MESSBOX);
     AllocAndLoadString(&pPreviewData->lpMessText, hApplet, IDS_MESSTEXT);
     AllocAndLoadString(&pPreviewData->lpButText, hApplet, IDS_BUTTEXT);
+
+    theme = &pPreviewData->Theme;
+    LoadCurrentTheme(theme);
+
+    UpdatePreviewTheme(hwnd, pPreviewData, theme);
 }
 
 
@@ -216,10 +151,10 @@ CalculateItemSize(PPREVIEW_DATA pPreviewData)
     pPreviewData->rcInactiveFrame.bottom = pPreviewData->rcDesktop.bottom - 30;
 
     /* Calculate the inactive caption rectangle */
-    pPreviewData->rcInactiveCaption.left = pPreviewData->rcInactiveFrame.left + pPreviewData->cxEdge + 1/*3*/ + 1;
-    pPreviewData->rcInactiveCaption.top = pPreviewData->rcInactiveFrame.top + pPreviewData->cyEdge + 1/*3*/ + 1;
-    pPreviewData->rcInactiveCaption.right = pPreviewData->rcInactiveFrame.right - pPreviewData->cxEdge - 1/*3*/ - 1;
-    pPreviewData->rcInactiveCaption.bottom = pPreviewData->rcInactiveFrame.top + pPreviewData->cyCaption + 1 + 2;
+    pPreviewData->rcInactiveCaption.left = pPreviewData->rcInactiveFrame.left + pPreviewData->cxEdge + pPreviewData->cySizeFrame + 1;
+    pPreviewData->rcInactiveCaption.top = pPreviewData->rcInactiveFrame.top + pPreviewData->cyEdge + pPreviewData->cySizeFrame + 1;
+    pPreviewData->rcInactiveCaption.right = pPreviewData->rcInactiveFrame.right - pPreviewData->cxEdge - pPreviewData->cySizeFrame - 1;
+    pPreviewData->rcInactiveCaption.bottom = pPreviewData->rcInactiveCaption.top + pPreviewData->cyCaption - pPreviewData->cyBorder;
 
     /* Calculate the inactive caption buttons rectangle */
     pPreviewData->rcInactiveCaptionButtons.left = pPreviewData->rcInactiveCaption.right - 2 - 2 - 3 * 16;
@@ -228,16 +163,16 @@ CalculateItemSize(PPREVIEW_DATA pPreviewData)
     pPreviewData->rcInactiveCaptionButtons.bottom = pPreviewData->rcInactiveCaption.bottom - 2;
 
     /* Calculate the active window rectangle */
-    pPreviewData->rcActiveFrame.left = pPreviewData->rcInactiveFrame.left + 3 + 1;
+    pPreviewData->rcActiveFrame.left = pPreviewData->rcInactiveFrame.left + 3 + pPreviewData->cySizeFrame;
     pPreviewData->rcActiveFrame.top = pPreviewData->rcInactiveCaption.bottom + 1;
     pPreviewData->rcActiveFrame.right = pPreviewData->rcDesktop.right - 10;
     pPreviewData->rcActiveFrame.bottom = pPreviewData->rcDesktop.bottom - 25;
 
     /* Calculate the active caption rectangle */
-    pPreviewData->rcActiveCaption.left = pPreviewData->rcActiveFrame.left + 3 + 1;
-    pPreviewData->rcActiveCaption.top = pPreviewData->rcActiveFrame.top + 3 + 1;
-    pPreviewData->rcActiveCaption.right = pPreviewData->rcActiveFrame.right - 3 - 1;
-    pPreviewData->rcActiveCaption.bottom = pPreviewData->rcActiveFrame.top + pPreviewData->cyCaption + 1 + 2;
+    pPreviewData->rcActiveCaption.left = pPreviewData->rcActiveFrame.left + pPreviewData->cxEdge + pPreviewData->cySizeFrame + 1;
+    pPreviewData->rcActiveCaption.top = pPreviewData->rcActiveFrame.top + pPreviewData->cxEdge + pPreviewData->cySizeFrame + 1;
+    pPreviewData->rcActiveCaption.right = pPreviewData->rcActiveFrame.right - pPreviewData->cxEdge - pPreviewData->cySizeFrame - 1;
+    pPreviewData->rcActiveCaption.bottom = pPreviewData->rcActiveCaption.top + pPreviewData->cyCaption - pPreviewData->cyBorder;
 
     /* Calculate the active caption buttons rectangle */
     pPreviewData->rcActiveCaptionButtons.left = pPreviewData->rcActiveCaption.right - 2 - 2 - 3 * 16;
@@ -246,16 +181,16 @@ CalculateItemSize(PPREVIEW_DATA pPreviewData)
     pPreviewData->rcActiveCaptionButtons.bottom = pPreviewData->rcActiveCaption.bottom - 2;
 
     /* Calculate the active menu bar rectangle */
-    pPreviewData->rcActiveMenuBar.left = pPreviewData->rcActiveFrame.left + 3 + 1;
+    pPreviewData->rcActiveMenuBar.left = pPreviewData->rcActiveFrame.left + pPreviewData->cxEdge + pPreviewData->cySizeFrame + 1;
     pPreviewData->rcActiveMenuBar.top = pPreviewData->rcActiveCaption.bottom + 1;
-    pPreviewData->rcActiveMenuBar.right = pPreviewData->rcActiveFrame.right - 3 - 1;
+    pPreviewData->rcActiveMenuBar.right = pPreviewData->rcActiveFrame.right - pPreviewData->cxEdge - pPreviewData->cySizeFrame - 1;
     pPreviewData->rcActiveMenuBar.bottom = pPreviewData->rcActiveMenuBar.top + pPreviewData->cyMenu + 1;
 
     /* Calculate the active client rectangle */
-    pPreviewData->rcActiveClient.left = pPreviewData->rcActiveFrame.left + 3 + 1;
-    pPreviewData->rcActiveClient.top = pPreviewData->rcActiveMenuBar.bottom; // + 1;
-    pPreviewData->rcActiveClient.right = pPreviewData->rcActiveFrame.right - 3 - 1;
-    pPreviewData->rcActiveClient.bottom = pPreviewData->rcActiveFrame.bottom - 3 - 1;
+    pPreviewData->rcActiveClient.left = pPreviewData->rcActiveFrame.left + pPreviewData->cxEdge + pPreviewData->cySizeFrame + 1;
+    pPreviewData->rcActiveClient.top = pPreviewData->rcActiveMenuBar.bottom;
+    pPreviewData->rcActiveClient.right = pPreviewData->rcActiveFrame.right - pPreviewData->cxEdge - pPreviewData->cySizeFrame - 1;
+    pPreviewData->rcActiveClient.bottom = pPreviewData->rcActiveFrame.bottom - pPreviewData->cyEdge - pPreviewData->cySizeFrame - 1;
 
     /* Calculate the active scroll rectangle */
     pPreviewData->rcActiveScroll.left = pPreviewData->rcActiveClient.right - 2 - pPreviewData->cxScrollbar;
@@ -312,7 +247,6 @@ OnSize(INT cx, INT cy, PPREVIEW_DATA pPreviewData)
     CalculateItemSize(pPreviewData);
 }
 
-
 static VOID
 OnPaint(HWND hwnd, PPREVIEW_DATA pPreviewData)
 {
@@ -320,6 +254,9 @@ OnPaint(HWND hwnd, PPREVIEW_DATA pPreviewData)
     HFONT hOldFont;
     HDC hdc;
     RECT rc;
+    THEME *theme;
+
+    theme = &pPreviewData->Theme;
 
     hdc = BeginPaint(hwnd, &ps);
 
@@ -327,63 +264,63 @@ OnPaint(HWND hwnd, PPREVIEW_DATA pPreviewData)
     FillRect(hdc, &pPreviewData->rcDesktop, pPreviewData->hbrDesktop);
 
     /* Inactive Window */
-    DrawEdge(hdc, &pPreviewData->rcInactiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE);
-    SetTextColor(hdc, pPreviewData->clrInactiveCaptionText);
-    DrawCaptionTemp(NULL, hdc, &pPreviewData->rcInactiveCaption,  pPreviewData->hCaptionFont,
-                    NULL, pPreviewData->lpInAct, DC_GRADIENT | DC_ICON | DC_TEXT);
-    DrawCaptionButtons(hdc, &pPreviewData->rcInactiveCaption, TRUE, pPreviewData->cyCaption - 2);
+    MyDrawEdge(hdc, &pPreviewData->rcInactiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE, theme);
+    SetTextColor(hdc, theme->crColor[COLOR_INACTIVECAPTIONTEXT]);
+    MyDrawCaptionTemp(NULL, hdc, &pPreviewData->rcInactiveCaption,  pPreviewData->hCaptionFont,
+                      NULL, pPreviewData->lpInAct, DC_GRADIENT | DC_ICON | DC_TEXT, theme);
+    MyDrawCaptionButtons(hdc, &pPreviewData->rcInactiveCaption, TRUE, pPreviewData->cyCaption - 2, theme);
 
     /* Active Window */
-    DrawEdge(hdc, &pPreviewData->rcActiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE);
-    SetTextColor(hdc, pPreviewData->clrActiveCaptionText);
-    DrawCaptionTemp(NULL, hdc, &pPreviewData->rcActiveCaption, pPreviewData->hCaptionFont,
-                    NULL, pPreviewData->lpAct, DC_ACTIVE | DC_GRADIENT | DC_ICON | DC_TEXT);
-    DrawCaptionButtons(hdc, &pPreviewData->rcActiveCaption, TRUE, pPreviewData->cyCaption - 2);
+    MyDrawEdge(hdc, &pPreviewData->rcActiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE, theme);
+    SetTextColor(hdc, theme->crColor[COLOR_CAPTIONTEXT]);
+    MyDrawCaptionTemp(NULL, hdc, &pPreviewData->rcActiveCaption, pPreviewData->hCaptionFont,
+                      NULL, pPreviewData->lpAct, DC_ACTIVE | DC_GRADIENT | DC_ICON | DC_TEXT, theme);
+    MyDrawCaptionButtons(hdc, &pPreviewData->rcActiveCaption, TRUE, pPreviewData->cyCaption - 2, theme);
 
-    /* FIXME: Draw the menu bar */
-    DrawMenuBarTemp(hwnd, hdc, &pPreviewData->rcActiveMenuBar,
-                    pPreviewData->hMenu /*HMENU hMenu*/,
-                    pPreviewData->hMessageFont /*HFONT hFont*/);
+    /* Draw the menu bar */
+    MyDrawMenuBarTemp(hwnd, hdc, &pPreviewData->rcActiveMenuBar,
+                      pPreviewData->hMenu,
+                      pPreviewData->hMenuFont, theme);
 
     /* Draw the client area */
     CopyRect(&rc, &pPreviewData->rcActiveClient);
-    DrawEdge(hdc, &rc, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
+    MyDrawEdge(hdc, &rc, EDGE_SUNKEN, BF_RECT | BF_ADJUST, theme);
     FillRect(hdc, &rc, pPreviewData->hbrWindow);
 
     /* Draw the client text */
     CopyRect(&rc, &pPreviewData->rcActiveClient);
     rc.left += 4;
     rc.top += 2;
-    SetTextColor(hdc, pPreviewData->clrWindowText);
-    hOldFont = SelectObject(hdc, pPreviewData->hMessageFont);
-    DrawText(hdc, pPreviewData->lpWinTxt, lstrlen(pPreviewData->lpWinTxt), &rc, DT_LEFT);
+    SetTextColor(hdc, theme->crColor[COLOR_WINDOWTEXT]);
+    hOldFont = SelectObject(hdc, pPreviewData->hClientFont);
+    DrawText(hdc, pPreviewData->lpWinTxt, -1, &rc, DT_LEFT);
     SelectObject(hdc, hOldFont);
 
     /* Draw the scroll bar */
-    DrawScrollbar(hdc, &pPreviewData->rcActiveScroll, pPreviewData->hbrScrollbar);
+    MyDrawScrollbar(hdc, &pPreviewData->rcActiveScroll, pPreviewData->hbrScrollbar, theme);
 
     /* Dialog Window */
-    DrawEdge(hdc, &pPreviewData->rcDialogFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE);
-    SetTextColor(hdc, pPreviewData->clrActiveCaptionText);
-    DrawCaptionTemp(NULL, hdc, &pPreviewData->rcDialogCaption, pPreviewData->hCaptionFont,
-                    NULL, pPreviewData->lpMessBox, DC_ACTIVE | DC_GRADIENT | DC_ICON | DC_TEXT);
-    DrawCaptionButtons(hdc, &pPreviewData->rcDialogCaption, FALSE, pPreviewData->cyCaption - 2);
+    MyDrawEdge(hdc, &pPreviewData->rcDialogFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE, theme);
+    SetTextColor(hdc, theme->crColor[COLOR_WINDOW]);
+    MyDrawCaptionTemp(NULL, hdc, &pPreviewData->rcDialogCaption, pPreviewData->hCaptionFont,
+                      NULL, pPreviewData->lpMessBox, DC_ACTIVE | DC_GRADIENT | DC_ICON | DC_TEXT, theme);
+    MyDrawCaptionButtons(hdc, &pPreviewData->rcDialogCaption, FALSE, pPreviewData->cyCaption - 2, theme);
 
     /* Draw the dialog text */
     CopyRect(&rc, &pPreviewData->rcDialogClient);
     rc.left += 4;
     rc.top += 2;
-    SetTextColor(hdc, RGB(0,0,0));
+    SetTextColor(hdc, theme->crColor[COLOR_BTNTEXT]);
     hOldFont = SelectObject(hdc, pPreviewData->hMessageFont);
-    DrawText(hdc, pPreviewData->lpMessText, lstrlen(pPreviewData->lpMessText), &rc, DT_LEFT);
+    DrawText(hdc, pPreviewData->lpMessText, -1, &rc, DT_LEFT);
     SelectObject(hdc, hOldFont);
 
     /* Draw Button */
-    DrawFrameControl(hdc, &pPreviewData->rcDialogButton, DFC_BUTTON, DFCS_BUTTONPUSH);
+    MyDrawFrameControl(hdc, &pPreviewData->rcDialogButton, DFC_BUTTON, DFCS_BUTTONPUSH, theme);
     CopyRect(&rc, &pPreviewData->rcDialogButton);
-    SetTextColor(hdc, pPreviewData->clrButtonText);
+    SetTextColor(hdc, theme->crColor[COLOR_BTNTEXT]);
     hOldFont = SelectObject(hdc, pPreviewData->hMessageFont);
-    DrawText(hdc, pPreviewData->lpButText, lstrlen(pPreviewData->lpButText), &rc, DT_VCENTER | DT_CENTER | DT_SINGLELINE);
+    DrawText(hdc, pPreviewData->lpButText, -1, &rc, DT_VCENTER | DT_CENTER | DT_SINGLELINE);
     SelectObject(hdc, hOldFont);
 
     EndPaint(hwnd, &ps);
@@ -417,12 +354,12 @@ OnLButtonDown(HWND hwnd, int xPos, int yPos, PPREVIEW_DATA pPreviewData)
     if (PtInRect(&pPreviewData->rcActiveCaptionButtons, pt))
         type = IDX_CAPTION_BUTTON;
 
-    if (PtInRect(&pPreviewData->rcActiveMenuBar, pt))
-        type = IDX_MENU;
-
 //    if (PtInRect(&pPreviewData->rcSelectedMenuItem, pt))
 //        type = IDX_SELECTION;
 
+    if (PtInRect(&pPreviewData->rcActiveMenuBar, pt))
+        type = IDX_MENU;
+
     if (PtInRect(&pPreviewData->rcActiveClient, pt))
         type = IDX_WINDOW;
 
@@ -441,7 +378,10 @@ OnLButtonDown(HWND hwnd, int xPos, int yPos, PPREVIEW_DATA pPreviewData)
     if (PtInRect(&pPreviewData->rcDialogButton, pt))
         type = IDX_3D_OBJECTS;
 
-    SendMessage(GetParent(hwnd), WM_USER, 0, type);
+    SendMessage(GetParent(hwnd),
+                WM_COMMAND,
+                MAKEWPARAM(GetWindowLongPtrW(hwnd, GWLP_ID), 0),
+                (LPARAM)type);
 }
 
 
@@ -555,14 +495,14 @@ PreviewWndProc(HWND hwnd,
             }
             break;
 
+        case PVM_UPDATETHEME:
+            UpdatePreviewTheme(hwnd, pPreviewData, (THEME *)lParam);
+            break;
+
         default:
-            DefWindowProc(hwnd,
-                          uMsg,
-                          wParam,
-                          lParam);
+            return DefWindowProc(hwnd, uMsg, wParam, lParam);
     }
-
-    return TRUE;
+    return FALSE;
 }
 
 
@@ -575,7 +515,7 @@ RegisterPreviewControl(IN HINSTANCE hInstance)
     wc.lpfnWndProc = PreviewWndProc;
     wc.hInstance = hInstance;
     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
-    wc.hbrBackground = (HBRUSH)NULL; //(COLOR_BTNFACE + 1);
+    wc.hbrBackground = (HBRUSH)NULL;
     wc.lpszClassName = szPreviewWndClass;
 
     return RegisterClassEx(&wc) != (ATOM)0;
@@ -585,6 +525,5 @@ RegisterPreviewControl(IN HINSTANCE hInstance)
 VOID
 UnregisterPreviewControl(IN HINSTANCE hInstance)
 {
-    UnregisterClass(szPreviewWndClass,
-                    hInstance);
+    UnregisterClass(szPreviewWndClass, hInstance);
 }