亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
99视频超级精品| 国产精品国产成人国产三级| 色综合天天综合网天天狠天天| 久久99国产精品麻豆| 裸体一区二区三区| 成人av在线资源网| 欧美人体做爰大胆视频| 精品久久免费看| 欧美激情中文不卡| 午夜久久久影院| 麻豆精品久久精品色综合| 有坂深雪av一区二区精品| 国产婷婷精品av在线| 欧美一级生活片| 日韩欧美亚洲一区二区| 国产欧美精品在线观看| 天堂成人免费av电影一区| 93久久精品日日躁夜夜躁欧美| 欧美一区二区三区在线观看视频| 国产精品久久久久久久久搜平片| 久久99久久久久久久久久久| 午夜av一区二区三区| 在线观看免费一区| 一区二区三区毛片| 久久国产精品第一页| 日本三级亚洲精品| 色欧美片视频在线观看在线视频| 日本一区二区在线不卡| 精品综合免费视频观看| 制服视频三区第一页精品| **欧美大码日韩| 99天天综合性| 国产精品久久久一本精品 | 色吊一区二区三区| 久久综合色之久久综合| 丁香婷婷综合五月| 国产精品二三区| 一本久久a久久免费精品不卡| 国产肉丝袜一区二区| 粉嫩绯色av一区二区在线观看 | 日韩经典一区二区| 欧美日韩精品三区| 欧美伊人久久久久久久久影院| 精品美女一区二区| 国产精品996| 亚洲人成人一区二区在线观看| 成人黄色小视频| 美女国产一区二区三区| 国产精品日韩成人| 91亚洲精品久久久蜜桃网站| 亚洲精品免费播放| 久久精品人人做人人综合| 91丝袜高跟美女视频| 久久99日本精品| 亚洲一区在线免费观看| 成人午夜视频在线| 日韩中文欧美在线| 中文天堂在线一区| 精品少妇一区二区三区 | 亚洲欧美成aⅴ人在线观看| 91精品国产综合久久久久久| 91久久精品一区二区| 岛国av在线一区| 国产成人a级片| 国产一区欧美一区| 国产精品资源在线观看| 无吗不卡中文字幕| 99在线精品视频| 99久久er热在这里只有精品15| 国内久久精品视频| 国产永久精品大片wwwapp | 欧美精品乱人伦久久久久久| 色国产精品一区在线观看| 在线这里只有精品| 在线免费观看日本欧美| 精品视频在线视频| 欧美一区二区三区视频在线观看| 欧美视频日韩视频在线观看| 日韩一区二区三免费高清| 97精品国产露脸对白| 免费成人在线网站| 美女视频一区二区三区| 高清国产午夜精品久久久久久| 国产色综合久久| 精品久久久久久最新网址| 日韩欧美国产不卡| 亚洲欧美综合另类在线卡通| 亚洲一区二区三区激情| 久久国产精品72免费观看| 国产成人av电影在线播放| 欧美日韩国产在线播放网站| 精品国产欧美一区二区| 亚洲成人午夜影院| 国产成人综合亚洲网站| 欧美老女人第四色| 中文字幕在线视频一区| 国产一区二区导航在线播放| 一本大道久久精品懂色aⅴ| 日韩专区在线视频| 日本韩国欧美三级| 国产日韩精品一区二区三区| 亚洲一区二区欧美| 99天天综合性| 一区二区三区美女| 色综合天天综合网国产成人综合天| 欧美不卡一区二区| 久久99国产乱子伦精品免费| 欧美日韩午夜精品| 亚洲四区在线观看| 99久久精品国产一区二区三区| 久久久五月婷婷| 韩国一区二区在线观看| 欧美成人r级一区二区三区| 日韩电影免费一区| 久久久亚洲精品石原莉奈| 国产精华液一区二区三区| 国产精品久久久久久亚洲毛片| 国产91精品在线观看| 一区二区三区欧美视频| 欧美日韩一二区| 国产在线播放一区二区三区| 中文字幕日本不卡| 欧美片在线播放| 成人午夜视频免费看| 亚洲午夜在线电影| 国产精品网站一区| 欧美日韩精品是欧美日韩精品| 成人高清免费观看| 久久久亚洲午夜电影| 99精品国产热久久91蜜凸| 蜜臀av一区二区| 国产精品美女www爽爽爽| 欧美精品久久99久久在免费线 | 99免费精品在线观看| 亚洲丰满少妇videoshd| 国产精品久久久久久久岛一牛影视 | 国产亚洲综合av| 欧美一级夜夜爽| 国产乱妇无码大片在线观看| 91.成人天堂一区| 丰满少妇久久久久久久 | 久久久精品天堂| 欧美v亚洲v综合ⅴ国产v| 欧美色图12p| 欧美日韩精品三区| 91蜜桃视频在线| 91成人免费在线视频| 在线观看成人免费视频| 欧美日韩激情在线| 欧美精品高清视频| 日韩一区二区三区四区| 91麻豆精品国产91久久久使用方法| 欧美日韩精品欧美日韩精品| 有坂深雪av一区二区精品| 亚洲六月丁香色婷婷综合久久 | 成人综合婷婷国产精品久久蜜臀| 国模无码大尺度一区二区三区| 国产91精品精华液一区二区三区| 国产69精品久久99不卡| 成人午夜av电影| 欧美绝品在线观看成人午夜影视 | 国产高清久久久久| av资源网一区| 日韩欧美自拍偷拍| 国产精品毛片大码女人| 亚洲午夜在线视频| 亚洲午夜视频在线观看| 国产欧美视频一区二区| 一区二区不卡在线播放 | 视频一区欧美日韩| 国产成人精品免费| 欧美欧美欧美欧美首页| 欧美激情一区二区在线| 毛片av一区二区三区| av在线一区二区三区| 久久蜜桃av一区二区天堂| 欧美国产激情一区二区三区蜜月| 性做久久久久久久免费看| 99久久精品国产毛片| 欧美性色aⅴ视频一区日韩精品| 成人av网址在线观看| 日韩精品中文字幕在线不卡尤物| 中文字幕一区二区三区av| 国产91富婆露脸刺激对白| 日韩欧美一区二区免费| 青青青伊人色综合久久| 欧美性感一类影片在线播放| 亚洲成人免费看| 欧美日韩精品一二三区| 婷婷久久综合九色国产成人| 欧美精品一区二区三区蜜桃视频| 亚洲女同ⅹxx女同tv| 色老汉一区二区三区| 亚洲一区二区三区四区五区中文| 在线看日本不卡| 蜜桃视频一区二区| 精品国产精品网麻豆系列| 久久久噜噜噜久噜久久综合| 国产麻豆成人传媒免费观看| 日韩一区二区电影|