* 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);
- pPreviewData->cyEdge = GetSystemMetrics(SM_CXEDGE);
+ pPreviewData->cxEdge = GetSystemMetrics(SM_CXEDGE) - 2;
+ pPreviewData->cyEdge = GetSystemMetrics(SM_CXEDGE) - 2;
- pPreviewData->cySizeFrame = GetSystemMetrics(SM_CYSIZEFRAME);
+ pPreviewData->cySizeFrame = GetSystemMetrics(SM_CYSIZEFRAME) - 1;
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->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;
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;
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;
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);
- /* FIXME: Draw the menu bar */
+ /* Draw the menu bar */
DrawMenuBarTemp(hwnd, hdc, &pPreviewData->rcActiveMenuBar,
- pPreviewData->hMenu /*HMENU hMenu*/,
- pPreviewData->hMessageFont /*HFONT hFont*/);
+ pPreviewData->hMenu,
+ pPreviewData->hMenuFont);
/* Draw the client area */
CopyRect(&rc, &pPreviewData->rcActiveClient);
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;
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);
}
}
break;
+ case PVM_SETCAPTIONFONT:
+ CopyMemory(&pPreviewData->lfCaptionFont, (LOGFONT*)lParam, sizeof(LOGFONT));
+ DeleteObject(pPreviewData->hCaptionFont);
+ pPreviewData->hCaptionFont = CreateFontIndirect(&pPreviewData->lfCaptionFont);
+ CalculateItemSize(pPreviewData);
+ InvalidateRect(hwnd, NULL, FALSE);
+ break;
+
+ case PVM_SETMENUFONT:
+ CopyMemory(&pPreviewData->lfMenuFont, (LOGFONT*)lParam, sizeof(LOGFONT));
+ DeleteObject(pPreviewData->hMenuFont);
+ pPreviewData->hMenuFont = CreateFontIndirect(&pPreviewData->lfMenuFont);
+ CalculateItemSize(pPreviewData);
+ InvalidateRect(hwnd, NULL, FALSE);
+ break;
+
+ case PVM_SETDIALOGFONT:
+ CopyMemory(&pPreviewData->lfMessageFont, (LOGFONT*)lParam, sizeof(LOGFONT));
+ DeleteObject(pPreviewData->hMessageFont);
+ pPreviewData->hMessageFont = CreateFontIndirect(&pPreviewData->lfMessageFont);
+ CalculateItemSize(pPreviewData);
+ 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,
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;