简单的自绘CListBox,重载虚MeasureItem和DrawItem这两个虚函数

[cpp] view plain copy

  1. //例如CNewListBox继承自CListBox,重载虚MeasureItem和DrawItem这两个虚函数,代码如下:
  2. void CNewListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  3. {
  4. // TODO: Add your code to draw the specified item
  5. ASSERT(lpDrawItemStruct->CtlType == ODT_LISTBOX);
  6. LPCTSTR lpszText = (LPCTSTR) lpDrawItemStruct->itemData;
  7. ASSERT(lpszText != NULL);
  8. CDC dc;
  9. dc.Attach(lpDrawItemStruct->hDC);
  10. // Save these value to restore them when done drawing.
  11. COLORREF crOldTextColor = dc.GetTextColor();
  12. COLORREF crOldBkColor = dc.GetBkColor();
  13. // If this item is selected, set the background color
  14. // and the text color to appropriate values. Also, erase
  15. // rect by filling it with the background color.
  16. if ((lpDrawItemStruct->itemAction | ODA_SELECT) &&
  17. (lpDrawItemStruct->itemState & ODS_SELECTED))
  18. {
  19. dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
  20. dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
  21. dc.FillSolidRect(&lpDrawItemStruct->rcItem,
  22. ::GetSysColor(COLOR_HIGHLIGHT));
  23. }
  24. else
  25. {
  26. if(lpDrawItemStruct->itemID%2)
  27. dc.FillSolidRect(&lpDrawItemStruct->rcItem, RGB(128,128,128));
  28. else
  29. dc.FillSolidRect(&lpDrawItemStruct->rcItem, RGB(255,128,255));
  30. }
  31. // If this item has the focus, draw a red frame around the
  32. // item's rect.
  33. if ((lpDrawItemStruct->itemAction | ODA_FOCUS) &&
  34. (lpDrawItemStruct->itemState & ODS_FOCUS))
  35. {
  36. CBrush br(RGB(0, 0, 128));
  37. dc.FrameRect(&lpDrawItemStruct->rcItem, &br);
  38. }
  39. lpDrawItemStruct->rcItem.left += 5;
  40. // Draw the text.
  41. dc.DrawText(
  42. lpszText,
  43. strlen(lpszText),
  44. &lpDrawItemStruct->rcItem,
  45. DT_LEFT|DT_SINGLELINE|DT_VCENTER);
  46. // Reset the background color and the text color back to their
  47. // original values.
  48. dc.SetTextColor(crOldTextColor);
  49. dc.SetBkColor(crOldBkColor);
  50. dc.Detach();
  51. }
  52. void CNewListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
  53. {
  54. // TODO: Add your code to determine the size of specified item
  55. ASSERT(lpMeasureItemStruct->CtlType == ODT_LISTBOX);
  56. LPCTSTR lpszText = (LPCTSTR) lpMeasureItemStruct->itemData;
  57. ASSERT(lpszText != NULL);
  58. CSize   sz;
  59. CDC*    pDC = GetDC();
  60. sz = pDC->GetTextExtent(lpszText);
  61. ReleaseDC(pDC);
  62. lpMeasureItemStruct->itemHeight = 2*sz.cy;
  63. }
  64. // 其中m_listBox为CNewListBox类型的对象
  65. #define IDC_LISTBOX 0x1101
  66. m_listBox.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|WS_VSCROLL|WS_HSCROLL|
  67. LBS_OWNERDRAWVARIABLE, CRect(0, 0, 380, 280), this, IDC_LISTBOX);

效果图如下所示:
简单的自绘CListBox,重载虚MeasureItem和DrawItem这两个虚函数

http://blog.csdn.net/visualeleven/article/details/5935430

上一篇:lsmod


下一篇:【*谈】城域网IPv6过渡技术——MAP技术(4)