📄 classxp.c
字号:
#endif // CXP_DLLMODE
default: // 未知类型
lReturn = CXPT_UNKNOWN;
}
return lReturn;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
// 获取窗口的内存兼容设备场景
HDC WINAPI GetMemDCXP(LPMEMDCXP pMdcxp)
{
RECT Rect;
GetWindowRect(pMdcxp->hWnd, &Rect);
// 创建兼容内存兼容设备场景并设置为透明模式
pMdcxp->hDC = GetWindowDC(pMdcxp->hWnd);
pMdcxp->hMemDC = CreateCompatibleDC(pMdcxp->hDC);;
SetBkMode(pMdcxp->hMemDC, TRANSPARENT);
// 是否已经指定了位图句柄
if (pMdcxp->hBitmap)
{
// 选择位图对象
SelectObject(pMdcxp->hMemDC, pMdcxp->hBitmap);
}
else
{
// 创建并选择位图对象
pMdcxp->hBitmap = (HBITMAP) SelectObject(pMdcxp->hMemDC,
CreateCompatibleBitmap(pMdcxp->hDC, Rect.right - Rect.left, Rect.bottom - Rect.top));
}
// 如果要传送数据
if (pMdcxp->bTransfer == TRUE)
{
BitBlt(pMdcxp->hMemDC, 0, 0,
Rect.right - Rect.left, Rect.bottom - Rect.top, pMdcxp->hDC, 0, 0, SRCCOPY);
}
return pMdcxp->hMemDC;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
// 获取窗口的内存兼容设备场景
VOID WINAPI ReleaseMemDCXP(LPMEMDCXP pMdcxp)
{
RECT Rect;
// 如果要传送数据
if (pMdcxp->bTransfer == TRUE)
{
GetWindowRect(pMdcxp->hWnd, &Rect);
BitBlt(pMdcxp->hDC, 0, 0,
Rect.right - Rect.left, Rect.bottom - Rect.top, pMdcxp->hMemDC, 0, 0, SRCCOPY);
}
if (pMdcxp->hBitmap)
DeleteObject(SelectObject(pMdcxp->hMemDC, pMdcxp->hBitmap));
DeleteDC(pMdcxp->hMemDC);
ReleaseDC(pMdcxp->hWnd, pMdcxp->hDC);
}
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
// 绘制渐变矩形
VOID WINAPI GradientRectXP(HDC hDC, LPRECT pRect,COLORREF crColor[4])
{
int i;
TRIVERTEX Tve[4];
GRADIENT_RECT GRect;
GRADIENT_TRIANGLE GTrg;
for (i = 0; i < 4; i++)
{
Tve[i].Red = ((COLOR16) GetRValue(crColor[i])) << 8;
Tve[i].Green = ((COLOR16) GetGValue(crColor[i])) << 8;
Tve[i].Blue = ((COLOR16) GetBValue(crColor[i])) << 8;
Tve[i].Alpha = ((COLOR16) (crColor[i] >> 24)) << 8;
}
Tve[0].x = pRect->left;
Tve[0].y = pRect->top;
Tve[1].x = pRect->right;
Tve[1].y = pRect->top;
Tve[2].x = pRect->left;
Tve[2].y = pRect->bottom;
Tve[3].x = pRect->right;
Tve[3].y = pRect->bottom;
if ((crColor[0] == crColor[2]) &&
(crColor[1] == crColor[3]))
i = GRADIENT_FILL_RECT_H;
if ((crColor[0] == crColor[1]) &&
(crColor[2] == crColor[3]))
i = GRADIENT_FILL_RECT_V;
else
i = GRADIENT_FILL_TRIANGLE;
if (i == GRADIENT_FILL_TRIANGLE)
{
GTrg.Vertex1 = 0;
GTrg.Vertex2 = 1;
GTrg.Vertex3 = 2;
}
else
{
GRect.UpperLeft = 0;
GRect.LowerRight = 3;
}
GradientFill(hDC, Tve, 4,
((i == GRADIENT_FILL_TRIANGLE) ? ((PVOID) >rg) : ((PVOID) &GRect)), 1, i);
if (i == GRADIENT_FILL_TRIANGLE)
{
GTrg.Vertex1 = 3;
GradientFill(hDC,Tve, 4, >rg, 1, GRADIENT_FILL_TRIANGLE);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
// 绘制渐变矩形
VOID WINAPI DrawDropGripXP(HDC hDC, LPRECT pRect)
{
}
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
// 枚举窗口回调函数
BOOL CALLBACK EnumWndProcXP(HWND hWnd, LPARAM lParam)
{
// 如果是取消指定窗口的 ClassXP 风格
if (lParam == FALSE)
DeleteClassXP(hWnd);
// 如果是设置指定窗口的 ClassXP 风格
else
CreateClassXP(hWnd);
// 枚举子窗体
EnumChildWindows(hWnd, EnumWndProcXP, lParam);
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
// 窗口消息 HOOK 回调函数
LRESULT CALLBACK HookProcXP(int iCode, WPARAM wParam, LPARAM lParam)
{
// 设置新建的窗口为 ClassXP 风格
if ((((CWPSTRUCT *) lParam)->message == WM_CREATE) && (iCode >= 0))
CreateClassXP(((CWPSTRUCT *) lParam)->hwnd);
return CallNextHookEx(g_hPrevHookXP, iCode, wParam, lParam);
}
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
// 窗口子类化回调函数
LRESULT CALLBACK WindowProcXP(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LONG lReturn;
PCLASSXP pCxp;
TRACKMOUSEEVENT Tme;
typedef VOID (WINAPI *DRAWXP)(PCLASSXP);
static DRAWXP s_DrawXP[] =
{
DrawPushButtonXP,
DrawCheckBoxXP,
DrawRadioBoxXP,
DrawEditBoxXP,
DrawComboBoxXP
};
pCxp = GetClassXP(hWnd);
switch (pCxp->dwType)
{
case CXPT_PUSHBUTTON: // 按钮
case CXPT_CHECKBOX: // 复选框
case CXPT_RADIOBOX: // 单选框
switch (uMsg)
{
case BM_SETSTYLE: // 按钮风格改变
CXPM_SETSTATE(pCxp->dwState, CXPS_DEFAULT, wParam & BS_DEFPUSHBUTTON);
s_DrawXP[pCxp->dwType](pCxp);
break;
case BM_SETSTATE: // 设置按钮状态
lReturn = (LONG) CallWindowProc(pCxp->wpPrev, hWnd, uMsg, wParam, lParam);
CXPM_SETSTATE(pCxp->dwState, CXPS_PRESSED, wParam);
s_DrawXP[pCxp->dwType](pCxp);
return lReturn;
case BM_SETCHECK: // 设置选中状态
lReturn = (LONG) CallWindowProc(pCxp->wpPrev, hWnd, uMsg, wParam, lParam);
CXPM_SETSTATE(pCxp->dwState, CXPS_CHECKED, (wParam == BST_CHECKED));
CXPM_SETSTATE(pCxp->dwState, CXPS_INDETERMINATE, (wParam == BST_INDETERMINATE));
s_DrawXP[pCxp->dwType](pCxp);
return lReturn;
case WM_SETTEXT: // 设置窗口文本
lReturn = (LONG) DefWindowProc(hWnd, uMsg, wParam, lParam);
s_DrawXP[pCxp->dwType](pCxp);
return lReturn;
case WM_PAINT: // 窗口重画
lReturn = (LONG) DefWindowProc(hWnd, uMsg, wParam, lParam);
s_DrawXP[pCxp->dwType](pCxp);
return lReturn;
}
break;
case CXPT_EDITBOX: // 编辑框
if (uMsg == WM_NCPAINT)
{
lReturn = (LONG) DefWindowProc(hWnd, uMsg, wParam, lParam);
DrawEditBoxXP(pCxp);
return lReturn;
}
else if (uMsg == EM_SETREADONLY)
{
CXPM_SETSTATE(pCxp->dwState, CXPS_READONLY, wParam);
DrawEditBoxXP(pCxp);
}
break;
case CXPT_COMBOBOX: // 组合框
switch (uMsg)
{
case WM_PAINT:
case WM_NCPAINT:
lReturn = (LONG) CallWindowProc(pCxp->wpPrev, hWnd, uMsg, wParam, lParam);
DrawComboBoxXP(pCxp);
return lReturn;
case WM_LBUTTONDOWN:
pCxp->dwState |= CXPS_PRESSED;
break;
case WM_LBUTTONUP:
pCxp->dwState &= ~CXPS_PRESSED;
break;
}
break;
}
// 调用原来的回调函数
lReturn = (LONG) CallWindowProc(pCxp->wpPrev, hWnd, uMsg, wParam, lParam);
// 对所有窗口相同的处理
switch (uMsg)
{
case WM_MOUSEMOVE: // 窗口移动
if (((pCxp->dwState & CXPS_HOTLIGHT) == 0) && ((wParam & MK_LBUTTON) == 0))
{
pCxp->dwState |= CXPS_HOTLIGHT;
s_DrawXP[pCxp->dwType](pCxp);
// 追踪鼠标移出消息一次
Tme.cbSize = sizeof(TRACKMOUSEEVENT);
Tme.dwFlags = TME_LEAVE;
Tme.hwndTrack = hWnd;
TrackMouseEvent(&Tme);
}
break;
case WM_MOUSELEAVE: // 鼠标移出
if (pCxp->dwState & CXPS_HOTLIGHT)
{
pCxp->dwState &= ~CXPS_HOTLIGHT;
s_DrawXP[pCxp->dwType](pCxp);
}
break;
case WM_ENABLE: // 窗口被设置为禁用或可用
CXPM_SETSTATE(pCxp->dwState, CXPS_DISABLED, !wParam);
s_DrawXP[pCxp->dwType](pCxp);
break;
case WM_SETFOCUS: // 获得焦点
pCxp->dwState |= CXPS_FOCUS;
s_DrawXP[pCxp->dwType](pCxp);
break;
case WM_KILLFOCUS: // 丢失焦点
pCxp->dwState &= ~CXPS_FOCUS;
s_DrawXP[pCxp->dwType](pCxp);
break;
case WM_DESTROY: // 窗口销毁
DeleteClassXP(hWnd);
}
return lReturn;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
// 绘制按钮
VOID WINAPI DrawPushButtonXP(PCLASSXP pCxp)
{
int i;
RECT Rect;
MEMDCXP Mdcxp;
HANDLE hHandle;
COLORREF crColor;
char szTemp[256];
static COLORREF s_crGradientXP[][4] =
{
{0x00C1CCD1, 0x00C1CCD1, 0x00EEF1F2, 0xFFEEF1F2},
{0x00CFF0FF, 0x00CFF0FF, 0x000097E5, 0xFF0097E5},
{0x00BDCBD6, 0x00C6CFD6, 0x00EFF3F7, 0xFFEFF3F7},
{0x00FFE7CE, 0x00FFE7CE, 0x00EE8269, 0xFFEE8269},
{0x00FFFFFF, 0x00FFFFFF, 0x00D6DFE2, 0xFFD6DFE2},
{0x00DEE3E7, 0x00E7E7E7, 0x00DEE3E7, 0xFFDEE3E7},
{0x00FBFCFC, 0x00FBFCFC, 0x00E6EBEC, 0xFFE6EBEC},
};
// 获取内存兼容设备场景
Mdcxp.hWnd = pCxp->hWnd;
Mdcxp.bTransfer = FALSE;
Mdcxp.hBitmap = NULL;
GetMemDCXP(&Mdcxp);
// 获取窗口大小
GetWindowRect(pCxp->hWnd, &Rect);
Rect.right -= Rect.left;
Rect.bottom -= Rect.top;
Rect.left = Rect.top = 0;
// 画最外面的框,颜色与系统按钮颜色一直
FrameRect(Mdcxp.hMemDC, &Rect, GetSysColorBrush(COLOR_BTNFACE));
// 画最第二层边框
InflateRect(&Rect, -1, -1);
hHandle = (HANDLE) CreateSolidBrush(
(pCxp->dwState & CXPS_DISABLED) ? (GetSysColor(COLOR_BTNFACE) - 0x00202020) : 0x00733C00);
FrameRect(Mdcxp.hMemDC, &Rect, (HBRUSH) hHandle);
DeleteObject((HGDIOBJ) hHandle);
// 画热点框渐变背景
InflateRect(&Rect, -1, -1);
if (pCxp->dwState & CXPS_DISABLED)
{
i = -1;
hHandle = (HANDLE) CreateSolidBrush(0x00EAF4F5);
FillRect(Mdcxp.hMemDC, &Rect, (HBRUSH) hHandle);
DeleteObject((HGDIOBJ) hHandle);
}
else
{
if (pCxp->dwState & CXPS_PRESSED)
i = 0;
else if (pCxp->dwState & CXPS_HOTLIGHT)
i = 1;
else if ((pCxp->dwState & CXPS_CHECKED) || (pCxp->dwState & CXPS_INDETERMINATE))
i = 2;
else if ((pCxp->dwState & CXPS_FOCUS) || (pCxp->dwState & CXPS_DEFAULT))
i = 3;
else
i = 4;
GradientRectXP(Mdcxp.hMemDC, &Rect, s_crGradientXP[i]);
}
// 画文字区域渐变背景
InflateRect(&Rect, -2, -2);
if ((pCxp->dwState & CXPS_PRESSED) ||
(pCxp->dwState & CXPS_CHECKED) ||
(pCxp->dwState & CXPS_INDETERMINATE))
i = 5;
else if (!(pCxp->dwState & CXPS_DISABLED))
i = 6;
if ((i == 5) || (i == 6))
GradientRectXP(Mdcxp.hMemDC, &Rect, s_crGradientXP[i]);
// 用与系统按钮一直的颜色第二层边框的四角像素
crColor = GetSysColor(COLOR_BTNFACE);
SetPixel(Mdcxp.hMemDC, 1, 1, crColor);
SetPixel(Mdcxp.hMemDC, 1, Rect.bottom + 2, crColor);
SetPixel(Mdcxp.hMemDC, Rect.right + 2, Rect.bottom + 2, crColor);
SetPixel(Mdcxp.hMemDC, Rect.right + 2, 1, crColor);
// 画第二层边框的拐角像素,太罗嗦了,千万别仔细看:)
crColor = (pCxp->dwState & CXPS_DISABLED) ?
(GetSysColor(COLOR_BTNFACE) - 0x00151515) : 0x00A57D52;
SetPixel(Mdcxp.hMemDC, 2, 2, crColor);
SetPixel(Mdcxp.hMemDC, 2, Rect.bottom + 1, crColor);
SetPixel(Mdcxp.hMemDC, Rect.right + 1, Rect.bottom + 1, crColor);
SetPixel(Mdcxp.hMemDC, Rect.right + 1, 2, crColor);
crColor = (pCxp->dwState & CXPS_DISABLED) ?
(GetSysColor(COLOR_BTNFACE) - 0x00111111) : 0x00AD967B;
SetPixel(Mdcxp.hMemDC, 1, 2, crColor);
SetPixel(Mdcxp.hMemDC, 2, 1, crColor);
SetPixel(Mdcxp.hMemDC, Rect.right + 1, 1, crColor);
SetPixel(Mdcxp.hMemDC, Rect.right + 2, 2, crColor);
SetPixel(Mdcxp.hMemDC, Rect.right + 1, Rect.bottom + 2, crColor);
SetPixel(Mdcxp.hMemDC, Rect.right + 2, Rect.bottom + 1, crColor);
SetPixel(Mdcxp.hMemDC, 2, Rect.bottom + 2, crColor);
SetPixel(Mdcxp.hMemDC, 1, Rect.bottom + 1, crColor);
// 如果有焦点,画出焦点框
if (pCxp->dwState & CXPS_FOCUS)
{
InflateRect(&Rect, 1, 1);
DrawFocusRect(Mdcxp.hMemDC, &Rect);
}
// 画文字
if (GetWindowText(pCxp->hWnd, szTemp, sizeof(szTemp)))
{
if (pCxp->dwState & CXPS_PRESSED)
OffsetRect(&Rect, 1, 1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -