// ComboBoxExt.cpp: implementation of the CComboBoxExt class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "ComboBoxExt.h" #include "library.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif WNDPROC CComboBoxExt::m_cWndProc = NULL; DWORD CComboBoxExt::m_state; ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// LRESULT CComboBoxExt::DefWindowProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { CWnd *pWnd = NULL; CPoint point; LRESULT lReturn; pWnd = CWnd::FromHandle( hWnd ); switch( message ) { case WM_PAINT: case WM_NCPAINT: lReturn=CallWindowProc( m_cWndProc, hWnd, message, wParam, lParam ); OnPaint( pWnd ); return lReturn; case WM_LBUTTONDOWN: m_state |= CXPS_PRESSED; lReturn=CallWindowProc( m_cWndProc, hWnd, message, wParam, lParam ); OnPaint( pWnd ); return lReturn; case WM_LBUTTONUP: m_state &= ~CXPS_PRESSED; lReturn=CallWindowProc( m_cWndProc, hWnd, message, wParam, lParam ); OnPaint( pWnd ); return lReturn; default: break; } return CallWindowProc( m_cWndProc, hWnd, message, wParam, lParam ); } void CComboBoxExt::OnPaint( CWnd *pWnd ) { CDC* pDC = pWnd->GetDC(); CRect m_rcDropDown; RECT Rect; MEMDCXP Mdcxp; HANDLE hHandle; // 获取窗口大小 GetWindowRect(pWnd->GetSafeHwnd (), &Rect); Rect.right -= Rect.left; Rect.bottom -= Rect.top; Rect.top = Rect.left = 0; //在WIN98下会把箭头绘到下拉窗口中 if (Rect.bottom>2*GetSystemMetrics(SM_CYVTHUMB)) return; // 获取内存兼容设备场景 Mdcxp.hWnd = pWnd->GetSafeHwnd (); Mdcxp.bTransfer = TRUE; Mdcxp.hBitmap = NULL; GetMemDCXP(&Mdcxp); // DrawScrollBars(pWnd->GetSafeHwnd (), Mdcxp.hMemDC, Rect);//滚动条 // 绘制外框 FrameRect(Mdcxp.hMemDC, &Rect, (HBRUSH) g_frameedgebrush); // 绘制内框 InflateRect(&Rect, -1, -1); hHandle = (HANDLE) ::GetStockObject (WHITE_BRUSH); FrameRect(Mdcxp.hMemDC, &Rect, (HBRUSH) hHandle); InflateRect(&Rect, -1, -1); Rect.left = Rect.right - GetSystemMetrics(SM_CYVTHUMB); FrameRect(Mdcxp.hMemDC, &Rect, (HBRUSH) hHandle); Rect.left++; ScrollDrowThumbXP(Mdcxp.hMemDC, Rect, m_state | CXPH_DOWNWARDS | CXPH_LARGEARROW); // 还原并释放内存设备场景 Mdcxp.bTransfer = TRUE; ReleaseMemDCXP(&Mdcxp); }