* 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"
{
HWND hwndParent;
- DWORD clrDesktop;
- HBRUSH hbrDesktop;
-
- DWORD clrWindow;
- HBRUSH hbrWindow;
+ DWORD clrSysColor[COLOR_MENUBAR];
- DWORD clrScrollbar;
HBRUSH hbrScrollbar;
-
- DWORD clrActiveCaptionText;
- DWORD clrInactiveCaptionText;
- DWORD clrWindowText;
- DWORD clrButtonText;
+ HBRUSH hbrDesktop;
+ HBRUSH hbrWindow;
INT cxEdge;
INT cyEdge;
INT cySizeFrame;
INT cyCaption;
+ INT cyBorder;
INT cyMenu;
INT cxScrollbar;
OnCreate(HWND hwnd, PPREVIEW_DATA pPreviewData)
{
NONCLIENTMETRICS NonClientMetrics;
+ INT i;
- 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);
+ for (i = 0; i < COLOR_MENUBAR + 1; i++)
+ {
+ pPreviewData->clrSysColor[i] = GetSysColor(i);
+ }
- pPreviewData->clrActiveCaptionText = GetSysColor(COLOR_CAPTIONTEXT);
- pPreviewData->clrInactiveCaptionText = GetSysColor(COLOR_INACTIVECAPTIONTEXT);
- pPreviewData->clrWindowText = GetSysColor(COLOR_WINDOWTEXT);
- pPreviewData->clrButtonText = GetSysColor(COLOR_BTNTEXT);
+ pPreviewData->hbrScrollbar = CreateSolidBrush(pPreviewData->clrSysColor[COLOR_SCROLLBAR]);
+ pPreviewData->hbrDesktop = CreateSolidBrush(pPreviewData->clrSysColor[COLOR_DESKTOP]);
+ pPreviewData->hbrWindow = CreateSolidBrush(pPreviewData->clrSysColor[COLOR_WINDOW]);
pPreviewData->cxEdge = GetSystemMetrics(SM_CXEDGE) - 2;
pPreviewData->cyEdge = GetSystemMetrics(SM_CXEDGE) - 2;
pPreviewData->cyCaption = GetSystemMetrics(SM_CYCAPTION);
pPreviewData->cyMenu = GetSystemMetrics(SM_CYMENU);
pPreviewData->cxScrollbar = GetSystemMetrics(SM_CXVSCROLL);
+ pPreviewData->cyBorder = GetSystemMetrics(SM_CYBORDER);
/* load font info */
NonClientMetrics.cbSize = sizeof(NONCLIENTMETRICS);
/* 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);
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->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;
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->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;
CalculateItemSize(pPreviewData);
}
+#ifdef _MSC_VER
+
+#if _UNICODE
+typedef BOOL (WINAPI * DCT_PROC)(HWND hwnd, HDC hdc, const RECT *rect, HFONT hFont, HICON hIcon, LPCWSTR str, UINT uFlags);
+#define DCT_ORD 178
+#else
+typedef BOOL (WINAPI * DCT_PROC)(HWND hwnd, HDC hdc, const RECT *rect, HFONT hFont, HICON hIcon, LPCSTR str, UINT uFlags);
+#define DCT_ORD 177
+#endif
+
+typedef DWORD (WINAPI * DMBT_PROC)(HWND hwnd, HDC hDC, LPRECT lprect, HMENU hMenu, HFONT hFont);
+#define DMBT_ORD 186
+
+#endif
static VOID
OnPaint(HWND hwnd, PPREVIEW_DATA pPreviewData)
HDC hdc;
RECT rc;
+#ifdef _MSC_VER
+ DCT_PROC DrawCaptionTemp;
+ DMBT_PROC DrawMenuBarTemp;
+ HMODULE hUser32;
+
+ hUser32 = LoadLibrary(_T("user32.dll"));
+ if(hUser32 == NULL)
+ return;
+
+ DrawCaptionTemp = (DCT_PROC)GetProcAddress(hUser32, (LPCSTR)DCT_ORD);
+ DrawMenuBarTemp = (DMBT_PROC)GetProcAddress(hUser32, (LPCSTR)DMBT_ORD);
+#endif
+
hdc = BeginPaint(hwnd, &ps);
/* Desktop */
/* Inactive Window */
DrawEdge(hdc, &pPreviewData->rcInactiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE);
- SetTextColor(hdc, pPreviewData->clrInactiveCaptionText);
+ SetTextColor(hdc, pPreviewData->clrSysColor[COLOR_INACTIVECAPTIONTEXT]);
DrawCaptionTemp(NULL, hdc, &pPreviewData->rcInactiveCaption, pPreviewData->hCaptionFont,
NULL, pPreviewData->lpInAct, DC_GRADIENT | DC_ICON | DC_TEXT);
DrawCaptionButtons(hdc, &pPreviewData->rcInactiveCaption, TRUE, pPreviewData->cyCaption - 2);
/* Active Window */
DrawEdge(hdc, &pPreviewData->rcActiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE);
- SetTextColor(hdc, pPreviewData->clrActiveCaptionText);
+ SetTextColor(hdc, pPreviewData->clrSysColor[COLOR_CAPTIONTEXT]);
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);
CopyRect(&rc, &pPreviewData->rcActiveClient);
rc.left += 4;
rc.top += 2;
- SetTextColor(hdc, pPreviewData->clrWindowText);
- hOldFont = SelectObject(hdc, pPreviewData->hMessageFont);
+ SetTextColor(hdc, pPreviewData->clrSysColor[COLOR_WINDOWTEXT]);
+ hOldFont = SelectObject(hdc, pPreviewData->hCaptionFont);
DrawText(hdc, pPreviewData->lpWinTxt, lstrlen(pPreviewData->lpWinTxt), &rc, DT_LEFT);
SelectObject(hdc, hOldFont);
/* Dialog Window */
DrawEdge(hdc, &pPreviewData->rcDialogFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE);
- SetTextColor(hdc, pPreviewData->clrActiveCaptionText);
+ SetTextColor(hdc, pPreviewData->clrSysColor[COLOR_WINDOW]);
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);
/* Draw Button */
DrawFrameControl(hdc, &pPreviewData->rcDialogButton, DFC_BUTTON, DFCS_BUTTONPUSH);
CopyRect(&rc, &pPreviewData->rcDialogButton);
- SetTextColor(hdc, pPreviewData->clrButtonText);
+ SetTextColor(hdc, pPreviewData->clrSysColor[COLOR_BTNTEXT]);
hOldFont = SelectObject(hdc, pPreviewData->hMessageFont);
DrawText(hdc, pPreviewData->lpButText, lstrlen(pPreviewData->lpButText), &rc, DT_VCENTER | DT_CENTER | DT_SINGLELINE);
SelectObject(hdc, hOldFont);
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;
InvalidateRect(hwnd, NULL, FALSE);
break;
+ case PVM_SETCOLOR:
+ pPreviewData->clrSysColor[(INT)wParam] = (DWORD)lParam;
+ switch((INT)wParam)
+ {
+ case COLOR_SCROLLBAR:
+ DeleteObject(pPreviewData->hbrScrollbar);
+ pPreviewData->hbrScrollbar = CreateSolidBrush(pPreviewData->clrSysColor[COLOR_SCROLLBAR]);
+ break;
+
+ case COLOR_DESKTOP:
+ DeleteObject(pPreviewData->hbrDesktop);
+ pPreviewData->hbrDesktop = CreateSolidBrush(pPreviewData->clrSysColor[COLOR_DESKTOP]);
+ break;
+
+ case COLOR_WINDOW:
+ DeleteObject(pPreviewData->hbrWindow);
+ pPreviewData->hbrWindow = CreateSolidBrush(pPreviewData->clrSysColor[COLOR_WINDOW]);
+ break;
+ }
+ InvalidateRect(hwnd, NULL, FALSE);
+ break;
+
default:
DefWindowProc(hwnd,
uMsg,