2007-01-27 14:53:18 +00:00
|
|
|
/*
|
2007-01-29 23:35:31 +00:00
|
|
|
* PROJECT: ReactOS Desktop Control Panel
|
2007-01-27 14:53:18 +00:00
|
|
|
* LICENSE: GPL - See COPYING in the top level directory
|
|
|
|
* FILE: lib/cpl/desk/preview.c
|
|
|
|
* PURPOSE: Draws the preview control
|
2007-03-10 21:25:03 +00:00
|
|
|
* COPYRIGHT: Copyright 2006, 2007 Eric Kohl
|
2007-01-27 14:53:18 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include "desk.h"
|
|
|
|
#include "preview.h"
|
|
|
|
|
|
|
|
static const TCHAR szPreviewWndClass[] = TEXT("PreviewWndClass");
|
|
|
|
|
|
|
|
typedef struct _PREVIEW_DATA
|
|
|
|
{
|
|
|
|
HWND hwndParent;
|
|
|
|
|
2007-03-10 21:25:03 +00:00
|
|
|
DWORD clrSysColor[COLOR_MENUBAR];
|
2007-01-27 14:53:18 +00:00
|
|
|
|
|
|
|
HBRUSH hbrScrollbar;
|
2007-03-10 21:25:03 +00:00
|
|
|
HBRUSH hbrDesktop;
|
|
|
|
HBRUSH hbrWindow;
|
2007-01-27 14:53:18 +00:00
|
|
|
|
|
|
|
INT cxEdge;
|
|
|
|
INT cyEdge;
|
|
|
|
|
2007-01-29 23:35:31 +00:00
|
|
|
INT cySizeFrame;
|
|
|
|
|
2007-01-27 14:53:18 +00:00
|
|
|
INT cyCaption;
|
2007-09-29 18:28:45 +00:00
|
|
|
INT cyBorder;
|
2007-01-29 23:35:31 +00:00
|
|
|
INT cyMenu;
|
|
|
|
INT cxScrollbar;
|
2007-01-27 14:53:18 +00:00
|
|
|
|
|
|
|
RECT rcDesktop;
|
|
|
|
RECT rcInactiveFrame;
|
|
|
|
RECT rcInactiveCaption;
|
|
|
|
RECT rcInactiveCaptionButtons;
|
|
|
|
|
|
|
|
RECT rcActiveFrame;
|
|
|
|
RECT rcActiveCaption;
|
|
|
|
RECT rcActiveCaptionButtons;
|
|
|
|
RECT rcActiveMenuBar;
|
|
|
|
RECT rcSelectedMenuItem;
|
|
|
|
RECT rcActiveClient;
|
|
|
|
RECT rcActiveScroll;
|
|
|
|
|
|
|
|
RECT rcDialogFrame;
|
|
|
|
RECT rcDialogCaption;
|
|
|
|
RECT rcDialogCaptionButtons;
|
|
|
|
RECT rcDialogClient;
|
|
|
|
|
|
|
|
RECT rcDialogButton;
|
|
|
|
|
|
|
|
LPTSTR lpInAct;
|
|
|
|
LPTSTR lpAct;
|
|
|
|
LPTSTR lpWinTxt;
|
|
|
|
LPTSTR lpMessBox;
|
|
|
|
LPTSTR lpMessText;
|
|
|
|
LPTSTR lpButText;
|
|
|
|
|
|
|
|
LOGFONT lfCaptionFont;
|
|
|
|
LOGFONT lfMenuFont;
|
|
|
|
LOGFONT lfMessageFont;
|
|
|
|
|
|
|
|
HFONT hCaptionFont;
|
|
|
|
HFONT hMenuFont;
|
|
|
|
HFONT hMessageFont;
|
|
|
|
|
|
|
|
HMENU hMenu;
|
|
|
|
|
|
|
|
} PREVIEW_DATA, *PPREVIEW_DATA;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static VOID
|
2007-01-29 23:35:31 +00:00
|
|
|
DrawCaptionButtons(HDC hdc, LPRECT lpRect, BOOL bMinMax, int x)
|
2007-01-27 14:53:18 +00:00
|
|
|
{
|
|
|
|
RECT rc3;
|
|
|
|
RECT rc4;
|
|
|
|
RECT rc5;
|
|
|
|
|
2007-01-29 23:35:31 +00:00
|
|
|
rc3.left = lpRect->right - 2 - x;
|
2007-01-27 14:53:18 +00:00
|
|
|
rc3.top = lpRect->top + 2;
|
|
|
|
rc3.right = lpRect->right - 2;
|
|
|
|
rc3.bottom = lpRect->bottom - 2;
|
|
|
|
|
|
|
|
DrawFrameControl(hdc, &rc3, DFC_CAPTION, DFCS_CAPTIONCLOSE);
|
|
|
|
|
|
|
|
if (bMinMax)
|
|
|
|
{
|
2007-01-29 23:35:31 +00:00
|
|
|
rc4.left = rc3.left - x - 2;
|
2007-01-27 14:53:18 +00:00
|
|
|
rc4.top = rc3.top;
|
2007-01-29 23:35:31 +00:00
|
|
|
rc4.right = rc3.right - x - 2;
|
2007-01-27 14:53:18 +00:00
|
|
|
rc4.bottom = rc3.bottom;
|
|
|
|
|
|
|
|
DrawFrameControl(hdc, &rc4, DFC_CAPTION, DFCS_CAPTIONMAX);
|
|
|
|
|
2007-01-29 23:35:31 +00:00
|
|
|
rc5.left = rc4.left - x;
|
2007-01-27 14:53:18 +00:00
|
|
|
rc5.top = rc4.top;
|
2007-01-29 23:35:31 +00:00
|
|
|
rc5.right = rc4.right - x;
|
2007-01-27 14:53:18 +00:00
|
|
|
rc5.bottom = rc4.bottom;
|
|
|
|
|
|
|
|
DrawFrameControl(hdc, &rc5, DFC_CAPTION, DFCS_CAPTIONMIN);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-01-29 23:35:31 +00:00
|
|
|
|
2007-01-27 14:53:18 +00:00
|
|
|
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;
|
2007-03-10 21:25:03 +00:00
|
|
|
INT i;
|
2007-01-27 14:53:18 +00:00
|
|
|
|
2007-03-10 21:25:03 +00:00
|
|
|
for (i = 0; i < COLOR_MENUBAR + 1; i++)
|
|
|
|
{
|
|
|
|
pPreviewData->clrSysColor[i] = GetSysColor(i);
|
|
|
|
}
|
2007-01-27 14:53:18 +00:00
|
|
|
|
2007-03-10 21:25:03 +00:00
|
|
|
pPreviewData->hbrScrollbar = CreateSolidBrush(pPreviewData->clrSysColor[COLOR_SCROLLBAR]);
|
|
|
|
pPreviewData->hbrDesktop = CreateSolidBrush(pPreviewData->clrSysColor[COLOR_DESKTOP]);
|
|
|
|
pPreviewData->hbrWindow = CreateSolidBrush(pPreviewData->clrSysColor[COLOR_WINDOW]);
|
2007-01-27 14:53:18 +00:00
|
|
|
|
2007-02-19 16:12:38 +00:00
|
|
|
pPreviewData->cxEdge = GetSystemMetrics(SM_CXEDGE) - 2;
|
|
|
|
pPreviewData->cyEdge = GetSystemMetrics(SM_CXEDGE) - 2;
|
2007-01-27 14:53:18 +00:00
|
|
|
|
2007-02-19 16:12:38 +00:00
|
|
|
pPreviewData->cySizeFrame = GetSystemMetrics(SM_CYSIZEFRAME) - 1;
|
2007-01-29 23:35:31 +00:00
|
|
|
|
|
|
|
pPreviewData->cyCaption = GetSystemMetrics(SM_CYCAPTION);
|
|
|
|
pPreviewData->cyMenu = GetSystemMetrics(SM_CYMENU);
|
|
|
|
pPreviewData->cxScrollbar = GetSystemMetrics(SM_CXVSCROLL);
|
2007-09-29 18:28:45 +00:00
|
|
|
pPreviewData->cyBorder = GetSystemMetrics(SM_CYBORDER);
|
2007-01-27 14:53:18 +00:00
|
|
|
|
|
|
|
/* 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);
|
|
|
|
|
|
|
|
/* Load and modify the menu */
|
|
|
|
pPreviewData->hMenu = LoadMenu(hApplet, MAKEINTRESOURCE(IDR_PREVIEW_MENU));
|
2007-03-04 18:41:47 +00:00
|
|
|
EnableMenuItem(pPreviewData->hMenu,
|
|
|
|
1, MF_BYPOSITION | MF_GRAYED);
|
2007-01-27 14:53:18 +00:00
|
|
|
HiliteMenuItem(hwnd, pPreviewData->hMenu,
|
2007-03-04 18:41:47 +00:00
|
|
|
2, MF_BYPOSITION | MF_HILITE);
|
2007-01-27 14:53:18 +00:00
|
|
|
|
|
|
|
// GetMenuItemRect(hwnd, pPreviewData->hMenu,
|
2007-03-04 18:41:47 +00:00
|
|
|
// 2, &pPreviewData->rcSelectedMenuItem);
|
2007-01-27 14:53:18 +00:00
|
|
|
|
|
|
|
AllocAndLoadString(&pPreviewData->lpInAct, hApplet, IDS_INACTWIN);
|
|
|
|
AllocAndLoadString(&pPreviewData->lpAct, hApplet, IDS_ACTWIN);
|
|
|
|
AllocAndLoadString(&pPreviewData->lpWinTxt, hApplet, IDS_WINTEXT);
|
|
|
|
AllocAndLoadString(&pPreviewData->lpMessBox, hApplet, IDS_MESSBOX);
|
|
|
|
AllocAndLoadString(&pPreviewData->lpMessText, hApplet, IDS_MESSTEXT);
|
|
|
|
AllocAndLoadString(&pPreviewData->lpButText, hApplet, IDS_BUTTEXT);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static VOID
|
2007-01-29 23:35:31 +00:00
|
|
|
CalculateItemSize(PPREVIEW_DATA pPreviewData)
|
2007-01-27 14:53:18 +00:00
|
|
|
{
|
|
|
|
int width, height;
|
|
|
|
|
|
|
|
/* Calculate the inactive window rectangle */
|
|
|
|
pPreviewData->rcInactiveFrame.left = pPreviewData->rcDesktop.left + 8;
|
|
|
|
pPreviewData->rcInactiveFrame.top = pPreviewData->rcDesktop.top + 8;
|
|
|
|
pPreviewData->rcInactiveFrame.right = pPreviewData->rcDesktop.right - 25;
|
|
|
|
pPreviewData->rcInactiveFrame.bottom = pPreviewData->rcDesktop.bottom - 30;
|
|
|
|
|
|
|
|
/* Calculate the inactive caption rectangle */
|
2007-02-19 16:12:38 +00:00
|
|
|
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;
|
2007-09-29 18:28:45 +00:00
|
|
|
pPreviewData->rcInactiveCaption.bottom = pPreviewData->rcInactiveCaption.top + pPreviewData->cyCaption - pPreviewData->cyBorder;
|
2007-01-27 14:53:18 +00:00
|
|
|
|
|
|
|
/* Calculate the inactive caption buttons rectangle */
|
|
|
|
pPreviewData->rcInactiveCaptionButtons.left = pPreviewData->rcInactiveCaption.right - 2 - 2 - 3 * 16;
|
|
|
|
pPreviewData->rcInactiveCaptionButtons.top = pPreviewData->rcInactiveCaption.top + 2;
|
|
|
|
pPreviewData->rcInactiveCaptionButtons.right = pPreviewData->rcInactiveCaption.right - 2;
|
|
|
|
pPreviewData->rcInactiveCaptionButtons.bottom = pPreviewData->rcInactiveCaption.bottom - 2;
|
|
|
|
|
|
|
|
/* Calculate the active window rectangle */
|
2007-02-19 16:12:38 +00:00
|
|
|
pPreviewData->rcActiveFrame.left = pPreviewData->rcInactiveFrame.left + 3 + pPreviewData->cySizeFrame;
|
2007-01-27 14:53:18 +00:00
|
|
|
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 */
|
2007-02-19 16:12:38 +00:00
|
|
|
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;
|
2007-09-29 18:28:45 +00:00
|
|
|
pPreviewData->rcActiveCaption.bottom = pPreviewData->rcActiveCaption.top + pPreviewData->cyCaption - pPreviewData->cyBorder;
|
2007-01-27 14:53:18 +00:00
|
|
|
|
|
|
|
/* Calculate the active caption buttons rectangle */
|
|
|
|
pPreviewData->rcActiveCaptionButtons.left = pPreviewData->rcActiveCaption.right - 2 - 2 - 3 * 16;
|
|
|
|
pPreviewData->rcActiveCaptionButtons.top = pPreviewData->rcActiveCaption.top + 2;
|
|
|
|
pPreviewData->rcActiveCaptionButtons.right = pPreviewData->rcActiveCaption.right - 2;
|
|
|
|
pPreviewData->rcActiveCaptionButtons.bottom = pPreviewData->rcActiveCaption.bottom - 2;
|
|
|
|
|
|
|
|
/* Calculate the active menu bar rectangle */
|
2007-02-19 16:12:38 +00:00
|
|
|
pPreviewData->rcActiveMenuBar.left = pPreviewData->rcActiveFrame.left + pPreviewData->cxEdge + pPreviewData->cySizeFrame + 1;
|
2007-01-27 14:53:18 +00:00
|
|
|
pPreviewData->rcActiveMenuBar.top = pPreviewData->rcActiveCaption.bottom + 1;
|
2007-02-19 16:12:38 +00:00
|
|
|
pPreviewData->rcActiveMenuBar.right = pPreviewData->rcActiveFrame.right - pPreviewData->cxEdge - pPreviewData->cySizeFrame - 1;
|
2007-01-29 23:35:31 +00:00
|
|
|
pPreviewData->rcActiveMenuBar.bottom = pPreviewData->rcActiveMenuBar.top + pPreviewData->cyMenu + 1;
|
2007-01-27 14:53:18 +00:00
|
|
|
|
|
|
|
/* Calculate the active client rectangle */
|
2007-02-19 16:12:38 +00:00
|
|
|
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;
|
2007-01-27 14:53:18 +00:00
|
|
|
|
|
|
|
/* Calculate the active scroll rectangle */
|
2007-01-29 23:35:31 +00:00
|
|
|
pPreviewData->rcActiveScroll.left = pPreviewData->rcActiveClient.right - 2 - pPreviewData->cxScrollbar;
|
2007-01-27 14:53:18 +00:00
|
|
|
pPreviewData->rcActiveScroll.top = pPreviewData->rcActiveClient.top + 2;
|
|
|
|
pPreviewData->rcActiveScroll.right = pPreviewData->rcActiveClient.right - 2;
|
|
|
|
pPreviewData->rcActiveScroll.bottom = pPreviewData->rcActiveClient.bottom - 2;
|
|
|
|
|
|
|
|
|
|
|
|
/* Dialog window */
|
|
|
|
pPreviewData->rcDialogFrame.left = pPreviewData->rcActiveClient.left + 4;
|
|
|
|
pPreviewData->rcDialogFrame.top = (pPreviewData->rcDesktop.bottom * 60) / 100;
|
|
|
|
pPreviewData->rcDialogFrame.right = (pPreviewData->rcDesktop.right * 65) / 100;
|
|
|
|
pPreviewData->rcDialogFrame.bottom = pPreviewData->rcDesktop.bottom - 5;
|
|
|
|
|
|
|
|
/* Calculate the dialog caption rectangle */
|
|
|
|
pPreviewData->rcDialogCaption.left = pPreviewData->rcDialogFrame.left + 3;
|
|
|
|
pPreviewData->rcDialogCaption.top = pPreviewData->rcDialogFrame.top + 3;
|
|
|
|
pPreviewData->rcDialogCaption.right = pPreviewData->rcDialogFrame.right - 3;
|
2007-01-29 23:35:31 +00:00
|
|
|
pPreviewData->rcDialogCaption.bottom = pPreviewData->rcDialogFrame.top + pPreviewData->cyCaption + 1 + 1;
|
2007-01-27 14:53:18 +00:00
|
|
|
|
|
|
|
/* Calculate the inactive caption buttons rectangle */
|
|
|
|
pPreviewData->rcDialogCaptionButtons.left = pPreviewData->rcDialogCaption.right - 2 - 16;
|
|
|
|
pPreviewData->rcDialogCaptionButtons.top = pPreviewData->rcDialogCaption.top + 2;
|
|
|
|
pPreviewData->rcDialogCaptionButtons.right = pPreviewData->rcDialogCaption.right - 2;
|
|
|
|
pPreviewData->rcDialogCaptionButtons.bottom = pPreviewData->rcDialogCaption.bottom - 2;
|
|
|
|
|
|
|
|
/* Calculate the dialog client rectangle */
|
|
|
|
pPreviewData->rcDialogClient.left = pPreviewData->rcDialogFrame.left + 3;
|
|
|
|
pPreviewData->rcDialogClient.top = pPreviewData->rcDialogCaption.bottom + 1;
|
|
|
|
pPreviewData->rcDialogClient.right = pPreviewData->rcDialogFrame.right - 3;
|
|
|
|
pPreviewData->rcDialogClient.bottom = pPreviewData->rcDialogFrame.bottom - 3;
|
|
|
|
|
|
|
|
/* Calculate the dialog button rectangle */
|
|
|
|
width = 80;
|
|
|
|
height = 28;
|
|
|
|
|
|
|
|
pPreviewData->rcDialogButton.left =
|
|
|
|
(pPreviewData->rcDialogClient.right + pPreviewData->rcDialogClient.left - width) / 2;
|
|
|
|
pPreviewData->rcDialogButton.right = pPreviewData->rcDialogButton.left + width;
|
|
|
|
pPreviewData->rcDialogButton.bottom = pPreviewData->rcDialogClient.bottom - 2;
|
|
|
|
pPreviewData->rcDialogButton.top = pPreviewData->rcDialogButton.bottom - height;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-01-29 23:35:31 +00:00
|
|
|
static VOID
|
|
|
|
OnSize(INT cx, INT cy, PPREVIEW_DATA pPreviewData)
|
|
|
|
{
|
|
|
|
/* Get Desktop rectangle */
|
|
|
|
pPreviewData->rcDesktop.left = 0;
|
|
|
|
pPreviewData->rcDesktop.top = 0;
|
|
|
|
pPreviewData->rcDesktop.right = cx;
|
|
|
|
pPreviewData->rcDesktop.bottom = cy;
|
|
|
|
|
|
|
|
CalculateItemSize(pPreviewData);
|
|
|
|
}
|
|
|
|
|
2007-02-28 23:43:12 +00:00
|
|
|
#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
|
2007-01-29 23:35:31 +00:00
|
|
|
|
2007-01-27 14:53:18 +00:00
|
|
|
static VOID
|
|
|
|
OnPaint(HWND hwnd, PPREVIEW_DATA pPreviewData)
|
|
|
|
{
|
|
|
|
PAINTSTRUCT ps;
|
|
|
|
HFONT hOldFont;
|
|
|
|
HDC hdc;
|
|
|
|
RECT rc;
|
|
|
|
|
2007-02-28 23:43:12 +00:00
|
|
|
#ifdef _MSC_VER
|
|
|
|
DCT_PROC DrawCaptionTemp;
|
|
|
|
DMBT_PROC DrawMenuBarTemp;
|
|
|
|
HMODULE hUser32;
|
|
|
|
|
|
|
|
hUser32 = LoadLibrary(_T("user32.dll"));
|
|
|
|
if(hUser32 == NULL)
|
2009-08-02 17:38:27 +00:00
|
|
|
return;
|
2007-02-28 23:43:12 +00:00
|
|
|
|
|
|
|
DrawCaptionTemp = (DCT_PROC)GetProcAddress(hUser32, (LPCSTR)DCT_ORD);
|
|
|
|
DrawMenuBarTemp = (DMBT_PROC)GetProcAddress(hUser32, (LPCSTR)DMBT_ORD);
|
|
|
|
#endif
|
|
|
|
|
2007-01-27 14:53:18 +00:00
|
|
|
hdc = BeginPaint(hwnd, &ps);
|
|
|
|
|
|
|
|
/* Desktop */
|
|
|
|
FillRect(hdc, &pPreviewData->rcDesktop, pPreviewData->hbrDesktop);
|
|
|
|
|
|
|
|
/* Inactive Window */
|
|
|
|
DrawEdge(hdc, &pPreviewData->rcInactiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE);
|
2007-03-10 21:25:03 +00:00
|
|
|
SetTextColor(hdc, pPreviewData->clrSysColor[COLOR_INACTIVECAPTIONTEXT]);
|
2007-01-27 14:53:18 +00:00
|
|
|
DrawCaptionTemp(NULL, hdc, &pPreviewData->rcInactiveCaption, pPreviewData->hCaptionFont,
|
|
|
|
NULL, pPreviewData->lpInAct, DC_GRADIENT | DC_ICON | DC_TEXT);
|
2007-01-29 23:35:31 +00:00
|
|
|
DrawCaptionButtons(hdc, &pPreviewData->rcInactiveCaption, TRUE, pPreviewData->cyCaption - 2);
|
2007-01-27 14:53:18 +00:00
|
|
|
|
|
|
|
/* Active Window */
|
|
|
|
DrawEdge(hdc, &pPreviewData->rcActiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE);
|
2007-03-10 21:25:03 +00:00
|
|
|
SetTextColor(hdc, pPreviewData->clrSysColor[COLOR_CAPTIONTEXT]);
|
2007-01-27 14:53:18 +00:00
|
|
|
DrawCaptionTemp(NULL, hdc, &pPreviewData->rcActiveCaption, pPreviewData->hCaptionFont,
|
|
|
|
NULL, pPreviewData->lpAct, DC_ACTIVE | DC_GRADIENT | DC_ICON | DC_TEXT);
|
2007-01-29 23:35:31 +00:00
|
|
|
DrawCaptionButtons(hdc, &pPreviewData->rcActiveCaption, TRUE, pPreviewData->cyCaption - 2);
|
2007-01-27 14:53:18 +00:00
|
|
|
|
2007-02-19 16:12:38 +00:00
|
|
|
/* Draw the menu bar */
|
2007-01-27 14:53:18 +00:00
|
|
|
DrawMenuBarTemp(hwnd, hdc, &pPreviewData->rcActiveMenuBar,
|
2007-02-19 16:12:38 +00:00
|
|
|
pPreviewData->hMenu,
|
2007-02-25 21:58:20 +00:00
|
|
|
pPreviewData->hMenuFont);
|
2007-01-27 14:53:18 +00:00
|
|
|
|
|
|
|
/* Draw the client area */
|
|
|
|
CopyRect(&rc, &pPreviewData->rcActiveClient);
|
|
|
|
DrawEdge(hdc, &rc, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
|
|
|
|
FillRect(hdc, &rc, pPreviewData->hbrWindow);
|
|
|
|
|
|
|
|
/* Draw the client text */
|
|
|
|
CopyRect(&rc, &pPreviewData->rcActiveClient);
|
|
|
|
rc.left += 4;
|
|
|
|
rc.top += 2;
|
2007-03-10 21:25:03 +00:00
|
|
|
SetTextColor(hdc, pPreviewData->clrSysColor[COLOR_WINDOWTEXT]);
|
2007-03-04 18:41:47 +00:00
|
|
|
hOldFont = SelectObject(hdc, pPreviewData->hCaptionFont);
|
2007-01-27 14:53:18 +00:00
|
|
|
DrawText(hdc, pPreviewData->lpWinTxt, lstrlen(pPreviewData->lpWinTxt), &rc, DT_LEFT);
|
|
|
|
SelectObject(hdc, hOldFont);
|
|
|
|
|
|
|
|
/* Draw the scroll bar */
|
|
|
|
DrawScrollbar(hdc, &pPreviewData->rcActiveScroll, pPreviewData->hbrScrollbar);
|
|
|
|
|
|
|
|
/* Dialog Window */
|
|
|
|
DrawEdge(hdc, &pPreviewData->rcDialogFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE);
|
2007-03-10 21:25:03 +00:00
|
|
|
SetTextColor(hdc, pPreviewData->clrSysColor[COLOR_WINDOW]);
|
2007-01-27 14:53:18 +00:00
|
|
|
DrawCaptionTemp(NULL, hdc, &pPreviewData->rcDialogCaption, pPreviewData->hCaptionFont,
|
|
|
|
NULL, pPreviewData->lpMessBox, DC_ACTIVE | DC_GRADIENT | DC_ICON | DC_TEXT);
|
2007-01-29 23:35:31 +00:00
|
|
|
DrawCaptionButtons(hdc, &pPreviewData->rcDialogCaption, FALSE, pPreviewData->cyCaption - 2);
|
2007-01-27 14:53:18 +00:00
|
|
|
|
|
|
|
/* Draw the dialog text */
|
|
|
|
CopyRect(&rc, &pPreviewData->rcDialogClient);
|
|
|
|
rc.left += 4;
|
|
|
|
rc.top += 2;
|
|
|
|
SetTextColor(hdc, RGB(0,0,0));
|
|
|
|
hOldFont = SelectObject(hdc, pPreviewData->hMessageFont);
|
|
|
|
DrawText(hdc, pPreviewData->lpMessText, lstrlen(pPreviewData->lpMessText), &rc, DT_LEFT);
|
|
|
|
SelectObject(hdc, hOldFont);
|
|
|
|
|
|
|
|
/* Draw Button */
|
|
|
|
DrawFrameControl(hdc, &pPreviewData->rcDialogButton, DFC_BUTTON, DFCS_BUTTONPUSH);
|
|
|
|
CopyRect(&rc, &pPreviewData->rcDialogButton);
|
2007-03-10 21:25:03 +00:00
|
|
|
SetTextColor(hdc, pPreviewData->clrSysColor[COLOR_BTNTEXT]);
|
2007-01-27 14:53:18 +00:00
|
|
|
hOldFont = SelectObject(hdc, pPreviewData->hMessageFont);
|
|
|
|
DrawText(hdc, pPreviewData->lpButText, lstrlen(pPreviewData->lpButText), &rc, DT_VCENTER | DT_CENTER | DT_SINGLELINE);
|
|
|
|
SelectObject(hdc, hOldFont);
|
|
|
|
|
|
|
|
EndPaint(hwnd, &ps);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static VOID
|
|
|
|
OnLButtonDown(HWND hwnd, int xPos, int yPos, PPREVIEW_DATA pPreviewData)
|
|
|
|
{
|
|
|
|
UINT type = IDX_DESKTOP;
|
|
|
|
POINT pt;
|
|
|
|
|
|
|
|
pt.x = xPos;
|
|
|
|
pt.y = yPos;
|
|
|
|
|
|
|
|
if (PtInRect(&pPreviewData->rcInactiveFrame, pt))
|
|
|
|
type = IDX_INACTIVE_BORDER;
|
|
|
|
|
|
|
|
if (PtInRect(&pPreviewData->rcInactiveCaption, pt))
|
|
|
|
type = IDX_INACTIVE_CAPTION;
|
|
|
|
|
|
|
|
if (PtInRect(&pPreviewData->rcInactiveCaptionButtons, pt))
|
|
|
|
type = IDX_CAPTION_BUTTON;
|
|
|
|
|
|
|
|
if (PtInRect(&pPreviewData->rcActiveFrame, pt))
|
|
|
|
type = IDX_ACTIVE_BORDER;
|
|
|
|
|
|
|
|
if (PtInRect(&pPreviewData->rcActiveCaption, pt))
|
|
|
|
type = IDX_ACTIVE_CAPTION;
|
|
|
|
|
|
|
|
if (PtInRect(&pPreviewData->rcActiveCaptionButtons, pt))
|
|
|
|
type = IDX_CAPTION_BUTTON;
|
|
|
|
|
|
|
|
// if (PtInRect(&pPreviewData->rcSelectedMenuItem, pt))
|
|
|
|
// type = IDX_SELECTION;
|
|
|
|
|
2007-03-04 18:41:47 +00:00
|
|
|
if (PtInRect(&pPreviewData->rcActiveMenuBar, pt))
|
|
|
|
type = IDX_MENU;
|
|
|
|
|
2007-01-27 14:53:18 +00:00
|
|
|
if (PtInRect(&pPreviewData->rcActiveClient, pt))
|
|
|
|
type = IDX_WINDOW;
|
|
|
|
|
|
|
|
if (PtInRect(&pPreviewData->rcActiveScroll, pt))
|
|
|
|
type = IDX_SCROLLBAR;
|
|
|
|
|
|
|
|
if (PtInRect(&pPreviewData->rcDialogFrame, pt))
|
|
|
|
type = IDX_DIALOG;
|
|
|
|
|
|
|
|
if (PtInRect(&pPreviewData->rcDialogCaption, pt))
|
|
|
|
type = IDX_ACTIVE_CAPTION;
|
|
|
|
|
|
|
|
if (PtInRect(&pPreviewData->rcDialogCaptionButtons, pt))
|
|
|
|
type = IDX_CAPTION_BUTTON;
|
|
|
|
|
|
|
|
if (PtInRect(&pPreviewData->rcDialogButton, pt))
|
|
|
|
type = IDX_3D_OBJECTS;
|
|
|
|
|
2007-02-17 21:40:39 +00:00
|
|
|
SendMessage(GetParent(hwnd),
|
|
|
|
WM_COMMAND,
|
|
|
|
MAKEWPARAM(GetWindowLongPtrW(hwnd, GWLP_ID), 0),
|
|
|
|
(LPARAM)type);
|
2007-01-27 14:53:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static VOID
|
|
|
|
OnDestroy(PPREVIEW_DATA pPreviewData)
|
|
|
|
{
|
|
|
|
DeleteObject(pPreviewData->hbrScrollbar);
|
|
|
|
DeleteObject(pPreviewData->hbrDesktop);
|
|
|
|
DeleteObject(pPreviewData->hbrWindow);
|
|
|
|
|
|
|
|
DeleteObject(pPreviewData->hCaptionFont);
|
|
|
|
DeleteObject(pPreviewData->hMenuFont);
|
|
|
|
DeleteObject(pPreviewData->hMessageFont);
|
|
|
|
|
|
|
|
DestroyMenu(pPreviewData->hMenu);
|
|
|
|
|
|
|
|
LocalFree((HLOCAL)pPreviewData->lpInAct);
|
|
|
|
LocalFree((HLOCAL)pPreviewData->lpAct);
|
|
|
|
LocalFree((HLOCAL)pPreviewData->lpWinTxt);
|
|
|
|
LocalFree((HLOCAL)pPreviewData->lpMessBox);
|
|
|
|
LocalFree((HLOCAL)pPreviewData->lpMessText);
|
|
|
|
LocalFree((HLOCAL)pPreviewData->lpButText);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static LRESULT CALLBACK
|
|
|
|
PreviewWndProc(HWND hwnd,
|
|
|
|
UINT uMsg,
|
|
|
|
WPARAM wParam,
|
|
|
|
LPARAM lParam)
|
|
|
|
{
|
|
|
|
PPREVIEW_DATA pPreviewData;
|
|
|
|
|
|
|
|
pPreviewData = (PPREVIEW_DATA)GetWindowLongPtr(hwnd, GWLP_USERDATA);
|
|
|
|
|
|
|
|
switch (uMsg)
|
|
|
|
{
|
|
|
|
case WM_CREATE:
|
|
|
|
pPreviewData = (PPREVIEW_DATA)HeapAlloc(GetProcessHeap(),
|
|
|
|
HEAP_ZERO_MEMORY,
|
|
|
|
sizeof(PREVIEW_DATA));
|
|
|
|
if (!pPreviewData)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pPreviewData);
|
|
|
|
OnCreate(hwnd, pPreviewData);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case WM_SIZE:
|
|
|
|
OnSize(LOWORD(lParam), HIWORD(lParam), pPreviewData);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case WM_PAINT:
|
|
|
|
OnPaint(hwnd, pPreviewData);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case WM_LBUTTONDOWN:
|
|
|
|
OnLButtonDown(hwnd, LOWORD(lParam), HIWORD(lParam), pPreviewData);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case WM_DESTROY:
|
|
|
|
OnDestroy(pPreviewData);
|
|
|
|
HeapFree(GetProcessHeap(), 0, pPreviewData);
|
|
|
|
break;
|
|
|
|
|
2007-01-29 23:35:31 +00:00
|
|
|
case PVM_GETCYCAPTION:
|
|
|
|
return pPreviewData->cyCaption;
|
|
|
|
|
|
|
|
case PVM_SETCYCAPTION:
|
|
|
|
if ((INT)lParam > 0)
|
|
|
|
{
|
|
|
|
pPreviewData->cyCaption = (INT)lParam;
|
|
|
|
CalculateItemSize(pPreviewData);
|
|
|
|
InvalidateRect(hwnd, NULL, FALSE);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case PVM_GETCYMENU:
|
|
|
|
return pPreviewData->cyMenu;
|
|
|
|
|
|
|
|
case PVM_SETCYMENU:
|
|
|
|
if ((INT)lParam > 0)
|
|
|
|
{
|
|
|
|
pPreviewData->cyMenu = (INT)lParam;
|
|
|
|
CalculateItemSize(pPreviewData);
|
|
|
|
InvalidateRect(hwnd, NULL, FALSE);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case PVM_GETCXSCROLLBAR:
|
|
|
|
return pPreviewData->cxScrollbar;
|
|
|
|
|
|
|
|
case PVM_SETCXSCROLLBAR:
|
|
|
|
if ((INT)lParam > 0)
|
|
|
|
{
|
|
|
|
pPreviewData->cxScrollbar = (INT)lParam;
|
|
|
|
CalculateItemSize(pPreviewData);
|
|
|
|
InvalidateRect(hwnd, NULL, FALSE);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case PVM_GETCYSIZEFRAME:
|
|
|
|
return pPreviewData->cySizeFrame;
|
|
|
|
|
|
|
|
case PVM_SETCYSIZEFRAME:
|
|
|
|
if ((INT)lParam > 0)
|
|
|
|
{
|
|
|
|
pPreviewData->cySizeFrame = (INT)lParam;
|
|
|
|
CalculateItemSize(pPreviewData);
|
|
|
|
InvalidateRect(hwnd, NULL, FALSE);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2007-02-25 21:58:20 +00:00
|
|
|
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;
|
|
|
|
|
2007-03-10 21:25:03 +00:00
|
|
|
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;
|
|
|
|
|
2007-01-27 14:53:18 +00:00
|
|
|
default:
|
|
|
|
DefWindowProc(hwnd,
|
|
|
|
uMsg,
|
|
|
|
wParam,
|
|
|
|
lParam);
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
BOOL
|
|
|
|
RegisterPreviewControl(IN HINSTANCE hInstance)
|
|
|
|
{
|
|
|
|
WNDCLASSEX wc = {0};
|
|
|
|
|
|
|
|
wc.cbSize = sizeof(WNDCLASSEX);
|
|
|
|
wc.lpfnWndProc = PreviewWndProc;
|
|
|
|
wc.hInstance = hInstance;
|
|
|
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
2007-02-19 16:12:38 +00:00
|
|
|
wc.hbrBackground = (HBRUSH)NULL;
|
2007-01-27 14:53:18 +00:00
|
|
|
wc.lpszClassName = szPreviewWndClass;
|
|
|
|
|
|
|
|
return RegisterClassEx(&wc) != (ATOM)0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
VOID
|
|
|
|
UnregisterPreviewControl(IN HINSTANCE hInstance)
|
|
|
|
{
|
|
|
|
UnregisterClass(szPreviewWndClass,
|
|
|
|
hInstance);
|
|
|
|
}
|