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

📄 cxpbase.c

📁 minica2的第2个版本
💻 C
字号:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 预处理
#include "CXPBase.h"
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 钩子句柄
extern HHOOK g_hCXPHook;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 类名称
const CLASSXP c_cxpClass[] =
{
//	uClass				ptzClass					pDraw				wpProc
	{CXPC_BUTTON,		TEXT("Button"),				CXPDrawPushButton,	CXPButtonProc},		// 按钮
//	{CXPC_STATIC,		TEXT("Static"),				NULL,				NULL},				// 静态控件

	{CXPC_EDITBOX,		TEXT("Edit"),				CXPDrawEditBox,		CXPEditBoxProc},	// 编辑框
	{CXPC_HOTKEY,		TEXT("msctls_hotkey32"),	CXPDrawEditBox,		CXPEditBoxProc},	// 热键
	{CXPC_IPBOX,		TEXT("SysIPAddress32"),		CXPDrawEditBox,		CXPEditBoxProc},	// IP 地址
	{CXPC_LISTBOX,		TEXT("ListBox"),			CXPDrawEditBox,		CXPEditBoxProc},	// 列表框
	{CXPC_LISTBOX,		TEXT("ComboLBox"),			CXPDrawEditBox,		CXPEditBoxProc},	// 组合列表框
	{CXPC_LISTVIEW,		TEXT("SysListView32"),		CXPDrawEditBox,		CXPEditBoxProc},	// 列表查看
	{CXPC_TREEVIEW,		TEXT("SysTreeView32"),		CXPDrawEditBox,		CXPEditBoxProc},	// 树形查看

	{CXPC_COMBOBOX,		TEXT("ComboBox"),			CXPDrawComboBox,	CXPComboBoxProc},	// 组合框
	{CXPC_DATETIME,		TEXT("SysDateTimePick32"),	CXPDrawComboBox,	CXPComboBoxProc},	// 日期/时间选择

	{CXPC_SPINBOX,		TEXT("msctls_updown32"),	CXPDrawSpinBox,		CXPSpinBoxProc},	// 旋转控件
//	{CXPC_SCROLLBAR,	TEXT("ScrollBar"),			NULL,				NULL},				// 滚动条

//	{CXPC_TRACKBAR,		TEXT("msctls_trackbar32"),	NULL,				NULL},				// 滑动条
//	{CXPC_PROGRESS,		TEXT("msctls_progress32"),	NULL,				NULL},				// 进度条

//	{CXPC_TABCTRL,		TEXT("SysTabControl32"),	NULL,				NULL},				// 制表控件
//	{CXPC_CALENDER,		TEXT("SysMonthCal32"),		NULL,				NULL},				// 日历控件
//	{CXPC_ANIMATE,		TEXT("SysAnimate32"),		NULL,				NULL},				// 动画控件

//	{CXPC_HEADER,		TEXT("SysHeader32"),		NULL,				NULL},				// 标题控件
//	{CXPC_TOOLBAR,		TEXT("ToolbarWindow32"),	NULL,				NULL},				// 工具栏
//	{CXPC_STATUSBAR,	TEXT("msctls_statusbar32"),	NULL,				NULL},				// 状态栏
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 钩子函数
LRESULT CALLBACK CXPHookProc(INT iCode, WPARAM wParam, LPARAM lParam)
{
	if (((PCWPSTRUCT) lParam)->message == WM_CREATE)
	{
		CXPSet(((PCWPSTRUCT) lParam)->hwnd, TRUE);
	}

	return CallNextHookEx(g_hCXPHook, iCode, wParam, lParam);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 枚举函数
BOOL CALLBACK CXPEnumProc(HWND hWnd, LPARAM lParam)
{
	// 设置或取消窗口 ClassXP
	CXPSet(hWnd, (BOOL) lParam);

	// 枚举子窗体
	EnumChildWindows(hWnd, CXPEnumProc, lParam);

	return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 设置或取消窗口 ClassXP
BOOL CXPSet(HWND hWnd, BOOL bClassXP)
{
	PCLASSXP pCxp;

	pCxp = (PCLASSXP) GetProp(hWnd, TEXT("ClassXP"));
	if (bClassXP && (pCxp == NULL))
	{
		pCxp = (PCLASSXP) _HeapAlloc(sizeof(CLASSXP));
		pCxp->hWnd = hWnd;
		pCxp->lStyle = GetWindowLong(hWnd, GWL_STYLE);

		if (CXPGetClass(pCxp) && CXPGetState(pCxp))
		{
			SetProp(hWnd, TEXT("ClassXP"), (HANDLE) pCxp);
			pCxp->wpPrev = (WNDPROC) SetWindowLongPtr(hWnd, GWL_WNDPROC, (LONG_PTR) pCxp->wpProc);
			RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ERASENOW | RDW_UPDATENOW);

			return TRUE;
		}

		_HeapFree(pCxp);
	}
	else if ((bClassXP == FALSE) && pCxp)
	{
		SetWindowLong(hWnd, GWL_WNDPROC, (LONG_PTR) pCxp->wpPrev);
		RemoveProp(hWnd, TEXT("ClassXP"));
		_HeapFree(pCxp);
		RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ERASENOW | RDW_UPDATENOW);

		return TRUE;
	}

	return FALSE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 获取窗口类
BOOL CXPGetClass(PCLASSXP pCxp)
{
	UINT i;
	TCHAR tzClass[MAX_PATH];

	// 查找判断匹配的类名称
	_Assert(pCxp);
	GetClassName(pCxp->hWnd, tzClass, MAX_PATH);
	for (i = 0; i < _NumOf(c_cxpClass); i++)
	{
		if (lstrcmpi(tzClass, c_cxpClass[i].ptzClass) == 0)
		{
			CopyMemory(pCxp, &c_cxpClass[i], sizeof(CLASSXP) - sizeof(HWND) * 2);
			return TRUE;
		}
	}

	return FALSE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 获取窗口状态
BOOL CXPGetState(PCLASSXP pCxp)
{
	PCLASSXP p;
	UINT uCheck;

	// 设置禁用和焦点状态
	pCxp->lState = _CXPGetStyle(WS_DISABLED) ? CXPS_DISABLED : 0;
	_ExIf(pCxp->hWnd == GetFocus(), _CXPSetState(CXPS_FOCUS));

	switch (pCxp->uClass)
	{
	case CXPC_BUTTON:
		switch (_CXPGetStyle(BS_TYPEMASK))
		{
		case BS_DEFPUSHBUTTON:		// 默认按钮
			_CXPSetState(CXPS_DEFAULT);

		case BS_PUSHBUTTON:			// 普通按钮
			break;

		case BS_CHECKBOX:			// 复选框
		case BS_AUTOCHECKBOX:		// 自动复选框
		case BS_3STATE:				// 三状态复选框
		case BS_AUTO3STATE:			// 自动三状态复选框

		case BS_RADIOBUTTON:		// 单选框
		case BS_AUTORADIOBUTTON:	// 自动单选框
			if (!_CXPGetStyle(BS_PUSHLIKE))
			{
				pCxp->pDraw = CXPDrawCheckBox;
			}
			break;

		default:					// 自绘按钮、组合框和其它未知类型
			return FALSE;
		}
		uCheck = (LONG) SendMessage(pCxp->hWnd, BM_GETCHECK, 0, 0);
		if (uCheck == BST_CHECKED)
		{
			_CXPSetState(CXPS_CHECKED);
		}
		else if (uCheck == BST_INDETERMINATE)
		{
			_CXPSetState(CXPS_INDETERMINATE);
		}
		break;

	case CXPC_EDITBOX:
		if (!_CXPGetStyle(WS_BORDER) && !(GetWindowLong(pCxp->hWnd, GWL_EXSTYLE) & (WS_EX_CLIENTEDGE | WS_EX_STATICEDGE)))
		{
			return FALSE;
		}
		_ExIf(_CXPGetStyle(ES_READONLY), _CXPSetState(CXPS_READONLY));
		break;

	case CXPC_COMBOBOX:
		if (_CXPGetStyle(CBS_TYPEMASK) == CBS_SIMPLE)
		{
			_CXPSetState(CXPS_SIMPLECMB);
		}
		break;

	case CXPC_SPINBOX:
		_ExIf(_CXPGetStyle(UDS_HORZ), _CXPSetState(CXPS_HORIZON));
		_ExIf(_CXPGetStyle(UDS_ARROWKEYS), _CXPSetState(CXPS_ACCELSPIN));
		_ExIf(_CXPGetStyle(UDS_ALIGNLEFT), _CXPSetState(CXPS_LEFTSPIN));
		_ExIf(_CXPGetStyle(UDS_ALIGNRIGHT), _CXPSetState(CXPS_RIGHTSPIN));

		// 设置旧伙伴
		p = (PCLASSXP) pCxp->lParam;
		_ExIf(p, p->lParam = 0);

		p = (PCLASSXP) GetProp((HWND) SendMessage(pCxp->hWnd, UDM_GETBUDDY, 0, 0), TEXT("ClassXP"));
		if (p && (p->uClass == CXPC_EDITBOX))
		{
			// 设置新伙伴
			p->lParam = (LPARAM) pCxp;
			pCxp->lParam = (LPARAM) p;
		}
		break;
	}

	return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -