MFC中有許多控件,將控件拖到窗口中右鍵鼠標(biāo),點(diǎn)擊屬性,到樣式標(biāo)簽頁(yè)中會(huì)有很多樣式可以選擇
但是往往這些樣式會(huì)滿足不了我們的需求,這時(shí)候,我們需要自己來(lái)完成我們想要的樣式控件
我們就來(lái)拿ListBox為例子,因?yàn)槲野l(fā)現(xiàn)ListBox的樣式擴(kuò)展的需求量是最大的
(1)在Dialog中拖入ListBox控件
(2)在類視圖添加一個(gè)該控件的子類

(3)然后按Ctrl+W在類向?qū)е薪o你的控件加一個(gè)CColorListBox的變量
(4)可以開(kāi)始為你的CColorListBox添加樣式了
- int CColorListBox::AddMsg(CString lpszItem, DWORD info)
- {
- int nItem = AddString(lpszItem);
- if (nItem >= 0)
- SetItemData(nItem,info);
- int numList = GetCount()-1;
- SetTopIndex(numList);
- SetCurSel(numList);
- //水平滾動(dòng)
- int max_width=0;
- CSize sz;
- CClientDC dc(this);
- for(int i=0;i<GetCount();i++)
- {
- GetText(i,lpszItem);
- sz=dc.GetTextExtent(lpszItem);
- if(max_width<sz.cx)
- max_width=sz.cx;
- }
- SendMessage(LB_SETHORIZONTALEXTENT,max_width,0);
-
- return nItem;
- }
- void CColorListBox::DrawItem(LPDRAWITEMSTRUCT lpDIS)
- {
- // TODO: Add your code to draw the specified item
- if ((int)lpDIS->itemID < 0)
- return;
-
- CDC *pDC = CDC::FromHandle(lpDIS->hDC);
-
- COLORREF crText;
- CString sText;
- COLORREF crNorm;
- HICON icon;
- switch (lpDIS->itemData)
- {
- case M_OK:
- crNorm = #00ff00;
- icon = AfxGetApp()->LoadIcon(IDI_ICON_OK);
- break;
- case M_ERROR:
- crNorm=#ff0000;
- icon = AfxGetApp()->LoadIcon(IDI_ICON_ERROR);
- break;
- case M_WARING:
- crNorm=#0000ff;
- icon = AfxGetApp()->LoadIcon(IDI_ICON_WARING);
- break;
- case M_USER:
- crNorm=#00ff00;
- icon = AfxGetApp()->LoadIcon(IDI_ICON_USER);
- break;
- case M_USER_:
- crNorm=#000000;
- icon = AfxGetApp()->LoadIcon(IDI_ICON_USER_);
- break;
- }
-
-
- // 字符串顏色
- COLORREF crHilite = RGB(255-GetRValue(crNorm), 255-GetGValue(crNorm), 255-GetBValue(crNorm));
- CRect rectBK(lpDIS->rcItem.left+22,lpDIS->rcItem.top,lpDIS->rcItem.right+18,lpDIS->rcItem.bottom);
-
-
- // 如果被選中,使用高亮色會(huì)矩形
- if ((lpDIS->itemState & ODS_SELECTED) &&
- (lpDIS->itemAction & (ODA_SELECT | ODA_DRAWENTIRE)))
- {
- CBrush brush(crNorm);
- pDC->FillRect(rectBK, &brush);
- }
-
- // 如果取消選中,恢復(fù)
- if (!(lpDIS->itemState & ODS_SELECTED) && (lpDIS->itemAction & ODA_SELECT))
- {
- CBrush brush(::GetSysColor(COLOR_WINDOW));
- pDC->FillRect(rectBK, &brush);
- }
-
- // 繪制焦點(diǎn)矩形
- if ((lpDIS->itemAction & ODA_FOCUS) && (lpDIS->itemState & ODS_FOCUS))
- pDC->DrawFocusRect(&lpDIS->rcItem);
-
- // 取消焦點(diǎn)矩形
- if ((lpDIS->itemAction & ODA_FOCUS) && !(lpDIS->itemState & ODS_FOCUS))
- pDC->DrawFocusRect(&lpDIS->rcItem);
-
-
- // 透明背景
- int nBkMode = pDC->SetBkMode(TRANSPARENT);
-
-
- if (lpDIS->itemData)
- {
- if (lpDIS->itemState & ODS_SELECTED)
- crText = pDC->SetTextColor(crHilite);
- else if (lpDIS->itemState & ODS_DISABLED)
- crText = pDC->SetTextColor(::GetSysColor(COLOR_GRAYTEXT));
- else
- crText = pDC->SetTextColor(crNorm);
- }
-
- else
- {
- if (lpDIS->itemState & ODS_SELECTED)
- crText = pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
- else if (lpDIS->itemState & ODS_DISABLED)
- crText = pDC->SetTextColor(::GetSysColor(COLOR_GRAYTEXT));
- else
- crText = pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
- }
-
-
- // 顯示字符串
- GetText(lpDIS->itemID, sText);
- CRect rect = lpDIS->rcItem;
-
- // 字符格式
- UINT nFormat = DT_LEFT | DT_SINGLELINE | DT_VCENTER;
- if (GetStyle() & LBS_USETABSTOPS)
- nFormat |= DT_EXPANDTABS;
-
-
- pDC->DrawText(sText, -1, &rectBK, nFormat | DT_CALCRECT&DT_CENTER);
- pDC->DrawText(sText, -1, &rectBK, nFormat);
- DrawIconEx(lpDIS->hDC,rect.left+2,rect.top+1,icon,16,16,0,NULL, DI_NORMAL | DI_COMPAT);
-
- pDC->SetTextColor(crText);
- pDC->SetBkMode(nBkMode);
- }
關(guān)于改變成什么樣子的,就要好好運(yùn)用windows編程里面的知識(shí)了
(5)最重要的一點(diǎn):右鍵控件點(diǎn)開(kāi)屬性中的樣式(Styles)將所有者下拉框改成可變的(variable)把有字符串(has strings)勾上最終的效果是: