CXPBase.c
上传用户:dengkfang
上传日期:2008-12-30
资源大小:5233k
文件大小:8k
源码类别:

CA认证

开发平台:

Visual C++

  1. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2. // 预处理
  3. #include "CXPBase.h"
  4. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  5. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  6. // 钩子句柄
  7. extern HHOOK g_hCXPHook;
  8. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  10. // 类名称
  11. const CLASSXP c_cxpClass[] =
  12. {
  13. // uClass ptzClass pDraw wpProc
  14. {CXPC_BUTTON, TEXT("Button"), CXPDrawPushButton, CXPButtonProc}, // 按钮
  15. // {CXPC_STATIC, TEXT("Static"), NULL, NULL}, // 静态控件
  16. {CXPC_EDITBOX, TEXT("Edit"), CXPDrawEditBox, CXPEditBoxProc}, // 编辑框
  17. {CXPC_HOTKEY, TEXT("msctls_hotkey32"), CXPDrawEditBox, CXPEditBoxProc}, // 热键
  18. {CXPC_IPBOX, TEXT("SysIPAddress32"), CXPDrawEditBox, CXPEditBoxProc}, // IP 地址
  19. {CXPC_LISTBOX, TEXT("ListBox"), CXPDrawEditBox, CXPEditBoxProc}, // 列表框
  20. {CXPC_LISTBOX, TEXT("ComboLBox"), CXPDrawEditBox, CXPEditBoxProc}, // 组合列表框
  21. {CXPC_LISTVIEW, TEXT("SysListView32"), CXPDrawEditBox, CXPEditBoxProc}, // 列表查看
  22. {CXPC_TREEVIEW, TEXT("SysTreeView32"), CXPDrawEditBox, CXPEditBoxProc}, // 树形查看
  23. {CXPC_COMBOBOX, TEXT("ComboBox"), CXPDrawComboBox, CXPComboBoxProc}, // 组合框
  24. {CXPC_DATETIME, TEXT("SysDateTimePick32"), CXPDrawComboBox, CXPComboBoxProc}, // 日期/时间选择
  25. {CXPC_SPINBOX, TEXT("msctls_updown32"), CXPDrawSpinBox, CXPSpinBoxProc}, // 旋转控件
  26. // {CXPC_SCROLLBAR, TEXT("ScrollBar"), NULL, NULL}, // 滚动条
  27. // {CXPC_TRACKBAR, TEXT("msctls_trackbar32"), NULL, NULL}, // 滑动条
  28. // {CXPC_PROGRESS, TEXT("msctls_progress32"), NULL, NULL}, // 进度条
  29. // {CXPC_TABCTRL, TEXT("SysTabControl32"), NULL, NULL}, // 制表控件
  30. // {CXPC_CALENDER, TEXT("SysMonthCal32"), NULL, NULL}, // 日历控件
  31. // {CXPC_ANIMATE, TEXT("SysAnimate32"), NULL, NULL}, // 动画控件
  32. // {CXPC_HEADER, TEXT("SysHeader32"), NULL, NULL}, // 标题控件
  33. // {CXPC_TOOLBAR, TEXT("ToolbarWindow32"), NULL, NULL}, // 工具栏
  34. // {CXPC_STATUSBAR, TEXT("msctls_statusbar32"), NULL, NULL}, // 状态栏
  35. };
  36. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  37. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  38. // 钩子函数
  39. LRESULT CALLBACK CXPHookProc(INT iCode, WPARAM wParam, LPARAM lParam)
  40. {
  41. if (((PCWPSTRUCT) lParam)->message == WM_CREATE)
  42. {
  43. CXPSet(((PCWPSTRUCT) lParam)->hwnd, TRUE);
  44. }
  45. return CallNextHookEx(g_hCXPHook, iCode, wParam, lParam);
  46. }
  47. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  48. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  49. // 枚举函数
  50. BOOL CALLBACK CXPEnumProc(HWND hWnd, LPARAM lParam)
  51. {
  52. // 设置或取消窗口 ClassXP
  53. CXPSet(hWnd, (BOOL) lParam);
  54. // 枚举子窗体
  55. EnumChildWindows(hWnd, CXPEnumProc, lParam);
  56. return TRUE;
  57. }
  58. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  59. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  60. // 设置或取消窗口 ClassXP
  61. BOOL CXPSet(HWND hWnd, BOOL bClassXP)
  62. {
  63. PCLASSXP pCxp;
  64. pCxp = (PCLASSXP) GetProp(hWnd, TEXT("ClassXP"));
  65. if (bClassXP && (pCxp == NULL))
  66. {
  67. pCxp = (PCLASSXP) _HeapAlloc(sizeof(CLASSXP));
  68. pCxp->hWnd = hWnd;
  69. pCxp->lStyle = GetWindowLong(hWnd, GWL_STYLE);
  70. if (CXPGetClass(pCxp) && CXPGetState(pCxp))
  71. {
  72. SetProp(hWnd, TEXT("ClassXP"), (HANDLE) pCxp);
  73. pCxp->wpPrev = (WNDPROC) SetWindowLongPtr(hWnd, GWL_WNDPROC, (LONG_PTR) pCxp->wpProc);
  74. RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ERASENOW | RDW_UPDATENOW);
  75. return TRUE;
  76. }
  77. _HeapFree(pCxp);
  78. }
  79. else if ((bClassXP == FALSE) && pCxp)
  80. {
  81. SetWindowLong(hWnd, GWL_WNDPROC, (LONG_PTR) pCxp->wpPrev);
  82. RemoveProp(hWnd, TEXT("ClassXP"));
  83. _HeapFree(pCxp);
  84. RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ERASENOW | RDW_UPDATENOW);
  85. return TRUE;
  86. }
  87. return FALSE;
  88. }
  89. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  90. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  91. // 获取窗口类
  92. BOOL CXPGetClass(PCLASSXP pCxp)
  93. {
  94. UINT i;
  95. TCHAR tzClass[MAX_PATH];
  96. // 查找判断匹配的类名称
  97. _Assert(pCxp);
  98. GetClassName(pCxp->hWnd, tzClass, MAX_PATH);
  99. for (i = 0; i < _NumOf(c_cxpClass); i++)
  100. {
  101. if (lstrcmpi(tzClass, c_cxpClass[i].ptzClass) == 0)
  102. {
  103. CopyMemory(pCxp, &c_cxpClass[i], sizeof(CLASSXP) - sizeof(HWND) * 2);
  104. return TRUE;
  105. }
  106. }
  107. return FALSE;
  108. }
  109. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  110. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  111. // 获取窗口状态
  112. BOOL CXPGetState(PCLASSXP pCxp)
  113. {
  114. PCLASSXP p;
  115. UINT uCheck;
  116. // 设置禁用和焦点状态
  117. pCxp->lState = _CXPGetStyle(WS_DISABLED) ? CXPS_DISABLED : 0;
  118. _ExIf(pCxp->hWnd == GetFocus(), _CXPSetState(CXPS_FOCUS));
  119. switch (pCxp->uClass)
  120. {
  121. case CXPC_BUTTON:
  122. switch (_CXPGetStyle(BS_TYPEMASK))
  123. {
  124. case BS_DEFPUSHBUTTON: // 默认按钮
  125. _CXPSetState(CXPS_DEFAULT);
  126. case BS_PUSHBUTTON: // 普通按钮
  127. break;
  128. case BS_CHECKBOX: // 复选框
  129. case BS_AUTOCHECKBOX: // 自动复选框
  130. case BS_3STATE: // 三状态复选框
  131. case BS_AUTO3STATE: // 自动三状态复选框
  132. case BS_RADIOBUTTON: // 单选框
  133. case BS_AUTORADIOBUTTON: // 自动单选框
  134. if (!_CXPGetStyle(BS_PUSHLIKE))
  135. {
  136. pCxp->pDraw = CXPDrawCheckBox;
  137. }
  138. break;
  139. default: // 自绘按钮、组合框和其它未知类型
  140. return FALSE;
  141. }
  142. uCheck = (LONG) SendMessage(pCxp->hWnd, BM_GETCHECK, 0, 0);
  143. if (uCheck == BST_CHECKED)
  144. {
  145. _CXPSetState(CXPS_CHECKED);
  146. }
  147. else if (uCheck == BST_INDETERMINATE)
  148. {
  149. _CXPSetState(CXPS_INDETERMINATE);
  150. }
  151. break;
  152. case CXPC_EDITBOX:
  153. if (!_CXPGetStyle(WS_BORDER) && !(GetWindowLong(pCxp->hWnd, GWL_EXSTYLE) & (WS_EX_CLIENTEDGE | WS_EX_STATICEDGE)))
  154. {
  155. return FALSE;
  156. }
  157. _ExIf(_CXPGetStyle(ES_READONLY), _CXPSetState(CXPS_READONLY));
  158. break;
  159. case CXPC_COMBOBOX:
  160. if (_CXPGetStyle(CBS_TYPEMASK) == CBS_SIMPLE)
  161. {
  162. _CXPSetState(CXPS_SIMPLECMB);
  163. }
  164. break;
  165. case CXPC_SPINBOX:
  166. _ExIf(_CXPGetStyle(UDS_HORZ), _CXPSetState(CXPS_HORIZON));
  167. _ExIf(_CXPGetStyle(UDS_ARROWKEYS), _CXPSetState(CXPS_ACCELSPIN));
  168. _ExIf(_CXPGetStyle(UDS_ALIGNLEFT), _CXPSetState(CXPS_LEFTSPIN));
  169. _ExIf(_CXPGetStyle(UDS_ALIGNRIGHT), _CXPSetState(CXPS_RIGHTSPIN));
  170. // 设置旧伙伴
  171. p = (PCLASSXP) pCxp->lParam;
  172. _ExIf(p, p->lParam = 0);
  173. p = (PCLASSXP) GetProp((HWND) SendMessage(pCxp->hWnd, UDM_GETBUDDY, 0, 0), TEXT("ClassXP"));
  174. if (p && (p->uClass == CXPC_EDITBOX))
  175. {
  176. // 设置新伙伴
  177. p->lParam = (LPARAM) pCxp;
  178. pCxp->lParam = (LPARAM) p;
  179. }
  180. break;
  181. }
  182. return TRUE;
  183. }
  184. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////