posts - 131, comments - 12, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

MFC中有许多控件,将控件拖到窗口中右键鼠标,点击属性,到样式标签页中会有很多样式可以选择

但是往往这些样式会满足不了我们的需求,这时候,我们需要自己来完成我们想要的样式控件

我们就来拿ListBox为例子,因为我发现ListBox的样式扩展的需求量是最大的

(1)在Dialog中拖入ListBox控件

(2)在类视图添加一个该控件的子类

(3)然后按Ctrl+W在类向导中给你的控件加一个CColorListBox的变量

(4)可以开始为你的CColorListBox添加样式了

  1. int CColorListBox::AddMsg(CString lpszItem, DWORD info)  
  2. {  
  3.     int nItem = AddString(lpszItem);  
  4.     if (nItem >= 0)  
  5.         SetItemData(nItem,info);  
  6.     int numList = GetCount()-1;  
  7.     SetTopIndex(numList);  
  8.     SetCurSel(numList);  
  9.     //水平滚动  
  10.     int max_width=0;  
  11.     CSize sz;  
  12.     CClientDC dc(this);  
  13.     for(int i=0;i<GetCount();i++)  
  14.     {  
  15.         GetText(i,lpszItem);  
  16.         sz=dc.GetTextExtent(lpszItem);  
  17.         if(max_width<sz.cx)  
  18.             max_width=sz.cx;  
  19.     }  
  20.     SendMessage(LB_SETHORIZONTALEXTENT,max_width,0);  
  21.   
  22.     return nItem;  
  23. }  
  1. void CColorListBox::DrawItem(LPDRAWITEMSTRUCT lpDIS)   
  2. {  
  3.     // TODO: Add your code to draw the specified item  
  4.     if ((int)lpDIS->itemID < 0)  
  5.         return;   
  6.   
  7.     CDC *pDC = CDC::FromHandle(lpDIS->hDC);  
  8.   
  9.     COLORREF crText;  
  10.     CString sText;  
  11.     COLORREF crNorm;  
  12.     HICON icon;  
  13.     switch (lpDIS->itemData)  
  14.     {  
  15.         case M_OK:  
  16.             crNorm = #00ff00;  
  17.             icon = AfxGetApp()->LoadIcon(IDI_ICON_OK);  
  18.             break;  
  19.         case M_ERROR:  
  20.             crNorm=#ff0000;  
  21.             icon = AfxGetApp()->LoadIcon(IDI_ICON_ERROR);  
  22.             break;  
  23.         case M_WARING:  
  24.             crNorm=#0000ff;  
  25.             icon = AfxGetApp()->LoadIcon(IDI_ICON_WARING);  
  26.             break;  
  27.         case M_USER:  
  28.             crNorm=#00ff00;  
  29.             icon = AfxGetApp()->LoadIcon(IDI_ICON_USER);  
  30.             break;  
  31.         case M_USER_:  
  32.             crNorm=#000000;  
  33.             icon = AfxGetApp()->LoadIcon(IDI_ICON_USER_);  
  34.             break;  
  35.     }  
  36.   
  37.   
  38.     // 字符串颜色  
  39.     COLORREF crHilite = RGB(255-GetRValue(crNorm), 255-GetGValue(crNorm), 255-GetBValue(crNorm));  
  40.     CRect rectBK(lpDIS->rcItem.left+22,lpDIS->rcItem.top,lpDIS->rcItem.right+18,lpDIS->rcItem.bottom);  
  41.   
  42.   
  43.     // 如果被选中,使用高亮色会矩形  
  44.     if ((lpDIS->itemState & ODS_SELECTED) &&  
  45.          (lpDIS->itemAction & (ODA_SELECT | ODA_DRAWENTIRE)))  
  46.     {  
  47.         CBrush brush(crNorm);  
  48.         pDC->FillRect(rectBK, &brush);  
  49.     }  
  50.   
  51.     // 如果取消选中,恢复  
  52.     if (!(lpDIS->itemState & ODS_SELECTED) &&    (lpDIS->itemAction & ODA_SELECT))  
  53.     {  
  54.         CBrush brush(::GetSysColor(COLOR_WINDOW));  
  55.         pDC->FillRect(rectBK, &brush);  
  56.     }         
  57.   
  58.     // 绘制焦点矩形  
  59.     if ((lpDIS->itemAction & ODA_FOCUS) && (lpDIS->itemState & ODS_FOCUS))  
  60.         pDC->DrawFocusRect(&lpDIS->rcItem);   
  61.   
  62.     // 取消焦点矩形  
  63.     if ((lpDIS->itemAction & ODA_FOCUS) &&   !(lpDIS->itemState & ODS_FOCUS))  
  64.         pDC->DrawFocusRect(&lpDIS->rcItem);   
  65.   
  66.   
  67.     // 透明背景  
  68.     int nBkMode = pDC->SetBkMode(TRANSPARENT);  
  69.   
  70.       
  71.     if (lpDIS->itemData)       
  72.     {  
  73.         if (lpDIS->itemState & ODS_SELECTED)  
  74.             crText = pDC->SetTextColor(crHilite);  
  75.         else if (lpDIS->itemState & ODS_DISABLED)  
  76.             crText = pDC->SetTextColor(::GetSysColor(COLOR_GRAYTEXT));  
  77.         else  
  78.             crText = pDC->SetTextColor(crNorm);  
  79.     }  
  80.       
  81.     else  
  82.     {  
  83.         if (lpDIS->itemState & ODS_SELECTED)  
  84.             crText = pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));  
  85.         else if (lpDIS->itemState & ODS_DISABLED)  
  86.             crText = pDC->SetTextColor(::GetSysColor(COLOR_GRAYTEXT));  
  87.         else  
  88.             crText = pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));  
  89.     }  
  90.   
  91.   
  92.     // 显示字符串  
  93.     GetText(lpDIS->itemID, sText);  
  94.     CRect rect = lpDIS->rcItem;  
  95.   
  96.     // 字符格式  
  97.     UINT nFormat = DT_LEFT | DT_SINGLELINE | DT_VCENTER;  
  98.     if (GetStyle() & LBS_USETABSTOPS)  
  99.         nFormat |= DT_EXPANDTABS;  
  100.       
  101.   
  102.     pDC->DrawText(sText, -1, &rectBK, nFormat | DT_CALCRECT&DT_CENTER);  
  103.     pDC->DrawText(sText, -1, &rectBK, nFormat);  
  104.     DrawIconEx(lpDIS->hDC,rect.left+2,rect.top+1,icon,16,16,0,NULL, DI_NORMAL | DI_COMPAT);  
  105.   
  106.     pDC->SetTextColor(crText);   
  107.     pDC->SetBkMode(nBkMode);   
  108. }  

关于改变成什么样子的,就要好好运用windows编程里面的知识了

(5)最重要的一点:右键控件点开属性中的样式(Styles)将所有者下拉框改成可变的(variable)把有字符串(has strings)勾上
最终的效果是:

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理