⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 classxp.c

📁 OA系统权限管理设计任何系统都离不开权限的管理,有一个好的权限管理模块,不仅使我们的系统操作自如,管理方便,也为系统添加亮点
💻 C
📖 第 1 页 / 共 3 页
字号:
#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) &GTrg) : ((PVOID) &GRect)), 1, i);

	if (i == GRADIENT_FILL_TRIANGLE)
	{
		GTrg.Vertex1 = 3;
		GradientFill(hDC,Tve, 4, &GTrg, 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 + -