list control 中字体颜色怎么修改
想在list 中插入一个数据 比喻 你好啊(好不好) 括号里的字体想改变颜色要怎么修改?
[解决办法]
字体本身没颜色,字体是用 pen 画上去的。
是 pen 有颜色。
[解决办法]
这个自能自绘,默认的只能改所有的颜色不能针对个别文字
[解决办法]
继承CListCtrl、CHeaderCtrl派生出新类进行自绘....
LZ看看这个
http://club.topsage.com/thread-531223-1-1.html
[解决办法]
重写以下OnCtlColor,参考下面的例子
HBRUSH CxxDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何属性
switch (pWnd->GetDlgCtrlID())
{
case IDC_LIST_xx:
pDC->SetBkColor(RGB(255,100,100));
pDC->SetTextColor(RGB(255,0,0));
return(HBRUSH)GetStockObject(NULL_BRUSH);
case IDC_STATIC_xx:
pDC->SetTextColor(RGB(125,125,255));
return(HBRUSH)GetStockObject(NULL_BRUSH);
}
return hbr;
}
LRESULT CPlayListView::OnDrawItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{
LPDRAWITEMSTRUCT lpDIS=(LPDRAWITEMSTRUCT)lParam;
INT nItem= lpDIS->itemID;
CRect rcCol = lpDIS->rcItem;
HDC dc=lpDIS->hDC;
LVITEM item;
item.iItem = nItem;
item.iSubItem = 0;
item.mask = LVIF_IMAGE
[解决办法]
LVIF_STATE;
item.stateMask = 0XFFFF;
GetItem(&item);
BOOL selected = item.state &LVIS_SELECTED;
BOOL focused = item.state & LVIS_FOCUSED;
//普通
//白底,黑字
int B=nItem%2?clText1 : clText2;
int T=COLOR_WINDOWTEXT ;
//蓝底,白字
const int SFB=COLOR_HIGHLIGHT;
const int SFT=COLOR_WINDOW;
//灰底,黑字
const int SB=COLOR_BTNFACE;
const int ST=COLOR_WINDOWTEXT;
COLORREF clBackgnd;
COLORREF clText;
if(selected)
{
clBackgnd=::GetSysColor(SFB);
clText=::GetSysColor(SFT);
}
else if( focused )
{
clBackgnd=::GetSysColor(SB);
clText=::GetSysColor(ST);
}
else
{
clBackgnd=B;
clText=::GetSysColor(T);
}
//行背景
HPEN hNewPen=::CreatePen(PS_SOLID,1, clBackgnd );
HBRUSH hNewBrush= ::CreateSolidBrush(clBackgnd);
HPEN hOldPen = (HPEN)::SelectObject(dc, hNewPen);
HBRUSH hOldBrush = (HBRUSH)::SelectObject(dc,hNewBrush );
::Rectangle(dc, rcCol.left, rcCol.top, rcCol.right, rcCol.bottom);
//如果选中项具有焦点,画出虚线矩形焦点边框
if(focused && GetFocus()==m_hWnd)
{
RECT rcFocus=rcCol;
rcFocus.left+=TEXTALIGN__WIDTH;
::DrawFocusRect(dc,&rcCol);
}
//draw text
::DeleteObject(hNewPen);
hNewPen=::CreatePen(PS_SOLID,1,clText);
SelectObject(dc,hNewPen);
::SetTextColor(dc,clText);
LV_COLUMN lvc;
lvc.mask=LVCF_FMT
[解决办法]
LVCF_WIDTH;
rcCol.right = rcCol.left+TEXTALIGN__WIDTH;
for(int nOrder=0; GetColumn(nOrder,&lvc); ++nOrder)
{
int nSubItem=Header_OrderToIndex(ListView_GetHeader(m_hWnd),nOrder);
HDITEM headerItem;
headerItem.mask=HDI_WIDTH
[解决办法]
HDI_ORDER
[解决办法]
HDI_FORMAT;
GetHeader().GetItem(nSubItem,&headerItem);
int fmt=headerItem.fmt;
UINT DT_S=DT_LEFT;
rcCol.left = rcCol.right;
rcCol.right = rcCol.left + headerItem.cxy;
if (fmt & HDF_CENTER)
{
DT_S=DT_CENTER;
}
else if (fmt & HDF_RIGHT)
{
DT_S=DT_RIGHT;
rcCol.right-=TEXTALIGN__WIDTH;
}
else //left
{
rcCol.left+=TEXTALIGN__WIDTH;
}
WCHAR szText[MAX_PATH]={};
GetItemText(nItem,nSubItem,szText,MAX_PATH);
MakeShortString(dc,szText,headerItem.cxy-TEXTALIGN__WIDTH);
DrawText(dc,szText, -1,&rcCol, DT_S
[解决办法]
DT_VCENTER
[解决办法]
DT_SINGLELINE);
}
::SelectObject(dc, hOldBrush);
::DeleteObject(hNewBrush);
::SelectObject(dc,hOldPen);
::DeleteObject(hNewPen);
//去掉之前的焦点边框
if (focused && nItem!=indexLast)
{
RedrawItems(indexLast,indexLast);
indexLast=nItem;
}
return 1;
}