ComboBoxExt.cpp 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // ComboBoxExt.cpp: implementation of the CComboBoxExt class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "ComboBoxExt.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 CComboBoxExt::m_cWndProc = NULL;
  13. DWORD CComboBoxExt::m_state;
  14. //////////////////////////////////////////////////////////////////////
  15. // Construction/Destruction
  16. //////////////////////////////////////////////////////////////////////
  17. LRESULT CComboBoxExt::DefWindowProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
  18. {
  19. CWnd *pWnd = NULL;
  20. CPoint point;
  21. LRESULT lReturn;
  22. pWnd = CWnd::FromHandle( hWnd );
  23. switch( message )
  24. {
  25. case WM_PAINT:
  26. case WM_NCPAINT:
  27. lReturn=CallWindowProc( m_cWndProc, hWnd, message, wParam, lParam );
  28. OnPaint( pWnd );
  29. return lReturn;
  30. case WM_LBUTTONDOWN:
  31. m_state |= CXPS_PRESSED;
  32. lReturn=CallWindowProc( m_cWndProc, hWnd, message, wParam, lParam );
  33. OnPaint( pWnd );
  34. return lReturn;
  35. case WM_LBUTTONUP:
  36. m_state &= ~CXPS_PRESSED;
  37. lReturn=CallWindowProc( m_cWndProc, hWnd, message, wParam, lParam );
  38. OnPaint( pWnd );
  39. return lReturn;
  40. default:
  41. break;
  42. }
  43. return CallWindowProc( m_cWndProc, hWnd, message, wParam, lParam );
  44. }
  45. void CComboBoxExt::OnPaint( CWnd *pWnd )
  46. {
  47. CDC* pDC = pWnd->GetDC();
  48. CRect m_rcDropDown;
  49. RECT Rect;
  50. MEMDCXP Mdcxp;
  51. HANDLE hHandle;
  52. // 获取窗口大小
  53. GetWindowRect(pWnd->GetSafeHwnd (), &Rect);
  54. Rect.right -= Rect.left;
  55. Rect.bottom -= Rect.top;
  56. Rect.top = Rect.left = 0;
  57. //在WIN98下会把箭头绘到下拉窗口中
  58. if (Rect.bottom>2*GetSystemMetrics(SM_CYVTHUMB))
  59. return;
  60. // 获取内存兼容设备场景
  61. Mdcxp.hWnd = pWnd->GetSafeHwnd ();
  62. Mdcxp.bTransfer = TRUE;
  63. Mdcxp.hBitmap = NULL;
  64. GetMemDCXP(&Mdcxp);
  65. // DrawScrollBars(pWnd->GetSafeHwnd (), Mdcxp.hMemDC, Rect);//滚动条
  66. // 绘制外框
  67. FrameRect(Mdcxp.hMemDC, &Rect, (HBRUSH) g_frameedgebrush);
  68. // 绘制内框
  69. InflateRect(&Rect, -1, -1);
  70. hHandle = (HANDLE) ::GetStockObject (WHITE_BRUSH);
  71. FrameRect(Mdcxp.hMemDC, &Rect, (HBRUSH) hHandle);
  72. InflateRect(&Rect, -1, -1);
  73. Rect.left = Rect.right - GetSystemMetrics(SM_CYVTHUMB);
  74. FrameRect(Mdcxp.hMemDC, &Rect, (HBRUSH) hHandle);
  75. Rect.left++;
  76. ScrollDrowThumbXP(Mdcxp.hMemDC, Rect, m_state | CXPH_DOWNWARDS | CXPH_LARGEARROW);
  77. // 还原并释放内存设备场景
  78. Mdcxp.bTransfer = TRUE;
  79. ReleaseMemDCXP(&Mdcxp);
  80. }