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

CA认证

开发平台:

Visual C++

  1. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2. // 预处理
  3. #pragma once
  4. #include <TChar.h>
  5. #include <Stdio.h>
  6. #include <Stdlib.h>
  7. #include <String.h>
  8. #include <CrtDbg.h>
  9. #include <Windows.h>
  10. #include <ShLWApi.h>
  11. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  12. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  13. // 错误捕捉
  14. #define _Try
  15. #define _Assert _ASSERT
  16. #define _Finally __Finally:
  17. #define _Leave goto __Finally
  18. #define _LeaveIf(c) if (c) {_Leave;}
  19. #define _LeaveExIf(c, e) if (c) {e; _Leave;}
  20. #define _ExIf(c, e) if (c) {e;}
  21. #define _ExIfElse(c, e, l) if (c) {e;} else {l;}
  22. #define _ReturnIf(c) if (c) {return;}
  23. #define _ReturnExIf(c, e) if (c) {e; return;}
  24. #define _ReturnValIf(c, r) if (c) {return r;}
  25. #define _ReturnValExIf(c, e, r) if (c) {e; return r;}
  26. #define _TriIf(c1, c2, v1, v2, v3) ((c1) ? (v1) : ((c2) ? (v2) : (v3)))
  27. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  28. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  29. // 安全释放
  30. #define _SafeDelete(p) if (p) {delete p; p = NULL;}
  31. #define _SafeRelease(p) if (p) {(p)->Release(); p = NULL;}
  32. #define _SafeFreeLibrary(h) if (h) {FreeLibrary(h); h = NULL;}
  33. #define _SafeDeleteObject(h) if (h) {DeleteObject(h); h = NULL;}
  34. #define _SafeCloseHandle(h) if (h) {CloseHandle(h); h = NULL;}
  35. #define _SafeDestroyWindow(h) if (h) {DestroyWindow(h); h = NULL;}
  36. #define _SafeCloseValidHandle(h) if ((h) != INVALID_HANDLE_VALUE) {CloseHandle(h); h = INVALID_HANDLE_VALUE;}
  37. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  38. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  39. // Windows 版本
  40. #define _WinVer _winver
  41. #define _WinVerMajor _winmajor
  42. #define _WinVerMinor _winminor
  43. #define _WinVerBuild _osver
  44. #define _WinVerEqualNT() ((GetVersion() & 0x80000000) == 0)
  45. #define _WinVerEqual(a, i) ((_WinVerMajor == a) && (_WinVerMinor == i))
  46. #define _WinVerAbove(a, i) ((_WinVerMajor > a) || ((_WinVerMajor == a) && (_WinVerMinor > i)))
  47. #define _WinVerBelow(a, i) ((_WinVerMajor < a) || ((_WinVerMajor == a) && (_WinVerMinor < i)))
  48. #define _WinVerAboveEqual(a, i) ((_WinVerMajor > a) || ((_WinVerMajor == a) && (_WinVerMinor >= i)))
  49. #define _WinVerBelowEqual(a, i) ((_WinVerMajor < a) || ((_WinVerMajor == a) && (_WinVerMinor <= i)))
  50. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  51. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  52. // 常用函数简写
  53. #define _HeapAlloc(n) HeapAlloc(GetProcessHeap(), 0, n)
  54. #define _HeapAllocZero(n) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, n)
  55. #define _HeapFree(p) HeapFree(GetProcessHeap(), 0, (PVOID) p)
  56. #define _ShellOpen(f, p, s) ShellExecute(NULL, TEXT("open"), f, p, NULL, s)
  57. #define _CreateThread(f, p, d) CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) f, (PVOID) p, 0, (PDWORD) d)
  58. #define _BeginThread(f, p) {DWORD dwThread; CloseHandle(_CreateThread(f, p, &dwThread));}
  59. #define _CreateFileForRead(f) CreateFile(f, GENERIC_READ, 3, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL)
  60. #define _CreateFileForWrite(f) CreateFile(f, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL)
  61. #define _CreateFileForAppend(f) CreateFile(f, GENERIC_ALL, FILE_SHARE_READ, NULL, OPEN_ALWAYS, 0, NULL)
  62. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  63. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  64. // 交换变量值
  65. #define _Swap(t, x, y) {t m = x; x = y; y = m;}
  66. // 限制数值范围
  67. #define _Bound(v, vMin, vMax) (((v) > (vMax)) ? (vMax) : ((v < vMin) ? (vMin) : (v)))
  68. #define _InBound(v, vMin, vMax) (((v) > (vMin)) && ((v) < (vMax)))
  69. #define _OnBound(v, vMin, vMax) (((v) >= (vMin)) && ((v) <= (vMax)))
  70. // 矩形宽度和高度
  71. #define _RectWidth(r) ((r).right - (r).left)
  72. #define _RectHeight(r) ((r).bottom - (r).top)
  73. #define _SmallRectWidth(r) ((r).Right - (r).Left)
  74. #define _SmallRectHeight(r) ((r).Bottom - (r).Top)
  75. // DIB 计算
  76. #define _DibPitch(w, i) ((((w * i) + 31) & ~31) / 8)
  77. #define _DibSize(w, i, h) (_DibPitch(w, i) * h)
  78. #define _DibBits(p, w, i, x, y) (p + _DibPitch(w, i) * y + x * 3)
  79. #define _DibPitch24(w) ((w + w + w + 3) & 0xFFFFFFFC)
  80. #define _DibSize24(w, h) (_DibPitch24(w) * h)
  81. #define _DibBits24(p, w, x, y) (p + _DibPitch24(w) * y + x * 3)
  82. // 数组元素个数
  83. #define _NumOf(s) (sizeof(s) / sizeof(s[0]))
  84. // 内存初始化
  85. #define _FillMem(s, c) memset(&(s), c, sizeof(s))
  86. #define _ZeroMem(s) _FillMem(s, 0)
  87. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  88. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  89. // 字符串常量的字符个数
  90. #define _LenOf(s) (_NumOf(s) - 1)
  91. // 字符串常量的零字符位置
  92. #define _EndOf(s) (s + _LenOf(s))
  93. // 字符串占用的字节数
  94. #define _AStrSize(a) (lstrlenA(a) + 1)
  95. #define _WStrSize(w) ((lstrlenW(w) + 1) * sizeof(WCHAR))
  96. #define _StrSize(t) ((lstrlen(t) + 1) * sizeof(TCHAR))
  97. // 字符串的零字符位置
  98. #define _AStrEnd(a) (a + lstrlenA(a))
  99. #define _WStrEnd(w) (w + lstrlenW(w))
  100. #define _StrEnd(t) (t + lstrlen(t))
  101. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  102. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  103. // 字符串转换拷贝
  104. #define _WStrToAStrN(a, w, n) WideCharToMultiByte(CP_ACP, 0, w, -1, a, n, NULL, NULL)
  105. #define _AStrToWStrN(w, a, n) MultiByteToWideChar(CP_ACP, 0, a, -1, w, n)
  106. #define _StrToStrN(t1, t2, n) lstrcpyn(t1, t2, n)
  107. #ifdef _UNICODE
  108. #define _StrToAStrN(a, t, n) _WStrToAStrN(a, t, n)
  109. #define _StrToWStrN(w, t, n) lstrcpyn(w, t, n)
  110. #define _AStrToStrN(t, a, n) _AStrToWStrN(t, a, n)
  111. #define _WStrToStrN(t, w, n) lstrcpyn(t, w, n)
  112. #else
  113. #define _StrToAStrN(a, t, n) lstrcpyn(a, t, n)
  114. #define _StrToWStrN(w, t, n) _AStrToWStrN(w, t, n)
  115. #define _AStrToStrN(t, a, n) lstrcpyn(t, a, n)
  116. #define _WStrToStrN(t, w, n) _WStrToAStrN(t, w, n)
  117. #endif
  118. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  119. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  120. // 字符串转换拷贝到字符数组
  121. #define _WStrToAStr(a, w) _WStrToAStrN(a, w, _NumOf(a))
  122. #define _AStrToWStr(w, a) _AStrToWStrN(w, a, _NumOf(w))
  123. #define _StrToStr(t1, t2) _StrToStrN(t1, t2, _NumOf(t1))
  124. #define _StrToAStr(a, t) _StrToAStrN(a, t, _NumOf(a))
  125. #define _StrToWStr(w, t) _StrToWStrN(w, t, _NumOf(w))
  126. #define _AStrToStr(t, a) _AStrToStrN(t, a, _NumOf(t))
  127. #define _WStrToStr(t, w) _WStrToStrN(t, w, _NumOf(t))
  128. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  129. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  130. // 字符串换成整数
  131. #if (_WINVER >= 0x0410)
  132. #define _AStrToInt(a) StrToIntA(a)
  133. #define _WStrToInt(w) StrToIntW(w)
  134. #define _StrToInt(t) StrToInt(t)
  135. #else
  136. #define _AStrToInt(a) atoi(a)
  137. #define _WStrToInt(w) _wtoi(w)
  138. #ifdef _UNICODE
  139. #define _StrToInt(t) _wtoi(t)
  140. #else
  141. #define _StrToInt(t) atoi(t)
  142. #endif
  143. #endif
  144. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  145. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  146. // 字符和字符串查找
  147. #if (_WINVER >= 0x0410)
  148. #define _AStrStr(s1, s2) StrStrA(s1, s2)
  149. #define _WStrStr(w1, w2) StrStrW(w1, w2)
  150. #define _StrStr(t1, t2) StrStr(t1, t2)
  151. #define _AStrChr(a, c) StrChrA(a, c)
  152. #define _WStrChr(w, c) StrChrW(w, c)
  153. #define _StrChr(t, c) StrChr(t, c)
  154. #define _AStrRChr(a, c) StrRChrA(a, NULL, c)
  155. #define _WStrRChr(w, c) StrRChrW(w, NULL, c)
  156. #define _StrRChr(t, c) StrRChr(t, NULL, c)
  157. #else
  158. #define _AStrStr(s1, s2) strstr(s1, s2)
  159. #define _WStrStr(w1, w2) wcsstr(1w, w2)
  160. #define _AStrChr(a, c) strchr(a, c)
  161. #define _WStrChr(w, c) wcschr(w, c)
  162. #define _AStrRChr(a, c) strrchr(a, c)
  163. #define _WStrRChr(w, c) wcsrchr(w, c)
  164. #ifdef _UNICODE
  165. #define _StrStr(t1, t2) wcsstr(t1, t2)
  166. #define _StrChr(t, c) wcschr(t, c)
  167. #define _StrRChr(t, c) wcsrchr(t, c)
  168. #else
  169. #define _StrStr(t1, t2) strstr(t1, t2)
  170. #define _StrChr(t, c) strchr(t, c)
  171. #define _StrRChr(t, c) strrchr(t, c)
  172. #endif
  173. #endif
  174. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  175. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  176. // 获取和设置状态
  177. #define _CXPGetState(s) (pCxp->lState & (s))
  178. #define _CXPSetState(s) (pCxp->lState |= (s))
  179. #define _CXPClearState(s) (pCxp->lState &= ~(s))
  180. #define _CXPSetState2(s, b) ((b) ? _CXPSetState(s) : _CXPClearState(s))
  181. // 获取和设置风格
  182. #define _CXPGetStyle(s) (pCxp->lStyle & (s))
  183. #define _CXPSetStyle(s) (pCxp->lStyle |= (s))
  184. #define _CXPClearStyle(s) (pCxp->lStyle &= ~(s))
  185. #define _CXPSetStyle2(s, b) ((b) ? _CXPSetStyle(s) : _CXPClearStyle(s))
  186. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  187. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  188. // 绘制位图
  189. #define _DrawDIB(x, y, w, h, p, b) SetDIBitsToDevice(hDC, x, y, w, h, 0, 0, 0, h, p, (PBITMAPINFO) (b), DIB_RGB_COLORS)
  190. #define _DrawLine(x1, y1, x2, y2, crColor)
  191. {
  192. HPEN _hPen = SelectObject(hDC, CreatePen(PS_SOLID, 1, crColor));
  193. MoveToEx(hDC, x1, y1, NULL);
  194. LineTo(hDC, x2, y2);
  195. DeleteObject(SelectObject(hDC, _hPen));
  196. }
  197. // 绘制矩形
  198. #define _FillRect(crColor)
  199. {
  200. HBRUSH _hBrush = CreateSolidBrush(crColor);
  201. FillRect(hDC, &rtRect, _hBrush);
  202. DeleteObject(_hBrush);
  203. }
  204. // 绘制边框
  205. #define _FrameRect(crColor)
  206. {
  207. HBRUSH _hBrush = CreateSolidBrush(crColor);
  208. FrameRect(hDC, &rtRect, _hBrush);
  209. DeleteObject(_hBrush);
  210. }
  211. // 绘制圆形
  212. #define _Ellipse(crFrame, crFill)
  213. {
  214. HPEN _hPen; HBRUSH _hBrush;
  215. _hPen = (HPEN) SelectObject(hDC, CreatePen(PS_SOLID, 1, crFrame));
  216. _hBrush = (HBRUSH) SelectObject(hDC, CreateSolidBrush(crFill));
  217. Ellipse(hDC, rtRect.left, rtRect.top, rtRect.right, rtRect.bottom);
  218. DeleteObject(SelectObject(hDC, _hBrush));
  219. DeleteObject(SelectObject(hDC, _hPen));
  220. }
  221. // 绘制文本
  222. #define _DrawText(tzText, crColor, uFormat)
  223. {
  224. HFONT _hFont;
  225. _hFont = (HFONT) SelectObject(hDC, (HGDIOBJ) SendMessage(pCxp->hWnd, WM_GETFONT, 0, 0));
  226. SetTextColor(hDC, crColor);
  227. DrawText(hDC, tzText, -1, &rtRect, uFormat);
  228. SelectObject(hDC, _hFont);
  229. }
  230. // 绘制焦点文本
  231. #define _DrawFocusText(tzText, crColor)
  232. {
  233. HFONT _hFont; INT _TextHeight;
  234. _hFont = (HFONT) SelectObject(hDC, (HGDIOBJ) SendMessage(pCxp->hWnd, WM_GETFONT, 0, 0));
  235. SetTextColor(hDC, crColor);
  236. _TextHeight = DrawText(hDC, tzText, -1, &rtRect, DT_VCENTER | DT_SINGLELINE);
  237. if (_CXPGetState(CXPS_FOCUS))
  238. {
  239. rtRect.top += _RectHeight(rtRect) - _TextHeight - 2;
  240. rtRect.bottom = rtRect.top + DrawText(hDC, tzText, -1, &rtRect, DT_CALCRECT | DT_SINGLELINE) + 2;
  241. rtRect.left--; rtRect.right++;
  242. DrawFocusRect(hDC, &rtRect);
  243. }
  244. SelectObject(hDC, _hFont);
  245. }
  246. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  247. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  248. // 开始绘制
  249. #define _CXPBeginDraw(hMemDC, bFill, bBlt)
  250. HDC _hDC; INT _iWidth; INT _iHeight; HBITMAP _hBitmap;
  251. _hDC = GetWindowDC(pCxp->hWnd);
  252. hMemDC = CreateCompatibleDC(_hDC);
  253. SetBkMode(hMemDC, TRANSPARENT);
  254. GetWindowRect(pCxp->hWnd, &rtRect);
  255. _iWidth = _RectWidth(rtRect);
  256. _iHeight = _RectHeight(rtRect);
  257. _hBitmap = (HBITMAP) SelectObject(hMemDC, CreateCompatibleBitmap(_hDC, _iWidth, _iHeight));
  258. SetRect(&rtRect, 0, 0, _iWidth, _iHeight);
  259. if (bFill)
  260. {
  261. _FillRect(CXPR_CANVAS);
  262. }
  263. else if (bBlt)
  264. {
  265. BitBlt(hMemDC, 0, 0, _iWidth, _iHeight, _hDC, 0, 0, SRCCOPY);
  266. }
  267. // 结束绘制景
  268. #define _CXPEndDraw(hMemDC)
  269. BitBlt(_hDC, 0, 0, _iWidth, _iHeight, hMemDC, 0, 0, SRCCOPY);
  270. DeleteObject(SelectObject(hMemDC, _hBitmap));
  271. DeleteDC(hMemDC);
  272. ReleaseDC(pCxp->hWnd, _hDC);
  273. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////