TabCheckListBox.cpp
上传用户:dlhongjiu
上传日期:2007-01-01
资源大小:50k
文件大小:4k
源码类别:

按钮控件

开发平台:

Visual C++

  1. // TabCheckListBox.cpp : implementation file
  2. // 5/22/98 Modified
  3. // by Qing Zhang (qzhang7@tfn.net)
  4. // If you like this code, just don't remove my name from the source.
  5. #include "stdafx.h"
  6. #include "TabCheckListBox.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CTabCheckListBox
  14. CTabCheckListBox::CTabCheckListBox()
  15. {
  16. m_lpnEachStop = NULL;
  17. }
  18. CTabCheckListBox::~CTabCheckListBox()
  19. {
  20. delete []m_lpnEachStop;
  21. }
  22. BEGIN_MESSAGE_MAP(CTabCheckListBox, CCheckListBox)
  23. //{{AFX_MSG_MAP(CTabCheckListBox)
  24. // NOTE - the ClassWizard will add and remove mapping macros here.
  25. //}}AFX_MSG_MAP
  26. END_MESSAGE_MAP()
  27. /////////////////////////////////////////////////////////////////////////////
  28. // CTabCheckListBox message handlers
  29. void CTabCheckListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
  30. {
  31. // TODO: Add your code to draw the specified item
  32. ASSERT((GetStyle() & (LBS_OWNERDRAWFIXED | LBS_HASSTRINGS)) ==
  33. (LBS_OWNERDRAWFIXED | LBS_HASSTRINGS));
  34. CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
  35. if (((LONG)(lpDrawItemStruct->itemID) >= 0) &&
  36. (lpDrawItemStruct->itemAction & (ODA_DRAWENTIRE | ODA_SELECT)))
  37. {
  38. int cyItem = GetItemHeight(lpDrawItemStruct->itemID);
  39. BOOL fDisabled = !IsWindowEnabled() || !IsEnabled(lpDrawItemStruct->itemID);
  40. COLORREF newTextColor = fDisabled ?
  41. RGB(0x80, 0x80, 0x80) : GetSysColor(COLOR_WINDOWTEXT);  // light gray
  42. COLORREF oldTextColor = pDC->SetTextColor(newTextColor);
  43. COLORREF newBkColor = GetSysColor(COLOR_WINDOW);
  44. COLORREF oldBkColor = pDC->SetBkColor(newBkColor);
  45. if (newTextColor == newBkColor)
  46. newTextColor = RGB(0xC0, 0xC0, 0xC0);   // dark gray
  47. if (!fDisabled && ((lpDrawItemStruct->itemState & ODS_SELECTED) != 0))
  48. {
  49. pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT));
  50. pDC->SetBkColor(GetSysColor(COLOR_HIGHLIGHT));
  51. }
  52. if (m_cyText == 0)
  53. VERIFY(cyItem >= CalcMinimumItemHeight());
  54. CString strText;
  55. GetText(lpDrawItemStruct->itemID, strText);
  56. pDC->ExtTextOut(lpDrawItemStruct->rcItem.left,
  57. lpDrawItemStruct->rcItem.top + max(0, (cyItem - m_cyText) / 2),
  58. ETO_OPAQUE, &(lpDrawItemStruct->rcItem), "", 0, NULL);
  59. pDC->TabbedTextOut(lpDrawItemStruct->rcItem.left,
  60. lpDrawItemStruct->rcItem.top + max(0, (cyItem - m_cyText) / 2),
  61. strText, strText.GetLength(), m_nTabStops, m_lpnEachStop, lpDrawItemStruct->rcItem.left);
  62. pDC->SetTextColor(oldTextColor);
  63. pDC->SetBkColor(oldBkColor);
  64. }
  65. if ((lpDrawItemStruct->itemAction & ODA_FOCUS) != 0)
  66. pDC->DrawFocusRect(&(lpDrawItemStruct->rcItem));
  67. }
  68. void CTabCheckListBox::SetTabStops()
  69. {
  70. delete []m_lpnEachStop;
  71. m_lpnEachStop = new int[1];
  72. int nBaseUnit = GetAverageCharWidths();
  73. m_lpnEachStop[0] = nBaseUnit / 2;
  74. m_nTabStops = 1;
  75. }
  76. BOOL CTabCheckListBox::SetTabStops( const int& cxEachStop )
  77. {
  78. if(cxEachStop < 0)
  79. return FALSE;
  80. delete []m_lpnEachStop;
  81. m_lpnEachStop = new int[1];
  82. int nBaseUnit = GetAverageCharWidths();
  83. m_lpnEachStop[0] = (cxEachStop * nBaseUnit) / 4;
  84. m_nTabStops = 1;
  85. return TRUE;
  86. }
  87. BOOL CTabCheckListBox::SetTabStops( int nTabStops, LPINT rgTabStops )
  88. {
  89. delete []m_lpnEachStop;
  90. int nStop = 0;
  91. m_nTabStops = nTabStops;
  92. m_lpnEachStop = new int[nTabStops];
  93. int nBaseUnit = GetAverageCharWidths();
  94. int nPrevStop = 0;
  95. for(int i = 0; i < nTabStops; i++)
  96. {
  97. nStop = (rgTabStops[i] * nBaseUnit) / 4;
  98. if(nStop > nPrevStop)
  99. {
  100. m_lpnEachStop[i] = nStop;
  101. nPrevStop = nStop;
  102. }
  103. else
  104. return FALSE;
  105. }
  106. return TRUE;
  107. }
  108. int CTabCheckListBox::GetAverageCharWidths()
  109. {
  110. CFont* pFont = GetFont();
  111. LOGFONT lf;
  112. pFont->GetLogFont(&lf);
  113. int nBaseUnit = lf.lfWidth;
  114. if(nBaseUnit == 0)
  115. nBaseUnit = LOWORD(GetDialogBaseUnits());
  116. return nBaseUnit;
  117. }