zoukankan      html  css  js  c++  java
  • 简单的自绘CListBox,重载虚MeasureItem和DrawItem这两个虚函数

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

    效果图如下所示:

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

  • 相关阅读:
    输入'过程'求方差算法的简单优化(免去数组的使用)
    PAT 甲级 1002 A+B for Polynomials
    常见算法时间函数的增长趋势分析
    洛谷 P4888 三去矩阵
    PAT 甲级 1001 A+B Format
    网站云服务器迁移时遇到的坑
    Angular JS中自定义标签 属性绑定的解释
    how to do a mass update in Laravel5 ( 在Laravel 5里面怎么做大量数据更新 )
    javascript 到将来某个时间(2020-5-20)的倒计时
    javascript 数字日期格式转换为中文
  • 原文地址:https://www.cnblogs.com/findumars/p/6002456.html
Copyright © 2011-2022 走看看