亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? classxp.c

?? VC界面類編程技巧大全附源碼(DOC)
?? C
?? 第 1 頁 / 共 3 頁
字號:



////////////////////////////////////////////////////////////////////////////////////////////////////
// 說明: ClassXP.c 文件
// 更新: 2003-3-10
////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////
// 編譯預處理
#if _WIN32_WINNT < 0x0400
#define _WIN32_WINNT 0x0400
#endif
#include <Windows.h>
#include "ClassXP.h"
#pragma warning(disable: 4311)
#pragma warning(disable: 4312)
#pragma comment(lib, "Msimg32.lib")

// 導出函數
#ifdef CXP_DLLMODE
#pragma comment(linker, "/EXPORT:ClassXP=_ClassXP@8")
#endif // CXP_DLLMODE

// 強制使用 C 語言方式編譯
#ifdef __cplusplus
extern "C"
{
#endif // __cplusplus
////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////
// 宏定義

// 窗口類型
#define CXPT_UNKNOWN		-1	// 不能處理的類型
#define CXPT_PUSHBUTTON		0	// 按鈕
#define CXPT_CHECKBOX		1	// 復選框
#define CXPT_RADIOBOX		2	// 單選框
#define CXPT_EDITBOX		3	// 編輯框
#define CXPT_COMBOBOX		4	// 組合框


// 窗口狀態
#define CXPS_DISABLED		0x00000001L		// 禁用狀態
#define CXPS_PRESSED		0x00000002L		// 按下狀態
#define CXPS_HOTLIGHT		0x00000004L		// 高亮狀態 (鼠標在該窗口上)
#define CXPS_FOCUS			0x00000008L		// 具有鍵盤輸入焦點
#define CXPS_DEFAULT		0x00000010L		// 默認狀態 (用于按鈕)
#define CXPS_CHECKED		0x00000020L		// 選中狀態 (用于復選框)
#define CXPS_INDETERMINATE	0x00000040L		// 未確定狀態 (用于復選框)
#define CXPS_READONLY		0x00000080L		// 只讀狀態 (用于編輯框)


// 設置窗口狀態
#define CXPM_SETSTATE(Data, Mask, IsSet)	((IsSet) ? (Data |= Mask) : (Data &= ~Mask))
////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////
// CLASSXP 結構,所有的代碼都是圍繞這個結構而編寫的
typedef struct tagCLASSXP
{
	HWND hWnd;					// 窗口句柄
	DWORD dwType;				// 窗口的類型
	DWORD dwState;				// 窗口的狀態
	WNDPROC wpPrev;				// 子類化之前的窗口回調函數地址
	struct tagCLASSXP * pNext;	// 指向下一個 CLASSXP 結構,這里采用單向鏈表結構
}
CLASSXP, * PCLASSXP;
////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////
// MEMDCXP 結構,為了方便使用內存兼容設備場景而設計
typedef struct tagMEMDCXP
{
	HWND hWnd;					// 窗口句柄,輸入參數
	HDC hDC;					// 窗口設備場景,輸出參數
	HDC hMemDC;					// 窗口內存兼容設備場景,輸出參數
	BOOL bTransfer;				// 是否要用在 hDC 和 hMemDC 間傳送數據,輸入參數
	HBITMAP hBitmap;			// 位圖句柄,輸入和輸出參數
}
MEMDCXP, * LPMEMDCXP;
////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////
// 函數聲明
PCLASSXP WINAPI CreateClassXP(HWND hWnd);
PCLASSXP WINAPI DeleteClassXP(HWND hWnd);
PCLASSXP WINAPI GetClassXP(HWND hWnd);

DWORD WINAPI GetWindowTypeXP(HWND hWnd);
HDC WINAPI GetMemDCXP(LPMEMDCXP pMdcxp);
VOID WINAPI ReleaseMemDCXP(LPMEMDCXP pMdcxp);
VOID WINAPI GradientRectXP(HDC hDC, LPRECT pRect,COLORREF crColor[4]);
VOID WINAPI DrawDropGripXP(HDC hDC, LPRECT pRect);

BOOL CALLBACK EnumWndProcXP(HWND hWnd, LPARAM lParam);
LRESULT CALLBACK HookProcXP(int iCode, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK WindowProcXP(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

VOID WINAPI DrawPushButtonXP(PCLASSXP pCxp);
VOID WINAPI DrawCheckBoxXP(PCLASSXP pCxp);
VOID WINAPI DrawRadioBoxXP(PCLASSXP pCxp);
VOID WINAPI DrawEditBoxXP(PCLASSXP pCxp);
VOID WINAPI DrawComboBoxXP(PCLASSXP pCxp);
////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////
// 全局變量
HHOOK g_hPrevHookXP = NULL;		// 窗口消息 HOOK 句柄
PCLASSXP g_pClassXP = NULL;		// 窗口的 CLASSXP 結構指針

#ifdef CXP_DLLMODE
HINSTANCE g_hModuleXP = NULL;	// 動態連接庫模塊句柄
#endif // CXP_DLLMODE
////////////////////////////////////////////////////////////////////////////////////////////////////



#ifdef CXP_DLLMODE
////////////////////////////////////////////////////////////////////////////////////////////////////
// 動態連接庫主函數
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, LPVOID pvReserved)
{
    if (dwReason == DLL_PROCESS_ATTACH)
	{
		g_hModuleXP = hModule;
		DisableThreadLibraryCalls(hModule);
	}
	return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
#endif // CXP_DLLMODE



////////////////////////////////////////////////////////////////////////////////////////////////////
// 設置或取消窗口的 ClassXP 風格
BOOL WINAPI ClassXP(HWND hWnd, BOOL bEnable)
{
	BOOL bReturn;

	bReturn = FALSE;

	// 如果是影響當前進程中的所有窗口
	if (hWnd == NULL)
	{
		// 如果是取消當前進程中的所有窗口
		if ((bEnable == FALSE) && (g_hPrevHookXP != NULL))
		{
			// 枚舉當前線程的窗口并取消 ClassXP 風格
			EnumThreadWindows(GetCurrentThreadId(), EnumWndProcXP, FALSE);

			// 取消窗口消息 HOOK
			bReturn = UnhookWindowsHookEx(g_hPrevHookXP);
			g_hPrevHookXP = NULL;
		}
		// 如果是設置當前進程中的所有窗口
		else if ((bEnable == TRUE) && (g_hPrevHookXP == NULL))
		{
			// 枚舉當前線程中已存在的窗口并設置為 ClassXP 風格
			EnumThreadWindows(GetCurrentThreadId(), EnumWndProcXP, TRUE);

			// 安裝窗口消息 HOOK
			g_hPrevHookXP = SetWindowsHookEx(WH_CALLWNDPROC, HookProcXP, 0, GetCurrentThreadId());
			bReturn = (BOOL) g_hPrevHookXP;
		}
	}
	else
	{
		// 如果是取消指定窗口的 ClassXP 風格
		if (bEnable == FALSE)
			bReturn = (BOOL) DeleteClassXP(hWnd);
		// 如果是設置指定窗口的 ClassXP 風格
		else
			bReturn = (BOOL) CreateClassXP(hWnd);			
	}
	return bReturn;
}
////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////
// 創建并初始化 CLASSXP 數據結構;子類化窗口
// 如果返回 NULL,表示沒有創建;否則返回新創建節點的指針,同時 g_pClassXP 指向新創建的節點
PCLASSXP WINAPI CreateClassXP(HWND hWnd)
{
	LONG lStyle;
	DWORD dwType;
	PCLASSXP pCxp;

	// 是否已經是 ClassXP 風格
	if (GetClassXP(hWnd) == NULL)
	{
		// 獲取窗口類型,如果并判斷是否能設置為 ClassXP 風格
		dwType = GetWindowTypeXP(hWnd);
		if ((dwType >= CXPT_PUSHBUTTON) && (dwType <= CXPT_COMBOBOX))
		{
			lStyle = GetWindowLong(hWnd, GWL_STYLE);

			// 分配存儲空間,增加一個節點
			pCxp = (PCLASSXP) HeapAlloc(GetProcessHeap(), 0, sizeof(CLASSXP));
			pCxp->pNext = g_pClassXP;
			g_pClassXP = pCxp;

			// 子類化窗口并初始化 CLASSXP 數據結構
			pCxp->hWnd = hWnd;
			pCxp->dwType = dwType;
			pCxp->dwState = (lStyle & WS_DISABLED) ? CXPS_DISABLED : 0;
			if (hWnd == GetFocus())
				pCxp->dwState |= CXPS_FOCUS;
			pCxp->wpPrev = (WNDPROC) SetWindowLong(hWnd, GWL_WNDPROC, (LONG) WindowProcXP);

			// 按窗口類型分別 CLASSXP 數據結構
			switch (dwType)
			{
			case CXPT_PUSHBUTTON:
			case CXPT_CHECKBOX:
			case CXPT_RADIOBOX:
				if ((lStyle & SS_TYPEMASK) == BS_DEFPUSHBUTTON)
					pCxp->dwState |= CXPS_DEFAULT;

				lStyle = (LONG) SendMessage(hWnd, BM_GETCHECK, 0, 0);
				if (lStyle == BST_CHECKED)
					pCxp->dwState |= CXPS_CHECKED;
				else if (lStyle == BST_INDETERMINATE)
					pCxp->dwState |= CXPS_INDETERMINATE;
				break;

			case CXPT_EDITBOX:
				if (lStyle & ES_READONLY)
					pCxp->dwState |= CXPS_READONLY;
				break;
			}

			// 重畫窗口
			RedrawWindow(hWnd, NULL, NULL,
				RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ERASENOW | RDW_UPDATENOW);
			return pCxp;
		}
	}
	return NULL;
}
////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////
// 取消窗口子類化;銷毀窗口的 CLASSXP 數據結構
// 如果返回值不為 NULL 表示成功刪除,返回值為指向上一個節點指針;
// 如果返回 NULL 且 g_pClassXP 為 NULL,表全部節點被刪除;
// 否則表示沒有找到該節點。
// 致謝: 感謝 dREAMtHEATER 改進此函數!
PCLASSXP WINAPI DeleteClassXP(HWND hWnd)
{
	PCLASSXP pDel;
	PCLASSXP pCxp;

	// 獲取待刪除的節點指針
	pDel = GetClassXP(hWnd);
	if (pDel != NULL)
	{
		// 如果待刪除的節點就是 g_pClassXP 節點
		if (pDel == g_pClassXP)
			pCxp = g_pClassXP = pDel->pNext;
		else
		{
			// 循環查找待刪除節點的上一個節點
			for (pCxp = g_pClassXP; pCxp != NULL; pCxp = pCxp->pNext)
			{
				// 如果找到
				if (pCxp->pNext == pDel)
				{
					// 使鏈表跳過待刪除的節點
					pCxp->pNext = pDel->pNext;
					break;
				}
			}
		}

		// 取消窗口子類化并重畫窗口
		SetWindowLong(hWnd, GWL_WNDPROC, (LONG) pDel->wpPrev);

		// 刪除堆內存
		HeapFree(GetProcessHeap(), 0, pDel);

		// 重畫窗口
		RedrawWindow(hWnd, NULL, NULL,
			RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ERASENOW | RDW_UPDATENOW);
		return pCxp;
	}
	return NULL;
}
////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////
// 獲取窗口的 CLASSXP 數據結構
// 如果返回 NULL,表示沒有找到;否則返回節點的指針
PCLASSXP WINAPI GetClassXP(HWND hWnd)
{
	PCLASSXP pCxp;

	for (pCxp = g_pClassXP; pCxp != NULL; pCxp = pCxp->pNext)
	{
		if (pCxp->hWnd == hWnd)
			return pCxp;
	}
	return FALSE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////
// 獲取窗口類型
DWORD WINAPI GetWindowTypeXP(HWND hWnd)
{
	DWORD lReturn;
	char szTemp[MAX_PATH];
	static char s_szClass[][32] = 
	{
		"Button",					// 按鈕類
		"Edit",						// 編輯框類
		"ComboBox",					// 組合框類

#ifdef CXP_DLLMODE
		"TButton",					// VCL TButton 類
		"ThunderCommandButton",		// Visual Basic Command Button 類
		"ThunderRT6CommandButton",	// Visual Basic Command Button 類
		"TCheckBox",
		"ThunderCheckBox",
		"ThunderRT6CheckBox",
		"TEdit",
		"TNumberEdit",
		"ThunderTextBox",
		"ThunderRT6TextBox",
		"TComboBox",
		"ThunderComboBox",
		"ThunderRT6ComboBox"
#endif // CXP_DLLMODE
	};

	// 查找判斷匹配的類名稱
	GetClassName(hWnd, szTemp, sizeof(szTemp));
	for (lReturn = 0; lReturn < (sizeof(s_szClass) / sizeof(s_szClass[0])); lReturn++)
		if (lstrcmpi(szTemp, s_szClass[lReturn]) == 0)
			break;

	switch (lReturn)
	{
	case 0:
		lReturn = GetWindowLong(hWnd, GWL_STYLE);
		switch (lReturn & SS_TYPEMASK)
		{
		case BS_DEFPUSHBUTTON:		// 默認按鈕
		case BS_PUSHBUTTON:			// 普通按鈕
			lReturn = CXPT_PUSHBUTTON;
			break;

		case BS_CHECKBOX:			// 復選框
		case BS_AUTOCHECKBOX:		// 自動復選框
		case BS_3STATE:				// 三狀態復選框
		case BS_AUTO3STATE:			// 自動三狀態復選框
			if (lReturn & BS_PUSHLIKE)
				lReturn = CXPT_PUSHBUTTON;
			else
				lReturn = CXPT_CHECKBOX;
			break;

		case BS_RADIOBUTTON:		// 單選框
		case BS_AUTORADIOBUTTON:	// 自動單選框
			if (lReturn & BS_PUSHLIKE)
				lReturn = CXPT_PUSHBUTTON;
			else
				lReturn = CXPT_RADIOBOX;
			break;

		default:	// 未知類型
			lReturn = CXPT_UNKNOWN;
		}
		break;

	case 1:			// 編輯框
		lReturn = CXPT_EDITBOX;
		break;
	
	case 2:			// 組合框
		if ((GetWindowLong(hWnd, GWL_STYLE) & 0x00000003) == CBS_SIMPLE)
			lReturn = CXPT_UNKNOWN;
		else
			lReturn = CXPT_COMBOBOX;
		break;

#ifdef CXP_DLLMODE
	// VB 和 VCL 的控件,只有在動態連接庫方式下才有可能出現這種情況
	case 3:
	case 4:
	case 5:
		lReturn = CXPT_PUSHBUTTON;
		break;

	case 6:
	case 7:
	case 8:
		lReturn = CXPT_CHECKBOX;
		break;

	case 9:
	case 10:
	case 11:
	case 12:
		lReturn = CXPT_EDITBOX;
		break;

	case 13:
	case 14:
	case 15:
		lReturn = CXPT_COMBOBOX;
		break;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品中文在线| 青椒成人免费视频| 日韩一区二区三区视频| 成人成人成人在线视频| 美女精品一区二区| 一区二区三区成人| 久久精品视频免费观看| 91精品国模一区二区三区| 91免费版在线看| 高清在线成人网| 激情亚洲综合在线| 五月婷婷综合激情| 亚洲猫色日本管| 国产精品青草综合久久久久99| 欧美老人xxxx18| 日本韩国欧美国产| 91网页版在线| 成人国产精品免费观看动漫| 国产在线一区二区| 美女视频黄 久久| 午夜精品视频一区| 亚洲一二三区视频在线观看| 中文字幕一区二区在线观看| 精品成人在线观看| 欧美大片日本大片免费观看| 在线成人免费观看| 欧美网站大全在线观看| 在线日韩av片| 在线观看国产一区二区| 日本乱人伦一区| 91美女片黄在线观看| 97se亚洲国产综合自在线 | 亚洲大片一区二区三区| 中文字幕一区二区三区精华液| 精品国产乱码久久久久久1区2区 | 精品成人a区在线观看| 337p亚洲精品色噜噜狠狠| 欧美日韩aaaaaa| 欧美日韩国产大片| 欧美精品一二三四| 日韩视频一区二区| 欧美va在线播放| 久久久久国产精品人| 久久久久一区二区三区四区| 国产日韩视频一区二区三区| 国产日韩视频一区二区三区| 国产欧美一区二区精品久导航| 国产欧美一二三区| 一色屋精品亚洲香蕉网站| 亚洲欧美日韩国产一区二区三区 | 日韩欧美国产不卡| 精品久久99ma| 国产人妖乱国产精品人妖| 久久精品日产第一区二区三区高清版| 久久综合五月天婷婷伊人| 国产亚洲精品aa| 国产精品嫩草影院com| 亚洲欧洲无码一区二区三区| 亚洲影视在线播放| 欧美aaa在线| 国产福利精品导航| 99精品视频在线播放观看| 欧美三级视频在线播放| 51精品国自产在线| 国产偷国产偷精品高清尤物| 国产精品乱人伦| 亚洲一区二区综合| 狠狠色2019综合网| k8久久久一区二区三区| 在线视频综合导航| 精品国产免费一区二区三区香蕉| 国产欧美精品国产国产专区| 亚洲欧美偷拍另类a∨色屁股| 国产激情一区二区三区四区| 成人高清av在线| 欧美日韩一区中文字幕| 久久人人爽爽爽人久久久| 亚洲婷婷综合久久一本伊一区| 亚洲二区在线观看| 国产乱码精品一区二区三区av| 波多野结衣在线一区| 在线播放一区二区三区| 国产亚洲欧美在线| 亚洲一区二区三区中文字幕在线| 久草精品在线观看| 色综合久久久久久久久| 日韩精品一区二区三区视频在线观看| 国产精品欧美久久久久无广告 | 国产美女精品人人做人人爽| 日本精品免费观看高清观看| 久久久久久久久蜜桃| 亚洲国产中文字幕| 不卡电影一区二区三区| 日韩精品一区二区三区swag| 亚洲人被黑人高潮完整版| 精品一二三四区| 欧美日韩免费电影| 一区视频在线播放| 国产乱色国产精品免费视频| 欧美日韩精品一区二区三区蜜桃 | 综合分类小说区另类春色亚洲小说欧美| 亚洲成人在线免费| 北条麻妃一区二区三区| 精品奇米国产一区二区三区| 五月天丁香久久| 99re这里只有精品6| 国产亚洲综合在线| 日韩电影在线看| 在线视频你懂得一区| 国产欧美精品一区二区色综合| 免费在线观看成人| 欧美精品久久一区| 亚洲欧美激情一区二区| 丰满放荡岳乱妇91ww| 亚洲精品一区二区三区精华液| 日韩精品一二三| 欧美三级在线视频| 亚洲综合成人网| 99re成人精品视频| 国产精品国产三级国产a| 国产成人精品www牛牛影视| 日韩一区二区免费在线电影 | 日本人妖一区二区| 欧美性色aⅴ视频一区日韩精品| 中文字幕一区二区三区在线播放| 国产成人午夜精品影院观看视频| 欧美大片顶级少妇| 日本不卡一二三| 欧美日本一道本| 日韩国产精品91| 7777精品伊人久久久大香线蕉完整版 | 亚洲韩国精品一区| 一本大道久久a久久精二百| 中文字幕一区二区三区av| 成人av小说网| 国产精品久久久久9999吃药| 成人天堂资源www在线| 国产女人aaa级久久久级| 国产激情一区二区三区四区| 国产视频一区在线播放| 国产a区久久久| 国产精品美女一区二区在线观看| 国产成人免费在线观看| 亚洲国产精品ⅴa在线观看| 成人精品视频一区二区三区| 国产精品久久久久久久蜜臀 | 欧美久久久久久蜜桃| 三级一区在线视频先锋| 7777精品伊人久久久大香线蕉经典版下载 | 国产精品一区2区| 国产精品麻豆99久久久久久| 99久久久无码国产精品| 亚洲最新视频在线观看| 欧美日韩一本到| 麻豆精品一区二区综合av| 精品国产伦一区二区三区观看体验| 91麻豆精品视频| 亚洲国产精品久久不卡毛片| 7777精品久久久大香线蕉| 久久se精品一区精品二区| 国产视频在线观看一区二区三区| 99久久99久久精品免费观看| 亚洲精品国产一区二区三区四区在线 | 精品国产1区2区3区| av一区二区三区四区| 亚洲精品欧美二区三区中文字幕| 欧美色图在线观看| 看电视剧不卡顿的网站| 国产精品久久久久一区二区三区共 | 成人小视频免费在线观看| 亚洲自拍偷拍欧美| 欧美变态口味重另类| 91色综合久久久久婷婷| 免费看欧美女人艹b| 中文字幕av一区二区三区免费看 | 成人免费视频网站在线观看| 一个色妞综合视频在线观看| 日韩亚洲国产中文字幕欧美| 豆国产96在线|亚洲| 亚洲va韩国va欧美va精品| 国产三级欧美三级日产三级99 | 一区二区不卡在线播放 | 日韩免费电影一区| a级高清视频欧美日韩| 蜜桃视频一区二区| 亚洲欧美自拍偷拍色图| 日韩一级大片在线观看| 97久久精品人人爽人人爽蜜臀 | 成人精品电影在线观看| 天天色综合天天| 亚洲日本电影在线| 精品国产一区二区亚洲人成毛片 | 国产女人水真多18毛片18精品视频| 精品视频1区2区| 国产成人综合在线观看| 成人av在线影院| 4438x成人网最大色成网站| 99这里只有精品| 国产一区高清在线| 天天色综合成人网|