• 简单的自绘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

  • 相关阅读:
    websocket协议
    vue组件之间的传值
    vue中非父子组件的传值bus的使用
    $.proxy的使用
    弹性盒模型display:flex
    箭头函数与普通函数的区别
    粘贴到Excel的图片总是有些轻微变形
    centos rhel 中文输入法的安装
    vi ,默认为 .asm .inc 采用nasm的语法高亮
    how-to-convert-ppk-key-to-openssh-key-under-linux
  • 原文地址:https://www.cnblogs.com/findumars/p/6002456.html
Copyright © 2020-2023  润新知