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

CA认证

开发平台:

Visual C++

  1. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2. // 预处理
  3. #include "CXPBase.h"
  4. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  5. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  6. // 箭头数据
  7. POINT c_ptCXPArrow[][10] =
  8. {
  9. {{-2, +0}, {-2, +1}, {-1, -1}, {-1, +2}, {+0, -2}, {+0, +3}, {+1, -3}, {+1, +0}, {+1, +1}, {+1, +4}},
  10. {{+2, +0}, {+2, +1}, {+1, -1}, {+1, +2}, {+0, -2}, {+0, +3}, {-1, -2}, {-1, +0}, {-1, +1}, {-1, +4}},
  11. {{-3, +1}, {+0, +1}, {+1, +1}, {+4, +1}, {-2, +0}, {+3, +0}, {-1, -1}, {+2, -1}, {+0, -2}, {+1, -2}},
  12. {{-3, -1}, {+0, -1}, {+1, -1}, {+4, -1}, {-2, +0}, {+3, +0}, {-1, +1}, {+2, +1}, {+0, +2}, {+1, +2}},
  13. {{+1, -4}, {-3, +0}, {+2, +5}, {+1, -3}, {-2, +0}, {+2, +4}, {+2, -3}, {-1, +0}, {+3, +4}, {+0, +0}},
  14. {{-1, -4}, {+3, +0}, {-2, +5}, {-1, -3}, {+2, +0}, {-2, +4}, {-2, -3}, {+1, +0}, {-3, +4}, {+0, +0}},
  15. {{-4, +1}, {+0, -3}, {+5, +2}, {-3, +1}, {+0, -2}, {+4, +2}, {-3, +2}, {+0, -1}, {+4, +3}, {+0, +0}},
  16. {{-4, -1}, {+0, +3}, {+5, -2}, {-3, -1}, {+0, +2}, {+4, -2}, {-3, -2}, {+0, +1}, {+4, -3}, {+0, +0}},
  17. };
  18. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  19. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  20. // 追踪鼠标移出消息
  21. BOOL CXPTrackMouseLeave(HWND hWnd)
  22. {
  23. typedef BOOL (WINAPI *TMEPROC)(LPTRACKMOUSEEVENT);
  24. static TMEPROC s_pTrackMouseEvent = NULL;
  25. static TRACKMOUSEEVENT tmeLeave = {sizeof(TRACKMOUSEEVENT), TME_LEAVE};
  26. if (s_pTrackMouseEvent == NULL)
  27. {
  28. s_pTrackMouseEvent = (TMEPROC) GetProcAddress(GetModuleHandle(TEXT("USER32")), "TrackMouseEvent");
  29. if (s_pTrackMouseEvent == NULL)
  30. {
  31. s_pTrackMouseEvent = (TMEPROC) GetProcAddress(GetModuleHandle(TEXT("COMCTL32")), "_TrackMouseEvent");
  32. }
  33. }
  34. tmeLeave.hwndTrack = hWnd;
  35. return s_pTrackMouseEvent ? s_pTrackMouseEvent(&tmeLeave) : FALSE;
  36. }
  37. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  38. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  39. // 绘制箭头
  40. VOID CXPDrawArrow(HDC hDC, UINT x, UINT y, UINT uDir, COLORREF crColor)
  41. {
  42. HPEN hPen;
  43. hPen = (HPEN) SelectObject(hDC, CreatePen(PS_SOLID, 1, crColor));
  44. if (uDir < CXPA_LARGELEFT)
  45. {
  46. MoveToEx(hDC, x + c_ptCXPArrow[uDir][0].x, y + c_ptCXPArrow[uDir][0].y, NULL);
  47. LineTo(hDC, x+ c_ptCXPArrow[uDir][1].x, y + c_ptCXPArrow[uDir][1].y);
  48. MoveToEx(hDC, x+ c_ptCXPArrow[uDir][2].x, y + c_ptCXPArrow[uDir][2].y, NULL);
  49. LineTo(hDC, x+ c_ptCXPArrow[uDir][3].x, y + c_ptCXPArrow[uDir][3].y);
  50. MoveToEx(hDC, x+ c_ptCXPArrow[uDir][4].x, y + c_ptCXPArrow[uDir][4].y, NULL);
  51. LineTo(hDC, x+ c_ptCXPArrow[uDir][5].x, y + c_ptCXPArrow[uDir][5].y);
  52. MoveToEx(hDC, x+ c_ptCXPArrow[uDir][6].x, y + c_ptCXPArrow[uDir][6].y, NULL);
  53. LineTo(hDC, x+ c_ptCXPArrow[uDir][7].x, y + c_ptCXPArrow[uDir][7].y);
  54. MoveToEx(hDC, x+ c_ptCXPArrow[uDir][8].x, y + c_ptCXPArrow[uDir][8].y, NULL);
  55. LineTo(hDC, x+ c_ptCXPArrow[uDir][9].x, y + c_ptCXPArrow[uDir][9].y);
  56. }
  57. else
  58. {
  59. MoveToEx(hDC, x + c_ptCXPArrow[uDir][0].x, y + c_ptCXPArrow[uDir][0].y, NULL);
  60. LineTo(hDC, x + c_ptCXPArrow[uDir][1].x, y + c_ptCXPArrow[uDir][1].y);
  61. LineTo(hDC, x + c_ptCXPArrow[uDir][2].x, y + c_ptCXPArrow[uDir][2].y);
  62. MoveToEx(hDC, x + c_ptCXPArrow[uDir][3].x, y  + c_ptCXPArrow[uDir][3].y, NULL);
  63. LineTo(hDC, x + c_ptCXPArrow[uDir][4].x, y + c_ptCXPArrow[uDir][4].y);
  64. LineTo(hDC, x + c_ptCXPArrow[uDir][5].x, y + c_ptCXPArrow[uDir][5].y);
  65. MoveToEx(hDC, x + c_ptCXPArrow[uDir][6].x, y + c_ptCXPArrow[uDir][6].y, NULL);
  66. LineTo(hDC, x + c_ptCXPArrow[uDir][7].x, y + c_ptCXPArrow[uDir][7].y);
  67. LineTo(hDC, x + c_ptCXPArrow[uDir][8].x, y + c_ptCXPArrow[uDir][8].y);
  68. }
  69. DeleteObject(SelectObject(hDC, hPen));
  70. }
  71. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  72. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  73. // 位图混合
  74. VOID CXPDibBlend(PBYTE pbDst, PBYTE pbSrc, UINT uPixel)
  75. {
  76. UINT i;
  77. BYTE r[4];
  78. *((PDWORD) r) = CXPR_CANVAS;
  79. for (i = uPixel; i; i--)
  80. {
  81. pbDst[0] = pbSrc[0] * pbSrc[3] / 255 + r[2] - r[2] * pbSrc[3] / 255;
  82. pbDst[1] = pbSrc[1] * pbSrc[3] / 255 + r[1] - r[1] * pbSrc[3] / 255;
  83. pbDst[2] = pbSrc[2] * pbSrc[3] / 255 + r[0] - r[0] * pbSrc[3] / 255;
  84. pbDst[3] = 0;
  85. pbDst += 4;
  86. pbSrc += 4;
  87. }
  88. }
  89. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  90. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  91. // 位图混合水平扩展
  92. VOID CXPDibBlendHorzExt(PBYTE pbDst, UINT uDstWidth, PBYTE pbSrc, UINT uSrcWidth, UINT uHeight)
  93. {
  94. INT x;
  95. INT y;
  96. DWORD dwColor;
  97. UINT uHalfWidth;
  98. uHalfWidth = (min(uDstWidth, uSrcWidth) + 1) / 2;
  99. for (y = uHeight; y; y--)
  100. {
  101. CXPDibBlend(pbDst, pbSrc, uHalfWidth);
  102. pbSrc += (uSrcWidth - uHalfWidth) * 4;
  103. pbDst += (uDstWidth - uHalfWidth) * 4;
  104. CXPDibBlend(pbDst, pbSrc, uHalfWidth);
  105. dwColor = *((PDWORD) pbDst);
  106. for (x = 0; x < (INT) (uDstWidth - uSrcWidth); x++)
  107. {
  108. pbDst -= 4;
  109. *((PDWORD) pbDst) = dwColor;
  110. }
  111. pbSrc += uHalfWidth * 4;
  112. pbDst += uHalfWidth * 4 + x * 4;
  113. }
  114. }
  115. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  116. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  117. // 位图混合垂直扩展
  118. VOID CXPDibBlendVertExt(PBYTE pbDst, UINT uDstHeight, PBYTE pbSrc, UINT uWidth, UINT uSrcHeight)
  119. {
  120. INT y;
  121. UINT uStride;
  122. UINT uHalfHeight;
  123. uStride = uWidth * 4;
  124. uHalfHeight = (min(uDstHeight, uSrcHeight) + 1) / 2;
  125. CXPDibBlend(pbDst, pbSrc, uWidth * uHalfHeight);
  126. pbSrc += uStride * (uSrcHeight  - uHalfHeight);
  127. pbDst += uStride * (uDstHeight  - uHalfHeight);
  128. CXPDibBlend(pbDst, pbSrc, uWidth * uHalfHeight);
  129. pbSrc = pbDst;
  130. for (y = uDstHeight - uSrcHeight; y > 0; y--)
  131. {
  132. pbDst -= uStride;
  133. CopyMemory(pbDst, pbSrc, uStride);
  134. }
  135. }
  136. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  137. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  138. // 背景混合扩展
  139. VOID CXPDibBlendExt(PBYTE pbDst, UINT uDstWidth, UINT uDstHeight, PBYTE pbSrc, UINT uSrcWidth, UINT uSrcHeight)
  140. {
  141. INT y;
  142. UINT uHalfHeight;
  143. if (uDstHeight < uSrcHeight)
  144. {
  145. y = 0;
  146. }
  147. uHalfHeight = (min(uDstHeight, uSrcHeight) + 1) / 2;
  148. CXPDibBlendHorzExt(pbDst, uDstWidth, pbSrc, uSrcWidth, uHalfHeight);
  149. pbSrc += uSrcWidth * 4 * (uSrcHeight - uHalfHeight);
  150. pbDst += uDstWidth * 4 * (uDstHeight - uHalfHeight);
  151. CXPDibBlendHorzExt(pbDst, uDstWidth, pbSrc, uSrcWidth, uHalfHeight);
  152. pbSrc = pbDst;
  153. for (y = uDstHeight - uSrcHeight; y > 0; y--)
  154. {
  155. pbDst -= uDstWidth * 4;
  156. CopyMemory(pbDst, pbSrc, uDstWidth * 4);
  157. }
  158. }
  159. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////