// RadioExt.cpp: implementation of the CRadioExt class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "RadioExt.h" #include "library.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif WNDPROC CRadioExt::m_cWndProc = NULL; int CRadioExt::pos = 0; ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// LRESULT CRadioExt::DefWindowProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { CPoint point; LRESULT lReturn; TRACKMOUSEEVENT Tme; pos=FindPos((DWORD)hWnd, g_wndstatelist); pos++; switch( message ) { case WM_ERASEBKGND: return 1; case WM_NCPAINT: case WM_PAINT: CallWindowProc( m_cWndProc, hWnd, message, wParam, lParam ); OnPaint( hWnd ); return 1; case BM_SETSTYLE: // 按钮风格改变 CXPM_SETSTATE(g_wndstatelist.ElementAt (pos), CXPS_DEFAULT, wParam & BS_DEFPUSHBUTTON); OnPaint( hWnd ); break; case BM_SETSTATE: // 设置按钮状态 lReturn = (LONG) CallWindowProc( m_cWndProc, hWnd, message, wParam, lParam ); CXPM_SETSTATE(g_wndstatelist.ElementAt (pos), CXPS_PRESSED, wParam); OnPaint( hWnd ); return lReturn; case BM_SETCHECK: // 设置选中状态 lReturn = (LONG) CallWindowProc( m_cWndProc, hWnd, message, wParam, lParam ); CXPM_SETSTATE(g_wndstatelist.ElementAt (pos), CXPS_CHECKED, (wParam == BST_CHECKED)); CXPM_SETSTATE(g_wndstatelist.ElementAt (pos), CXPS_INDETERMINATE, (wParam == BST_INDETERMINATE)); OnPaint( hWnd ); return lReturn; case WM_SETTEXT: // 设置窗口文本 lReturn = (LONG) CallWindowProc( m_cWndProc, hWnd, message, wParam, lParam ); OnPaint( hWnd ); return lReturn; case WM_MOUSELEAVE: // 鼠标移出 if (g_wndstatelist.ElementAt (pos) & CXPS_HOTLIGHT) { g_wndstatelist.ElementAt (pos) &= ~CXPS_HOTLIGHT; } if (g_wndstatelist.ElementAt (pos) & CXPS_PRESSED) { g_wndstatelist.ElementAt (pos) &= ~CXPS_PRESSED; } OnPaint( hWnd ); return 0; case WM_MOUSEMOVE: // 窗口移动 if (((g_wndstatelist.ElementAt (pos) & CXPS_HOTLIGHT) == 0) && ((wParam & MK_LBUTTON) == 0)) { g_wndstatelist.ElementAt (pos) |= CXPS_HOTLIGHT; OnPaint( hWnd ); // 追踪鼠标移出消息一次 Tme.cbSize = sizeof(TRACKMOUSEEVENT); Tme.dwFlags = TME_LEAVE; Tme.hwndTrack = hWnd; _TrackMouseEvent(&Tme); } break; case WM_ENABLE: // 窗口被设置为禁用或可用 CXPM_SETSTATE(g_wndstatelist.ElementAt (pos), CXPS_DISABLED, !wParam); OnPaint( hWnd ); break; case WM_DESTROY: { g_wndstatelist.RemoveAt(pos); g_wndstatelist.RemoveAt(pos-1); break; } default: break; } return CallWindowProc( m_cWndProc, hWnd, message, wParam, lParam ); } void CRadioExt::OnPaint( HWND hWnd ) { RECT Rect,rc, rcText; MEMDCXP Mdcxp; HANDLE hHandle, hPen; char szTemp[256]; DWORD dwStyle; HDC hDC; // 获取内存兼容设备场景 Mdcxp.hWnd = hWnd; Mdcxp.bTransfer = FALSE; Mdcxp.hBitmap = NULL; g_bDrawBk=1; GetMemDCXP(&Mdcxp); hDC = Mdcxp.hMemDC; // 获取窗口大小 GetWindowRect(hWnd, &Rect); Rect.right -= Rect.left; Rect.bottom -= Rect.top; Rect.left = Rect.top = 0; // 填充背景 // hHandle = CreateSolidBrush(g_crDialogbkColor); // FillRect(hDC,&Rect, (HBRUSH)hHandle); // DeleteObject(hHandle); //按显示模式调整位置 dwStyle = GetWindowLong(hWnd, GWL_STYLE); if (Rect.bottom > 13) { Rect.top = (Rect.bottom - 13)/2; Rect.bottom = Rect.top + 13; } if (dwStyle & BS_LEFTTEXT) { rcText = Rect; rcText.right -= 17; Rect.left = Rect.right - 13; } else { rcText = Rect; rcText.left += 17; Rect.left = 0; Rect.right = 13; } rc=Rect; // 画热点框渐变背景(橘黄色) if (!(g_wndstatelist.ElementAt (pos) & CXPS_DISABLED)) { if (g_wndstatelist.ElementAt (pos) & CXPS_PRESSED||g_wndstatelist.ElementAt (pos) & CXPS_HOTLIGHT) { CDC* pDC=CDC::FromHandle (hDC); rc.top -=2; pDC->SetPixel(CPoint(7+rc.left ,rc.top+4),RGB(244,212,140)); pDC->SetPixel(CPoint(4+rc.left,rc.top+5),RGB(181,196,207)); pDC->SetPixel(CPoint(5+rc.left,rc.top+5),RGB(181,196,207)); pDC->SetPixel(CPoint(6+rc.left,rc.top+5),RGB(253,214,132)); pDC->SetPixel(CPoint(7+rc.left,rc.top+5),RGB(253,214,132)); pDC->SetPixel(CPoint(8+rc.left,rc.top+5),RGB(253,214,132)); pDC->SetPixel(CPoint(9+rc.left,rc.top+5),RGB(253,214,132)); pDC->SetPixel(CPoint(4+rc.left,rc.top+6),RGB(252,220,152)); pDC->SetPixel(CPoint(5+rc.left,rc.top+6),RGB(252,220,152)); pDC->SetPixel(CPoint(6+rc.left,rc.top+6),RGB(247,227,179)); pDC->SetPixel(CPoint(7+rc.left,rc.top+6),RGB(242,237,215)); pDC->SetPixel(CPoint(8+rc.left,rc.top+6),RGB(247,227,179)); pDC->SetPixel(CPoint(9+rc.left,rc.top+6),RGB(251,200,99)); pDC->SetPixel(CPoint(10+rc.left,rc.top+6),RGB(251,200,99)); pDC->SetPixel(CPoint(3+rc.left,rc.top+7),RGB(254,223,156)); pDC->SetPixel(CPoint(4+rc.left,rc.top+7),RGB(254,220,152)); pDC->SetPixel(CPoint(5+rc.left,rc.top+7),RGB(233,236,210)); pDC->SetPixel(CPoint(9+rc.left,rc.top+7),RGB(233,236,210)); pDC->SetPixel(CPoint(10+rc.left,rc.top+7),RGB(251,200,99)); pDC->SetPixel(CPoint(11+rc.left,rc.top+7),RGB(251,200,99)); pDC->SetPixel(CPoint(3+rc.left,rc.top+8),RGB(253,217,140)); pDC->SetPixel(CPoint(4+rc.left,rc.top+8),RGB(247,227,179)); pDC->SetPixel(CPoint(10+rc.left,rc.top+8),RGB(247,227,179)); pDC->SetPixel(CPoint(11+rc.left,rc.top+8),RGB(251,200,99)); pDC->SetPixel(CPoint(2+rc.left,rc.top+9),RGB(254,223,156)); pDC->SetPixel(CPoint(3+rc.left,rc.top+9),RGB(254,220,152)); pDC->SetPixel(CPoint(4+rc.left,rc.top+9),RGB(233,236,210)); pDC->SetPixel(CPoint(10+rc.left,rc.top+9),RGB(233,236,210)); pDC->SetPixel(CPoint(11+rc.left,rc.top+9),RGB(251,200,99)); pDC->SetPixel(CPoint(12+rc.left,rc.top+9),RGB(251,200,99)); pDC->SetPixel(CPoint(3+rc.left,rc.top+10),RGB(252,211,124)); pDC->SetPixel(CPoint(4+rc.left,rc.top+10),RGB(246,224,172)); pDC->SetPixel(CPoint(10+rc.left,rc.top+10),RGB(251,200,99)); pDC->SetPixel(CPoint(11+rc.left,rc.top+10),RGB(251,200,99)); pDC->SetPixel(CPoint(3+rc.left,rc.top+11),RGB(254,223,156)); pDC->SetPixel(CPoint(4+rc.left,rc.top+11),RGB(254,220,152)); pDC->SetPixel(CPoint(5+rc.left,rc.top+11),RGB(233,236,210)); pDC->SetPixel(CPoint(9+rc.left,rc.top+11),RGB(233,236,210)); pDC->SetPixel(CPoint(10+rc.left,rc.top+11),RGB(251,200,99)); pDC->SetPixel(CPoint(11+rc.left,rc.top+11),RGB(251,200,99)); pDC->SetPixel(CPoint(4+rc.left,rc.top+12),RGB(253,217,140)); pDC->SetPixel(CPoint(5+rc.left,rc.top+12),RGB(253,217,140)); pDC->SetPixel(CPoint(6+rc.left,rc.top+12),RGB(247,227,179)); pDC->SetPixel(CPoint(8+rc.left,rc.top+12),RGB(247,227,179)); pDC->SetPixel(CPoint(9+rc.left,rc.top+12),RGB(251,200,99)); pDC->SetPixel(CPoint(10+rc.left,rc.top+12),RGB(251,200,99)); pDC->SetPixel(CPoint(5+rc.left,rc.top+13),RGB(251,200,99)); pDC->SetPixel(CPoint(6+rc.left,rc.top+13),RGB(251,200,99)); pDC->SetPixel(CPoint(7+rc.left,rc.top+13),RGB(251,200,99)); pDC->SetPixel(CPoint(8+rc.left,rc.top+13),RGB(251,200,99)); pDC->SetPixel(CPoint(9+rc.left,rc.top+13),RGB(251,200,99)); pDC->SetPixel(CPoint(7+rc.left,rc.top+14),RGB(251,200,99)); } } //空的背景色 hHandle = SelectObject(hDC, GetStockObject(NULL_BRUSH)); // 画框内选中标志(中间小圆点) if (g_wndstatelist.ElementAt (pos) & CXPS_CHECKED) { hPen= SelectObject(hDC, CreatePen(PS_SOLID, 1, RGB(29,147,29))); hHandle = SelectObject(hDC, CreateSolidBrush(RGB(29,147,29))); Ellipse(hDC, Rect.left+5, Rect.top+5,Rect.left+10,Rect.top+10); DeleteObject(SelectObject(hDC,hPen)); DeleteObject(SelectObject(hDC,hHandle)); } //画圆 hPen = SelectObject(hDC, CreatePen(PS_SOLID, 1, (g_wndstatelist.ElementAt (pos) & CXPS_DISABLED) ? (GetSysColor(COLOR_BTNFACE) - 0x00202020) : 0x00845118)); Ellipse(hDC, Rect.left+2, Rect.top+2,Rect.left+13,Rect.top+13); DeleteObject(SelectObject(hDC,hPen)); //恢复背景色 SelectObject(hDC, hHandle); // 画文字 if (GetWindowText(hWnd, szTemp, sizeof(szTemp))) { // SetBkColor(hDC, g_crDialogbkColor); SetTextColor(hDC, GetSysColor((g_wndstatelist.ElementAt (pos) & CXPS_DISABLED) ? COLOR_GRAYTEXT: COLOR_BTNTEXT)); hHandle = (HANDLE) SelectObject(hDC, (HGDIOBJ) SendMessage(hWnd, WM_GETFONT, 0, 0)); DrawText(hDC, szTemp, -1, &rcText, DT_SINGLELINE | DT_VCENTER); SelectObject(hDC, (HGDIOBJ) hHandle); } //释放句柄 Mdcxp.bTransfer = TRUE; ReleaseMemDCXP(&Mdcxp); }