//////////////////////////////////////////////////////////////////////////////////////////////////// // 工程: ClassXP // 版本: 0.32 // 更新: 2003-3-10 // 说明: // 一、简介 // ClassXP 是一个为 Windows 98/ME/2000/XP 系统而设计的控件界面库。使用 ClassXP 能非常简单 // 快速地把应用程序界面设置成 Windows XP 的风格。 // // 二、使用方法 // ClassXP 开发语言为 Win32SDK/C。如果使用 C++ 类的组织代码将会使编写难度大大降低,但是考 // 虑到在 C 中使用以及效率问题,ClassXP 使用了非 OOP 的编程语言,借用了 OOP 的思维方法。因此, // ClassXP 的源代码可以直接在 Visual C++ 的 Win32SDK 和 MFC 等工程中使用。ClassXP 在编写过程中 // 使用的编译环境是 Visual Studio .NET 2002 或 Visual C++ 6.0,可以用两种方式编译: // // 1.动态连接库方式 // (1).在 Visual C++ 中建立空的动态连接库工程,将 ClassXP.c 和 ClassXP.h 文件加入到工程中。 // (2).编译连接生成动态连接库,其中导出函数 ClassXP(),可在所有的语言中使用。 // // 2.源代码方式 // (1).在 Visual C++ 的工程中加入 ClassXP.c 和 ClassXP.h 文件。 // (2).在要使用 ClassXP() 函数的文件中加入『#include "ClassXP.h"』,然后在调用它。 // // 三、注意事项 // // 1.ClassXP 使用了 Windows 中的一些新特性,需要在 Windows 98 及其以上版本中才能使用。 // 2.目前只能将 PushButton、CheckBox、EditBox 和 ComboBox 设置为 ClassXP 风格,这些都没有用到 // 图片,全部都是高效的 GDI 画出来的,有兴趣的话看看源代码…… // //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// // 编译预处理 #pragma once #ifdef _USRDLL // 定义为连接方式,指定编译为动态连接库 #define CXP_DLLMODE #endif //////////////////////////////////////////////////////////////////////////////////////////////////// #if !defined(AFX_CLASSXP_H__F89F6F21_1CEF_11D9_AF5C_0050BAB04A6A__INCLUDED_) #define AFX_CLASSXP_H__F89F6F21_1CEF_11D9_AF5C_0050BAB04A6A__INCLUDED_ #include //////////////////////////////////////////////////////////////////////////////////////////////////// // 宏定义 // 窗口类型 #define CXPT_UNKNOWN -1 // 不能处理的类型 #define CXPT_PUSHBUTTON 0 // 按钮 #define CXPT_CHECKBOX 1 // 复选框 #define CXPT_RADIOBOX 2 // 单选框 #define CXPT_GROUPBOX 3 // 组窗口 #define CXPT_STATEBOX 4 // 说明条 #define CXPT_EDITBOX 5 // 编辑框 #define CXPT_COMBOBOX 6 // 组合框 #define CXPT_LISTBOX 7 // 列表框 #define CXPT_SCROLLBOX 8 // 滚动条 #define CXPT_DIALOG 9 // 弹出窗口 #define CXPT_SPINBOX 10 // 旋转控件 #define CXPT_MONTHCAL 11 // 月历 #define CXPT_PROGRESS 12 // 进度条 #define CXPT_TRACKBAR 13 // 追踪条 #define CXPT_DATETIME 14 // 时间 // 窗口状态 #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 CXPS_NOPAINT 0x00000100L // 无效区状态 #define CXPS_PAINT 0x00000200L // 有效区状态 #define CXPS_HORIZON 0x00000400L // 窗口具有水平属性 (滚动条、旋转控件) #define CXPS_VERTICAL 0x00000800L // 窗口具有垂直属性 (滚动条、旋转控件) //////////////////////////////////////////////////////////////////////////////////////////////////// // 宏定义 // 窗口类型 /* #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 CXPT_SPINBOX 5 // 旋转控件 #define CXPT_SCROLLBAR 6 // 滚动条 #define CXPT_MONTHCAL 7 // 月历 #define CXPT_TABCONTROL 8 // TAB 控件 #define CXPT_PROGRESS 9 // 进度条 #define CXPT_TRACKBAR 10 // 追踪条 // 通用窗口状态 #define CXPS_DISABLED 0x00000001L // 禁用状态 #define CXPS_PRESSED 0x00000002L // 按下状态 #define CXPS_HOTLIGHT 0x00000004L // 高亮状态 (鼠标在该窗口上) #define CXPS_NCHOTLIGHT 0x00000008L // 非客户区高亮状态 (比如鼠标在滚动条上) #define CXPS_FOCUS 0x00000010L // 具有键盘输入焦点 #define CXPS_HORIZON 0x00000020L // 窗口具有水平属性 (滚动条、旋转控件) */ // 按钮、复选框状态 #define CXPB_DEFAULT 0x00010000L // 默认状态 #define CXPB_CHECKED 0x00020000L // 选中状态 #define CXPB_INDETERMINATE 0x00040000L // 未确定状态 // 编辑框状态 #define CXPE_LEFTSPIN 0x00010000L // 左边有旋转控件 #define CXPE_RIGHTSPIN 0x00020000L // 右边有旋转控件 #define CXPE_READONLY 0x10000000L // 只读状态 // 滚动条、旋转控件状态 #define CXPU_UPPART 0x00010000L // 鼠标位于向上/向左框区域 #define CXPU_MIDDLEPART 0x00020000L // 鼠标位于中间区域 (滚动块) #define CXPU_DOWNPART 0x00040000L // 鼠标位于向下/向右区域 #define CXPU_ALIGNLEFT 0x00100000L // 位于编辑框左边 #define CXPU_ALIGNRIGHT 0x00200000L // 位于编辑框右边 // Thumb 箭头状态,用于旋转控件、下拉框、滚动条 #define CXPH_LARGEARROW 0x01000000L // 大的箭头标志 #define CXPH_DROPHANDLE 0x02000000L // 滚动条中间的滚动块使用的托动标志 #define CXPH_SMALLARROW 0x04000000L // 小的箭头标志 #define CXPH_LEFTWARDS 0x08000000L // 箭头向左 #define CXPH_UPWARDS 0x10000000L // 箭头向上 #define CXPH_RIGHTWARDS 0x20000000L // 箭头向右 #define CXPH_DOWNWARDS 0x40000000L // 箭头向下 #define CXPH_HASFRAME 0x80000000L // 具有外框 #define CXPH_AREA 0x00100000L // 绘滚动条中心区域 // 调用标志 /* #define CXPC_CALLCOMMON 0x00010000L // 调用 ClasssifyMsgXP() 取得后继调用标志 #define CXPC_PRECALLWNDPROC 0x00020000L // 在绘制之前调用 CallWindowProc() #define CXPC_PRECALLDEFPROC 0x00040000L // 在绘制之前调用 DefWindowProc() #define CXPC_DRAWCLASSXP 0x00080000L // 绘制 ClassXP 风格 #define CXPC_CALLWNDPROC 0x00100000L // 在绘制之后调用 CallWindowProc() #define CXPC_CALLDEFPROC 0x00200000L // 在绘制之后调用 DefWindowProc() #define CXPC_RETURNVALUE 0x00800000L // 返回一个 16 位的数值 (扩充为 LRESULT) */ //////////////////////////////////////////////////////////////////////////////////////////////////// #ifdef __cplusplus extern "C" BOOL WINAPI ClassXP(HWND hWnd = NULL, BOOL bEnable = TRUE); #else // __cplusplus BOOL WINAPI ClassXP(HWND hWnd, BOOL bEnable); #endif // __cplusplus // 功能: 设置或取消 ClassXP 风格 // 参数: // hWnd 指定要设置或取消窗口的句柄,如果为 NULL 则影响当前线程的所有窗口 // bEnable 指定设置或取消 ClassXP 风格, TRUE 表示设置,FALSE 表示取消 // // 返回: TRUE 表示成功,FALSE 表示失败 //////////////////////////////////////////////////////////////////////////////////////////////////// // 强制使用 C 语言方式编译 #ifdef __cplusplus extern "C" { #endif // __cplusplus //////////////////////////////////////////////////////////////////////////////////////////////////// // 设置窗口状态 #define CXPM_SETSTATE(Data, Mask, IsSet) ((IsSet) ? (Data |= Mask) : (Data &= ~Mask)) //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// // SCROLLXP 结构,所有的代码都是围绕这个结构而编写的 typedef struct tagSCROLLXP { RECT m_ThumbRect; RECT m_ThumbRectOld; RECT m_BottomArrowRect; RECT m_TopArrowRect; RECT m_LeftArrowRect; RECT m_RightArrowRect; RECT m_SizeArea; RECT m_AreaRect ; BOOL m_bMouseDownArrowForback; //上移 BOOL m_bMouseDownArrowForwad; //下移 BOOL m_bMouseDown; POINT m_MouseDownPoint; UINT m_MouseDownTime; BOOL m_bDragging; //正在拖动 UINT m_nThumbTrackPos; } SCROLLXP, * PSCROLLXP; //////////////////////////////////////////////////////////////////////////////////////////////////// // CLASSXP 结构,所有的代码都是围绕这个结构而编写的 typedef struct tagCLASSXP { HWND hWnd; // 窗口句柄 DWORD dwType; // 窗口的类型 DWORD dwState; // 窗口的状态 WNDPROC wpPrev; // 子类化之前的窗口回调函数地址 HRGN hRgn; // 圆形窗区域 HICON hIconDisabled; //禁止时的图标 void *pData; 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, COLORREF crColor[4], DWORD crBack); VOID WINAPI GradientRectXP2(HDC hdc, const RECT &rt,COLORREF crColor[], int fillType); 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); //VOID WINAPI DrawListBoxXP(PCLASSXP pCxp); //VOID WINAPI DrawScrollBoxXP(PCLASSXP pCxp); //////////////////////////////////////////////////////////////////////////////////////////////////// #include "DialogXP.H" #include "ButtonXP.H" #include "EditXP.H" #include "ComboXP.H" #include "ScrollXP.H" #include "SpinXP.H" //////////////////////////////////////////////////////////////////////////////////////////////////// #ifdef __cplusplus } #endif // __cplusplus //////////////////////////////////////////////////////////////////////////////////////////////////// #endif // !defined(AFX_CALSSXP_H__F89F6F21_1CEF_11D9_AF5C_0050BAB04A6A__INCLUDED_)