📄 preview.c
字号:
/*
* PROJECT: ReactOS Desktop Control Panel
* 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
*/
#include "desk.h"
#include "preview.h"
static const TCHAR szPreviewWndClass[] = TEXT("PreviewWndClass");
typedef struct _PREVIEW_DATA
{
HWND hwndParent;
DWORD clrSysColor[COLOR_MENUBAR];
HBRUSH hbrScrollbar;
HBRUSH hbrDesktop;
HBRUSH hbrWindow;
INT cxEdge;
INT cyEdge;
INT cySizeFrame;
INT cyCaption;
INT cyMenu;
INT cxScrollbar;
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
DrawCaptionButtons(HDC hdc, LPRECT lpRect, BOOL bMinMax, int x)
{
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);
}
}
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;
INT i;
for (i = 0; i < COLOR_MENUBAR + 1; i++)
{
pPreviewData->clrSysColor[i] = GetSysColor(i);
}
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->cySizeFrame = GetSystemMetrics(SM_CYSIZEFRAME) - 1;
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);
/* Load and modify the menu */
pPreviewData->hMenu = LoadMenu(hApplet, MAKEINTRESOURCE(IDR_PREVIEW_MENU));
EnableMenuItem(pPreviewData->hMenu,
1, MF_BYPOSITION | MF_GRAYED);
HiliteMenuItem(hwnd, pPreviewData->hMenu,
2, MF_BYPOSITION | MF_HILITE);
// GetMenuItemRect(hwnd, pPreviewData->hMenu,
// 2, &pPreviewData->rcSelectedMenuItem);
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
CalculateItemSize(PPREVIEW_DATA pPreviewData)
{
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 */
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;
/* 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 */
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 + 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;
/* 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 */
pPreviewData->rcActiveMenuBar.left = pPreviewData->rcActiveFrame.left + pPreviewData->cxEdge + pPreviewData->cySizeFrame + 1;
pPreviewData->rcActiveMenuBar.top = pPreviewData->rcActiveCaption.bottom + 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 + 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;
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;
pPreviewData->rcDialogCaption.bottom = pPreviewData->rcDialogFrame.top + pPreviewData->cyCaption + 1 + 1;
/* 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;
}
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);
}
#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)
{
PAINTSTRUCT ps;
HFONT hOldFont;
HDC hdc;
RECT rc;
#ifdef _MSC_VER
DCT_PROC DrawCaptionTemp;
DMBT_PROC DrawMenuBarTemp;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -