XTListBox.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:7k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTEListBox.cpp : implementation of the CXTListBox class.
  2. //
  3. // This file is a part of the XTREME CONTROLS MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "Common/XTPColorManager.h"
  22. #include "Common/XTPDrawHelpers.h"
  23. #include "Common/XTPOffice2007Image.h"
  24. #include "XTGlobal.h"
  25. #include "XTListBox.h"
  26. #ifdef _DEBUG
  27. #define new DEBUG_NEW
  28. #undef THIS_FILE
  29. static char THIS_FILE[] = __FILE__;
  30. #endif
  31. /////////////////////////////////////////////////////////////////////////////
  32. // CXTListBox
  33. /////////////////////////////////////////////////////////////////////////////
  34. CXTListBox::CXTListBox()
  35. : m_bPreSubclassInit(true)
  36. {
  37. m_nStyle = xtListBoxStandard;
  38. m_nItemHeight = 0;
  39. m_nTextPadding = 2;
  40. m_nHotItem = -1;
  41. }
  42. CXTListBox::~CXTListBox()
  43. {
  44. }
  45. IMPLEMENT_DYNAMIC(CXTListBox, CListBox)
  46. BEGIN_MESSAGE_MAP(CXTListBox, CListBox)
  47. //{{AFX_MSG_MAP(CXTListBox)
  48. ON_WM_ERASEBKGND()
  49. ON_WM_PAINT()
  50. ON_WM_CREATE()
  51. ON_MESSAGE(WM_PRINTCLIENT, OnPrintClient)
  52. ON_WM_MOUSEMOVE()
  53. ON_MESSAGE_VOID(WM_MOUSELEAVE, OnMouseLeave)
  54. ON_WM_SETFOCUS()
  55. ON_WM_KILLFOCUS()
  56. //}}AFX_MSG_MAP
  57. END_MESSAGE_MAP()
  58. void CXTListBox::Initialize(bool bAutoFont/*= true*/)
  59. {
  60. // set the font for the list box.
  61. if (bAutoFont)
  62. {
  63. SetFont(&XTAuxData().font);
  64. }
  65. }
  66. void CXTListBox::DrawItem(LPDRAWITEMSTRUCT lpDIS)
  67. {
  68. CDC* pDC = CDC::FromHandle(lpDIS->hDC);
  69. CRect rcItem = lpDIS->rcItem;
  70. if ((lpDIS->itemID != (UINT)-1) && (lpDIS->itemAction & (ODA_DRAWENTIRE | ODA_SELECT)))
  71. {
  72. COLORREF clrWindow = GetBackColor();
  73. COLORREF clrWindowText = IsWindowEnabled() ? GetXtremeColor(COLOR_WINDOWTEXT) : GetXtremeColor(COLOR_GRAYTEXT);
  74. BOOL bSelected = ((lpDIS->itemState & ODS_SELECTED) != 0);
  75. CRect rcText(rcItem);
  76. rcText.DeflateRect(m_nTextPadding, 0);
  77. if (bSelected)
  78. {
  79. clrWindow = IsWindowEnabled() ? GetXtremeColor(COLOR_HIGHLIGHT) : GetXtremeColor(COLOR_GRAYTEXT);
  80. clrWindowText = GetXtremeColor(COLOR_HIGHLIGHTTEXT);
  81. }
  82. if (m_nStyle == xtListBoxOfficeXP && bSelected && IsWindowEnabled())
  83. {
  84. clrWindowText = GetXtremeColor(XPCOLOR_HIGHLIGHT_TEXT);
  85. clrWindow = GetXtremeColor(XPCOLOR_HIGHLIGHT);
  86. pDC->Draw3dRect(rcItem, GetXtremeColor(XPCOLOR_HIGHLIGHT_BORDER), GetXtremeColor(XPCOLOR_HIGHLIGHT_BORDER));
  87. rcItem.DeflateRect(1, 1);
  88. }
  89. if (m_nStyle == xtListBoxOffice2007)
  90. {
  91. BOOL bHasFocus = ::GetFocus() == m_hWnd;
  92. BOOL bHighlighted = (int)lpDIS->itemID == m_nHotItem;
  93. if ((bSelected || bHighlighted) && IsWindowEnabled())
  94. {
  95. CXTPOffice2007Image* pImage = XTPOffice2007Images()->LoadFile(_T("LISTBOX"));
  96. if (pImage)
  97. {
  98. pImage->DrawImage(pDC, rcItem, pImage->GetSource(bSelected && bHighlighted ? 2 :
  99. bHasFocus && bSelected ? 1 : !bHasFocus && bSelected ? 3 : 0, 4), CRect(4, 4, 4, 4), COLORREF_NULL);
  100. clrWindow = COLORREF_NULL;
  101. }
  102. }
  103. pDC->SetBkMode(TRANSPARENT);
  104. clrWindowText = XTPOffice2007Images()->GetImageColor(_T("LISTBOX"), _T("NormalText"));
  105. }
  106. // set the text and text background colors, then repaint the item.
  107. pDC->SetBkColor(clrWindow);
  108. pDC->SetTextColor(clrWindowText);
  109. if (clrWindow != COLORREF_NULL) pDC->FillSolidRect(&rcItem, clrWindow);
  110. CString strText;
  111. GetText(lpDIS->itemID, strText);
  112. pDC->DrawText(strText, &rcText, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_EXPANDTABS);
  113. }
  114. if ((lpDIS->itemAction & ODA_FOCUS) && (m_nStyle != xtListBoxOffice2007))
  115. pDC->DrawFocusRect(&lpDIS->rcItem);
  116. }
  117. void CXTListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMIS)
  118. {
  119. lpMIS->itemHeight = m_nItemHeight > 0 ? m_nItemHeight : ::GetSystemMetrics(SM_CYMENU)-2;
  120. }
  121. BOOL CXTListBox::OnEraseBkgnd(CDC* /*pDC*/)
  122. {
  123. return TRUE;
  124. }
  125. COLORREF CXTListBox::GetBackColor()
  126. {
  127. return GetXtremeColor(COLOR_WINDOW);
  128. }
  129. void CXTListBox::OnPaint()
  130. {
  131. CPaintDC dc(this);
  132. // Get the client rect.
  133. CRect r;
  134. GetClientRect(&r);
  135. // Paint to a memory device context to reduce screen flicker.
  136. CXTPBufferDC memDC(dc, r);
  137. memDC.FillSolidRect(r, GetBackColor());
  138. CPoint ptOrg = memDC.GetWindowOrg();
  139. // Let the window do its default painting   ...
  140. CListBox::DefWindowProc(WM_PAINT, (WPARAM)memDC.m_hDC, 0);
  141. memDC.SetWindowOrg(ptOrg);
  142. }
  143. LRESULT CXTListBox::OnPrintClient(WPARAM wParam, LPARAM lParam)
  144. {
  145. CListBox::DefWindowProc(WM_ERASEBKGND, wParam, 0);
  146. return CListBox::DefWindowProc(WM_PRINTCLIENT, wParam, lParam);
  147. }
  148. bool CXTListBox::Init()
  149. {
  150. // make sure the style is set to LBS_OWNERDRAWVARIABLE | LBS_HASSTRINGS.
  151. DWORD dwStyle = ::GetWindowLong(GetSafeHwnd(), GWL_STYLE);
  152. if ((dwStyle & LBS_OWNERDRAWVARIABLE) == 0)
  153. dwStyle |= LBS_OWNERDRAWVARIABLE;
  154. if ((dwStyle & LBS_HASSTRINGS) == 0)
  155. dwStyle |= LBS_HASSTRINGS;
  156. ::SetWindowLong(m_hWnd, GWL_STYLE, dwStyle);
  157. return true;
  158. }
  159. void CXTListBox::PreSubclassWindow()
  160. {
  161. CListBox::PreSubclassWindow();
  162. if (m_bPreSubclassInit)
  163. Init();
  164. }
  165. BOOL CXTListBox::PreCreateWindow(CREATESTRUCT& cs)
  166. {
  167. if (!CListBox::PreCreateWindow(cs))
  168. return FALSE;
  169. m_bPreSubclassInit = false;
  170. return TRUE;
  171. }
  172. int CXTListBox::OnCreate(LPCREATESTRUCT lpCreateStruct)
  173. {
  174. if (CListBox::OnCreate(lpCreateStruct) == -1)
  175. return -1;
  176. Init();
  177. return 0;
  178. }
  179. void CXTListBox::OnMouseLeave()
  180. {
  181. OnMouseMove(0, CPoint(-1, -1));
  182. }
  183. void CXTListBox::OnMouseMove(UINT nFlags, CPoint point)
  184. {
  185. CListBox::OnMouseMove(nFlags, point);
  186. if (m_nStyle != xtListBoxOffice2007)
  187. return;
  188. BOOL bOutside = FALSE;
  189. int nHotItem = ItemFromPoint(point, bOutside);
  190. if (bOutside) nHotItem = -1;
  191. if (nHotItem != m_nHotItem)
  192. {
  193. m_nHotItem = nHotItem;
  194. Invalidate(FALSE);
  195. if (m_nHotItem != -1)
  196. {
  197. TRACKMOUSEEVENT tme = {sizeof(TRACKMOUSEEVENT), TME_LEAVE, m_hWnd, HOVER_DEFAULT};
  198. _TrackMouseEvent(&tme);
  199. }
  200. }
  201. }
  202. void CXTListBox::OnSetFocus(CWnd* pOldWnd)
  203. {
  204. CListBox::OnSetFocus(pOldWnd);
  205. if (m_nStyle == xtListBoxOffice2007)
  206. {
  207. Invalidate(FALSE);
  208. }
  209. }
  210. void CXTListBox::OnKillFocus(CWnd* pNewWnd)
  211. {
  212. CListBox::OnKillFocus(pNewWnd);
  213. if (m_nStyle == xtListBoxOffice2007)
  214. {
  215. Invalidate(FALSE);
  216. }
  217. }