ComboBoxXP.cpp
上传用户:ckg1000
上传日期:2013-01-26
资源大小:630k
文件大小:7k
源码类别:

CAD

开发平台:

Visual C++

  1. ///////////////////////////////////////////////////////////////////////////////
  2. //
  3. // ComboBoxXP.cpp : implementation file
  4. //
  5. ///////////////////////////////////////////////////////////////////////////////
  6. #include "stdafx.h"
  7. #include "ComboBoxXP.h"
  8. #include "Draw.h"
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. ////////////////////////////////////////////////////////////////////////////////
  15. CComboBoxXP::CComboBoxXP () :
  16.     m_nVisibleLines (7), m_nDefaultHeight (-1), m_nEditHeight (-1)
  17. {
  18. }
  19. ///////////////////////////////////////////////////////////////////////////////
  20. BOOL CComboBoxXP::Create (DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
  21. {
  22.     if ( !CComboBox::Create (dwStyle, rect, pParentWnd, nID) )
  23.     {
  24.         return false;
  25.     }
  26.     SetFont (CFont::FromHandle ((HFONT)::GetStockObject (DEFAULT_GUI_FONT)));
  27.     m_MouseMgr.Init (m_hWnd);
  28.     HWND hEdit = ::GetWindow (m_hWnd, GW_CHILD);
  29.     if ( hEdit != NULL )
  30.     {
  31.         m_Edit.SubclassWindow (hEdit);
  32.     }
  33.     return true;
  34. }
  35. ////////////////////////////////////////////////////////////////////////////////
  36. void CComboBoxXP::PreSubclassWindow ()
  37. {
  38.     m_MouseMgr.Init (m_hWnd);
  39.     HWND hEdit = ::GetWindow (GetSafeHwnd(), GW_CHILD);
  40.     if ( hEdit != NULL )
  41.     {
  42.         m_Edit.SubclassWindow (hEdit);
  43.     }
  44.     CWindowRect rc (this);
  45.     SetWindowPos (NULL, 0, 0, rc.Width(), 100, SWP_NOMOVE|SWP_NOZORDER);
  46. }
  47. ///////////////////////////////////////////////////////////////////////////////
  48. BEGIN_MESSAGE_MAP(CComboBoxXP, CComboBox)
  49.     //{{AFX_MSG_MAP(CComboBoxXP)
  50.     ON_WM_GETDLGCODE()
  51.     ON_WM_WINDOWPOSCHANGING()
  52.     ON_WM_WINDOWPOSCHANGED()
  53.     ON_WM_PAINT()
  54.     ON_WM_SETFOCUS()
  55.     ON_WM_KILLFOCUS()
  56.     ON_WM_MOUSEMOVE()
  57.     ON_WM_MOUSEOUT()
  58.     //}}AFX_MSG_MAP
  59. END_MESSAGE_MAP()
  60. /////////////////////////////////////////////////////////////////////////////////////////
  61. BOOL CComboBoxXP::PreTranslateMessage (MSG* pMsg)
  62. {
  63.     if ( ChildOfDockedToolbar (this) && pMsg->message == WM_KEYDOWN )
  64.     {
  65.         switch ( pMsg->wParam )
  66.         {
  67.         case VK_RETURN:
  68.             GetParent()->SendMessage (WM_COMMAND, GetDlgCtrlID());
  69.             break;
  70.         case VK_ESCAPE:
  71.             if ( GetDroppedState() )
  72.             {
  73.                 ShowDropDown (false);
  74.             }
  75.             else
  76.             {
  77.                 GetParentFrame()->GetActiveFrame()->SetFocus();
  78.             }
  79.             break;
  80.         }
  81.     }
  82.     return CComboBox::PreTranslateMessage (pMsg);
  83. }
  84. ///////////////////////////////////////////////////////////////////////////////
  85. void CComboBoxXP::OnWindowPosChanging (WINDOWPOS* pWndPos)
  86. {
  87.     if ( !(pWndPos->flags & SWP_NOSIZE) && m_nEditHeight == -1 )
  88.     {
  89.         if ( m_nDefaultHeight == -1 )
  90.         {
  91.             m_nDefaultHeight = GetItemHeight (-1);
  92.         }
  93.         m_nEditHeight = pWndPos->cy;
  94.         pWndPos->cy = m_nDefaultHeight + GetItemHeight(0)*m_nVisibleLines + GetSystemMetrics(SM_CYBORDER)*7;
  95.     }
  96.     CComboBox::OnWindowPosChanging (pWndPos);
  97. }
  98. ///////////////////////////////////////////////////////////////////////////////
  99. UINT CComboBoxXP::OnGetDlgCode ()
  100. {
  101.     if ( KEYDOWN (VK_RETURN) )
  102.     {
  103.         return DLGC_WANTALLKEYS|CComboBox::OnGetDlgCode();
  104.     }
  105.     return CComboBox::OnGetDlgCode();
  106. }
  107. ///////////////////////////////////////////////////////////////////////////////
  108. void CComboBoxXP::OnWindowPosChanged (WINDOWPOS* pWndPos)
  109. {
  110.     CComboBox::OnWindowPosChanged (pWndPos);
  111.     if ( !(pWndPos->flags & SWP_NOSIZE) && m_nEditHeight != -1 )
  112.     {
  113.         SetItemHeight (-1, m_nEditHeight-6);
  114.         m_nEditHeight = -1;
  115.     }
  116.     HWND hEdit = ::GetWindow (m_hWnd, GW_CHILD);
  117.     // Del the selection
  118.     if ( hEdit != NULL && hEdit != ::GetFocus() )
  119.     {
  120.         ::SendMessage (hEdit, EM_SETSEL, (WPARAM)-1, 0);
  121.     }
  122. }
  123. ///////////////////////////////////////////////////////////////////////////////
  124. void CComboBoxXP::OnPaint ()
  125. {
  126.     CClientRect rc (this);
  127.     CRect rcBtn (rc.right-::GetSystemMetrics (SM_CXHTHUMB), rc.top, rc.right, rc.bottom);
  128.     ValidateRect (rcBtn);
  129.     Default();
  130.     CClientDC cDC (this);
  131.     DWORD wStyle = DB_FLAT|DB_DOWN|(IsWindowEnabled() ? DB_ENABLED : DB_DISABLED);
  132.     bool bInToolbar = ::ChildOfDockedToolbar (this);
  133.     bool bDropped = DefWindowProc (CB_GETDROPPEDSTATE, 0, 0L) != 0;
  134.     bool bFocus = (::GetFocus() == m_hWnd || ::GetParent (::GetFocus()) == m_hWnd) && bInToolbar;
  135.     if ( !bInToolbar )
  136.     {
  137.         wStyle |= DB_BORDER;
  138.     }
  139.     if ( bFocus || m_MouseMgr.MouseOver() )
  140.     {
  141.         wStyle |= DB_OVER;
  142.     }
  143.     if ( bDropped )
  144.     {
  145.         wStyle |= DB_OVER|DB_PRESSED;
  146.     }
  147.     CDrawButton (wStyle, rcBtn).Draw (&cDC);
  148.     CPenDC pen (cDC, ::GetSysColor (( bFocus || bDropped || m_MouseMgr.MouseOver() )
  149.                                     ? COLOR_HIGHLIGHT
  150.                                     : (bInToolbar ? COLOR_WINDOW : COLOR_3DSHADOW)));
  151.     cDC.SelectObject (::GetStockObject (NULL_BRUSH));
  152.     cDC.Rectangle (rc);
  153.     pen.Color (::GetSysColor (IsWindowEnabled() ? COLOR_WINDOW : COLOR_3DFACE));
  154.     rc.InflateRect (-1, -1);
  155.     rc.right -= ::GetSystemMetrics (SM_CXHTHUMB);
  156.     cDC.Rectangle (rc);
  157.     cDC.MoveTo (rc.right, rc.top);
  158.     cDC.LineTo (rc.right, rc.bottom);
  159. }
  160. ///////////////////////////////////////////////////////////////////////////////
  161. void CComboBoxXP::OnSetFocus (CWnd* pOldWnd)
  162. {
  163.     CComboBox::OnSetFocus (pOldWnd);
  164.     if ( ::ChildOfDockedToolbar (this) )
  165.     {
  166.         Invalidate();
  167.     }
  168. }
  169. ///////////////////////////////////////////////////////////////////////////////
  170. void CComboBoxXP::OnKillFocus (CWnd* pNewWnd)
  171. {
  172.     CComboBox::OnKillFocus (pNewWnd);
  173.     if ( ::ChildOfDockedToolbar (this) )
  174.     {
  175.         Invalidate();
  176.     }
  177. }
  178. ///////////////////////////////////////////////////////////////////////////////
  179. void CComboBoxXP::OnMouseMove (UINT, CPoint)
  180. {
  181.     Default();
  182.     m_MouseMgr.OnMouseMove();
  183. }
  184. ///////////////////////////////////////////////////////////////////////////////
  185. void CComboBoxXP::OnMouseOut ()
  186. {
  187.     m_MouseMgr.OnMouseOut();
  188. }
  189. ///////////////////////////////////////////////////////////////////////////////
  190. BEGIN_MESSAGE_MAP(CComboEditXP, CEdit)
  191.     //{{AFX_MSG_MAP(CComboEditXP)
  192.     ON_WM_KILLFOCUS()
  193.     ON_WM_MOUSEMOVE()
  194.     ON_WM_MOUSEOUT()
  195.     //}}AFX_MSG_MAP
  196. END_MESSAGE_MAP()
  197. ///////////////////////////////////////////////////////////////////////////////
  198. void CComboEditXP::OnKillFocus (CWnd* pNewWnd)
  199. {
  200.     CEdit::OnKillFocus (pNewWnd);
  201.     if ( ::ChildOfDockedToolbar (&GetComboBox()) )
  202.     {
  203.         GetComboBox().Invalidate();
  204.     }
  205. }
  206. ///////////////////////////////////////////////////////////////////////////////
  207. void CComboEditXP::OnMouseMove (UINT, CPoint)
  208. {
  209.     Default();
  210.     GetComboBox().m_MouseMgr.OnMouseMove (m_hWnd);
  211. }
  212. ///////////////////////////////////////////////////////////////////////////////
  213. void CComboEditXP::OnMouseOut ()
  214. {
  215.     GetComboBox().m_MouseMgr.OnMouseOut (m_hWnd);
  216. }