RadioExt.cpp 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. // RadioExt.cpp: implementation of the CRadioExt class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "RadioExt.h"
  6. #include "library.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. WNDPROC CRadioExt::m_cWndProc = NULL;
  13. int CRadioExt::pos = 0;
  14. //////////////////////////////////////////////////////////////////////
  15. // Construction/Destruction
  16. //////////////////////////////////////////////////////////////////////
  17. LRESULT CRadioExt::DefWindowProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
  18. {
  19. CPoint point;
  20. LRESULT lReturn;
  21. TRACKMOUSEEVENT Tme;
  22. pos=FindPos((DWORD)hWnd, g_wndstatelist);
  23. pos++;
  24. switch( message )
  25. {
  26. case WM_ERASEBKGND:
  27. return 1;
  28. case WM_NCPAINT:
  29. case WM_PAINT:
  30. CallWindowProc( m_cWndProc, hWnd, message, wParam, lParam );
  31. OnPaint( hWnd );
  32. return 1;
  33. case BM_SETSTYLE: // 按钮风格改变
  34. CXPM_SETSTATE(g_wndstatelist.ElementAt (pos), CXPS_DEFAULT, wParam & BS_DEFPUSHBUTTON);
  35. OnPaint( hWnd );
  36. break;
  37. case BM_SETSTATE: // 设置按钮状态
  38. lReturn = (LONG) CallWindowProc( m_cWndProc, hWnd, message, wParam, lParam );
  39. CXPM_SETSTATE(g_wndstatelist.ElementAt (pos), CXPS_PRESSED, wParam);
  40. OnPaint( hWnd );
  41. return lReturn;
  42. case BM_SETCHECK: // 设置选中状态
  43. lReturn = (LONG) CallWindowProc( m_cWndProc, hWnd, message, wParam, lParam );
  44. CXPM_SETSTATE(g_wndstatelist.ElementAt (pos), CXPS_CHECKED, (wParam == BST_CHECKED));
  45. CXPM_SETSTATE(g_wndstatelist.ElementAt (pos), CXPS_INDETERMINATE, (wParam == BST_INDETERMINATE));
  46. OnPaint( hWnd );
  47. return lReturn;
  48. case WM_SETTEXT: // 设置窗口文本
  49. lReturn = (LONG) CallWindowProc( m_cWndProc, hWnd, message, wParam, lParam );
  50. OnPaint( hWnd );
  51. return lReturn;
  52. case WM_MOUSELEAVE: // 鼠标移出
  53. if (g_wndstatelist.ElementAt (pos) & CXPS_HOTLIGHT)
  54. {
  55. g_wndstatelist.ElementAt (pos) &= ~CXPS_HOTLIGHT;
  56. }
  57. if (g_wndstatelist.ElementAt (pos) & CXPS_PRESSED)
  58. {
  59. g_wndstatelist.ElementAt (pos) &= ~CXPS_PRESSED;
  60. }
  61. OnPaint( hWnd );
  62. return 0;
  63. case WM_MOUSEMOVE: // 窗口移动
  64. if (((g_wndstatelist.ElementAt (pos) & CXPS_HOTLIGHT) == 0) && ((wParam & MK_LBUTTON) == 0))
  65. {
  66. g_wndstatelist.ElementAt (pos) |= CXPS_HOTLIGHT;
  67. OnPaint( hWnd );
  68. // 追踪鼠标移出消息一次
  69. Tme.cbSize = sizeof(TRACKMOUSEEVENT);
  70. Tme.dwFlags = TME_LEAVE;
  71. Tme.hwndTrack = hWnd;
  72. _TrackMouseEvent(&Tme);
  73. }
  74. break;
  75. case WM_ENABLE: // 窗口被设置为禁用或可用
  76. CXPM_SETSTATE(g_wndstatelist.ElementAt (pos), CXPS_DISABLED, !wParam);
  77. OnPaint( hWnd );
  78. break;
  79. case WM_DESTROY:
  80. {
  81. g_wndstatelist.RemoveAt(pos);
  82. g_wndstatelist.RemoveAt(pos-1);
  83. break;
  84. }
  85. default:
  86. break;
  87. }
  88. return CallWindowProc( m_cWndProc, hWnd, message, wParam, lParam );
  89. }
  90. void CRadioExt::OnPaint( HWND hWnd )
  91. {
  92. RECT Rect,rc, rcText;
  93. MEMDCXP Mdcxp;
  94. HANDLE hHandle, hPen;
  95. char szTemp[256];
  96. DWORD dwStyle;
  97. HDC hDC;
  98. // 获取内存兼容设备场景
  99. Mdcxp.hWnd = hWnd;
  100. Mdcxp.bTransfer = FALSE;
  101. Mdcxp.hBitmap = NULL;
  102. g_bDrawBk=1;
  103. GetMemDCXP(&Mdcxp);
  104. hDC = Mdcxp.hMemDC;
  105. // 获取窗口大小
  106. GetWindowRect(hWnd, &Rect);
  107. Rect.right -= Rect.left;
  108. Rect.bottom -= Rect.top;
  109. Rect.left = Rect.top = 0;
  110. // 填充背景
  111. // hHandle = CreateSolidBrush(g_crDialogbkColor);
  112. // FillRect(hDC,&Rect, (HBRUSH)hHandle);
  113. // DeleteObject(hHandle);
  114. //按显示模式调整位置
  115. dwStyle = GetWindowLong(hWnd, GWL_STYLE);
  116. if (Rect.bottom > 13)
  117. {
  118. Rect.top = (Rect.bottom - 13)/2;
  119. Rect.bottom = Rect.top + 13;
  120. }
  121. if (dwStyle & BS_LEFTTEXT)
  122. {
  123. rcText = Rect;
  124. rcText.right -= 17;
  125. Rect.left = Rect.right - 13;
  126. }
  127. else
  128. {
  129. rcText = Rect;
  130. rcText.left += 17;
  131. Rect.left = 0;
  132. Rect.right = 13;
  133. }
  134. rc=Rect;
  135. // 画热点框渐变背景(橘黄色)
  136. if (!(g_wndstatelist.ElementAt (pos) & CXPS_DISABLED))
  137. {
  138. if (g_wndstatelist.ElementAt (pos) & CXPS_PRESSED||g_wndstatelist.ElementAt (pos) & CXPS_HOTLIGHT)
  139. {
  140. CDC* pDC=CDC::FromHandle (hDC);
  141. rc.top -=2;
  142. pDC->SetPixel(CPoint(7+rc.left ,rc.top+4),RGB(244,212,140));
  143. pDC->SetPixel(CPoint(4+rc.left,rc.top+5),RGB(181,196,207));
  144. pDC->SetPixel(CPoint(5+rc.left,rc.top+5),RGB(181,196,207));
  145. pDC->SetPixel(CPoint(6+rc.left,rc.top+5),RGB(253,214,132));
  146. pDC->SetPixel(CPoint(7+rc.left,rc.top+5),RGB(253,214,132));
  147. pDC->SetPixel(CPoint(8+rc.left,rc.top+5),RGB(253,214,132));
  148. pDC->SetPixel(CPoint(9+rc.left,rc.top+5),RGB(253,214,132));
  149. pDC->SetPixel(CPoint(4+rc.left,rc.top+6),RGB(252,220,152));
  150. pDC->SetPixel(CPoint(5+rc.left,rc.top+6),RGB(252,220,152));
  151. pDC->SetPixel(CPoint(6+rc.left,rc.top+6),RGB(247,227,179));
  152. pDC->SetPixel(CPoint(7+rc.left,rc.top+6),RGB(242,237,215));
  153. pDC->SetPixel(CPoint(8+rc.left,rc.top+6),RGB(247,227,179));
  154. pDC->SetPixel(CPoint(9+rc.left,rc.top+6),RGB(251,200,99));
  155. pDC->SetPixel(CPoint(10+rc.left,rc.top+6),RGB(251,200,99));
  156. pDC->SetPixel(CPoint(3+rc.left,rc.top+7),RGB(254,223,156));
  157. pDC->SetPixel(CPoint(4+rc.left,rc.top+7),RGB(254,220,152));
  158. pDC->SetPixel(CPoint(5+rc.left,rc.top+7),RGB(233,236,210));
  159. pDC->SetPixel(CPoint(9+rc.left,rc.top+7),RGB(233,236,210));
  160. pDC->SetPixel(CPoint(10+rc.left,rc.top+7),RGB(251,200,99));
  161. pDC->SetPixel(CPoint(11+rc.left,rc.top+7),RGB(251,200,99));
  162. pDC->SetPixel(CPoint(3+rc.left,rc.top+8),RGB(253,217,140));
  163. pDC->SetPixel(CPoint(4+rc.left,rc.top+8),RGB(247,227,179));
  164. pDC->SetPixel(CPoint(10+rc.left,rc.top+8),RGB(247,227,179));
  165. pDC->SetPixel(CPoint(11+rc.left,rc.top+8),RGB(251,200,99));
  166. pDC->SetPixel(CPoint(2+rc.left,rc.top+9),RGB(254,223,156));
  167. pDC->SetPixel(CPoint(3+rc.left,rc.top+9),RGB(254,220,152));
  168. pDC->SetPixel(CPoint(4+rc.left,rc.top+9),RGB(233,236,210));
  169. pDC->SetPixel(CPoint(10+rc.left,rc.top+9),RGB(233,236,210));
  170. pDC->SetPixel(CPoint(11+rc.left,rc.top+9),RGB(251,200,99));
  171. pDC->SetPixel(CPoint(12+rc.left,rc.top+9),RGB(251,200,99));
  172. pDC->SetPixel(CPoint(3+rc.left,rc.top+10),RGB(252,211,124));
  173. pDC->SetPixel(CPoint(4+rc.left,rc.top+10),RGB(246,224,172));
  174. pDC->SetPixel(CPoint(10+rc.left,rc.top+10),RGB(251,200,99));
  175. pDC->SetPixel(CPoint(11+rc.left,rc.top+10),RGB(251,200,99));
  176. pDC->SetPixel(CPoint(3+rc.left,rc.top+11),RGB(254,223,156));
  177. pDC->SetPixel(CPoint(4+rc.left,rc.top+11),RGB(254,220,152));
  178. pDC->SetPixel(CPoint(5+rc.left,rc.top+11),RGB(233,236,210));
  179. pDC->SetPixel(CPoint(9+rc.left,rc.top+11),RGB(233,236,210));
  180. pDC->SetPixel(CPoint(10+rc.left,rc.top+11),RGB(251,200,99));
  181. pDC->SetPixel(CPoint(11+rc.left,rc.top+11),RGB(251,200,99));
  182. pDC->SetPixel(CPoint(4+rc.left,rc.top+12),RGB(253,217,140));
  183. pDC->SetPixel(CPoint(5+rc.left,rc.top+12),RGB(253,217,140));
  184. pDC->SetPixel(CPoint(6+rc.left,rc.top+12),RGB(247,227,179));
  185. pDC->SetPixel(CPoint(8+rc.left,rc.top+12),RGB(247,227,179));
  186. pDC->SetPixel(CPoint(9+rc.left,rc.top+12),RGB(251,200,99));
  187. pDC->SetPixel(CPoint(10+rc.left,rc.top+12),RGB(251,200,99));
  188. pDC->SetPixel(CPoint(5+rc.left,rc.top+13),RGB(251,200,99));
  189. pDC->SetPixel(CPoint(6+rc.left,rc.top+13),RGB(251,200,99));
  190. pDC->SetPixel(CPoint(7+rc.left,rc.top+13),RGB(251,200,99));
  191. pDC->SetPixel(CPoint(8+rc.left,rc.top+13),RGB(251,200,99));
  192. pDC->SetPixel(CPoint(9+rc.left,rc.top+13),RGB(251,200,99));
  193. pDC->SetPixel(CPoint(7+rc.left,rc.top+14),RGB(251,200,99));
  194. }
  195. }
  196. //空的背景色
  197. hHandle = SelectObject(hDC, GetStockObject(NULL_BRUSH));
  198. // 画框内选中标志(中间小圆点)
  199. if (g_wndstatelist.ElementAt (pos) & CXPS_CHECKED)
  200. {
  201. hPen= SelectObject(hDC, CreatePen(PS_SOLID, 1, RGB(29,147,29)));
  202. hHandle = SelectObject(hDC, CreateSolidBrush(RGB(29,147,29)));
  203. Ellipse(hDC, Rect.left+5, Rect.top+5,Rect.left+10,Rect.top+10);
  204. DeleteObject(SelectObject(hDC,hPen));
  205. DeleteObject(SelectObject(hDC,hHandle));
  206. }
  207. //画圆
  208. hPen = SelectObject(hDC, CreatePen(PS_SOLID, 1, (g_wndstatelist.ElementAt (pos) & CXPS_DISABLED) ? (GetSysColor(COLOR_BTNFACE) - 0x00202020) : 0x00845118));
  209. Ellipse(hDC, Rect.left+2, Rect.top+2,Rect.left+13,Rect.top+13);
  210. DeleteObject(SelectObject(hDC,hPen));
  211. //恢复背景色
  212. SelectObject(hDC, hHandle);
  213. // 画文字
  214. if (GetWindowText(hWnd, szTemp, sizeof(szTemp)))
  215. {
  216. // SetBkColor(hDC, g_crDialogbkColor);
  217. SetTextColor(hDC, GetSysColor((g_wndstatelist.ElementAt (pos) & CXPS_DISABLED) ? COLOR_GRAYTEXT: COLOR_BTNTEXT));
  218. hHandle = (HANDLE) SelectObject(hDC,
  219. (HGDIOBJ) SendMessage(hWnd, WM_GETFONT, 0, 0));
  220. DrawText(hDC, szTemp, -1, &rcText, DT_SINGLELINE | DT_VCENTER);
  221. SelectObject(hDC, (HGDIOBJ) hHandle);
  222. }
  223. //释放句柄
  224. Mdcxp.bTransfer = TRUE;
  225. ReleaseMemDCXP(&Mdcxp);
  226. }