首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

list control 中字体颜色如何修改

2013-03-14 
list control 中字体颜色怎么修改想在list 中插入一个数据 比喻你好啊(好不好) 括号里的字体想改变颜色要

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;
}

[解决办法]
引用:
引用:重写以下OnCtlColor,参考下面的例子
C/C++ code?1234567891011121314151617HBRUSH CxxDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){    HBRUSH hbr = CDialog::OnCtlColor(pDC, ……


这是窗口的事件,
可以在这个事件中获取绘制的控件ID,根据控件ID设置控件的背景颜色、字体。
[解决办法]
看看这个
http://www.codeproject.com/Articles/1796/XListCtrl-A-custom-draw-list-control-with-subitem
[解决办法]
截获WM_DRAWITEM消息.自绘.
看下面各种状态下的,字体颜色.





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;
}

热点排行