📄 preview.c
字号:
HMODULE hUser32;
hUser32 = LoadLibrary(_T("user32.dll"));
if(hUser32 == NULL)
return FALSE;
DrawCaptionTemp = (DCT_PROC)GetProcAddress(hUser32, (LPCSTR)DCT_ORD);
DrawMenuBarTemp = (DMBT_PROC)GetProcAddress(hUser32, (LPCSTR)DMBT_ORD);
#endif
hdc = BeginPaint(hwnd, &ps);
/* Desktop */
FillRect(hdc, &pPreviewData->rcDesktop, pPreviewData->hbrDesktop);
/* Inactive Window */
DrawEdge(hdc, &pPreviewData->rcInactiveFrame, EDGE_RAISED, BF_RECT | BF_MIDDLE);
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->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);
/* Draw the menu bar */
DrawMenuBarTemp(hwnd, hdc, &pPreviewData->rcActiveMenuBar,
pPreviewData->hMenu,
pPreviewData->hMenuFont);
/* 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;
SetTextColor(hdc, pPreviewData->clrSysColor[COLOR_WINDOWTEXT]);
hOldFont = SelectObject(hdc, pPreviewData->hCaptionFont);
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);
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 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);
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);
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;
if (PtInRect(&pPreviewData->rcActiveMenuBar, pt))
type = IDX_MENU;
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;
SendMessage(GetParent(hwnd),
WM_COMMAND,
MAKEWPARAM(GetWindowLongPtrW(hwnd, GWLP_ID), 0),
(LPARAM)type);
}
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;
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;
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,
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);
wc.hbrBackground = (HBRUSH)NULL;
wc.lpszClassName = szPreviewWndClass;
return RegisterClassEx(&wc) != (ATOM)0;
}
VOID
UnregisterPreviewControl(IN HINSTANCE hInstance)
{
UnregisterClass(szPreviewWndClass,
hInstance);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -