/*CListCtrl控件Owner Draw Fixed属性 :true*//
//头文件 CMyListCtrl.h
#ifndef CMYLISTCTRL_H
#define CMYLISTCTRL_H
class CMyListCtrl
:public CListCtrl
{
DECLARE_DYNAMIC(CMyListCtrl)
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
protected:
DECLARE_MESSAGE_MAP()
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnPaint();
private:
BOOL DrawPicture(CDC *pDc,int nItem,int nSubItem);
BOOL DrawText(CDC *pDc,int nItem,int nSubItem);
};
#endif
//实现文件 CMyListCtrl.cpp
#include "stdafx.h"
#include "CMyListCtrl.h"
#include <set>
IMPLEMENT_DYNAMIC(CMyListCtrl, CListCtrl)
BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
ON_WM_PAINT()
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()
BOOL CMyListCtrl::OnEraseBkgnd(CDC* pDC)
{
//响应WM_ERASEBKGND消息
return false;
//屏蔽默认处理
//return CListCtrl::OnEraseBkgnd(pDC);
}
void CMyListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your code to draw the specified item
ASSERT(lpDrawItemStruct->CtlType == ODT_LISTVIEW);
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);
ASSERT(NULL != dc.GetSafeHdc());
// Save these value to restore them when done drawing.
COLORREF crOldTextColor = dc.GetTextColor();
COLORREF crOldBkColor = dc.GetBkColor();
if(lpDrawItemStruct->itemState & ODS_SELECTED)//)
{
dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
dc.FillSolidRect(&lpDrawItemStruct->rcItem,
::GetSysColor(COLOR_HIGHLIGHT));
}
else
{
dc.FillSolidRect(&lpDrawItemStruct->rcItem, crOldBkColor);
/*if(lpDrawItemStruct->itemID%2)
dc.FillSolidRect(&lpDrawItemStruct->rcItem, RGB(128,128,128));
else
dc.FillSolidRect(&lpDrawItemStruct->rcItem, RGB(255,128,255));
*/
}
// If this item has the focus, draw a red frame around the
// item's rect.
/*if ((lpDrawItemStruct->itemAction | ODA_FOCUS) &&
(lpDrawItemStruct->itemState & ODS_FOCUS))
{
CBrush br(RGB(0, 0, 128));
dc.FrameRect(&lpDrawItemStruct->rcItem, &br);
}*/
CString strText(_T(""));
CRect rcItem;
INT nItem = lpDrawItemStruct->itemID;
for(int i=0; i<GetHeaderCtrl()->GetItemCount(); i++)
{
if(i == 0)
DrawPicture(&dc,nItem,i);
DrawText(&dc , nItem , i);
}
// Reset the background color and the text color back to their
// original values.
dc.SetTextColor(crOldTextColor);
dc.SetBkColor(crOldBkColor);
dc.Detach();
}
void CMyListCtrl::OnPaint()
{
//响应WM_PAINT消息
CPaintDC dc(this); // device context for painting
CRect rect;
CRect headerRect;
CDC MenDC;//内存ID表
CBitmap MemMap;
GetClientRect(&rect);
GetDlgItem(0)->GetWindowRect(&headerRect);
MenDC.CreateCompatibleDC(&dc);
MemMap.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());
MenDC.SelectObject(&MemMap);
COLORREF crOldBkColor = dc.GetBkColor();
MenDC.FillSolidRect(&rect,crOldBkColor);
//这一句是调用默认的OnPaint(),把图形画在内存DC表上
DefWindowProc(WM_PAINT,(WPARAM)MenDC.m_hDC,(LPARAM)0);
//输出
dc.BitBlt(0,headerRect.Height(),rect.Width(), rect.Height(),&MenDC,0, headerRect.Height(),SRCCOPY);
MenDC.DeleteDC();
MemMap.DeleteObject();
}
BOOL CMyListCtrl::DrawPicture(CDC *pDc,int nItem,int nSubItem)
{
LVITEM vItem = {0};
vItem.mask = LVIF_IMAGE;
vItem.iItem = nItem;
vItem.iSubItem = nSubItem;
GetItem(&vItem);
CImageList *pImageList = this->GetImageList(LVSIL_SMALL);
CRect rcPic;
GetSubItemRect(nItem, nSubItem, LVIR_ICON, rcPic);
int cx, cy;
if(pImageList != NULL){
::ImageList_GetIconSize(*pImageList, &cx, &cy);
pImageList->DrawIndirect(pDc, vItem.iImage, CPoint(rcPic.left , rcPic.top),
CSize(cx, cy), CPoint(0, 0));
}
return TRUE;
}
BOOL CMyListCtrl::DrawText(CDC *pDc,int nItem,int nSubItem)
{
TCHAR szString[256]=TEXT("");
GetItemText(nItem,nSubItem,szString,256);
CRect rcItem;
GetSubItemRect(nItem, nSubItem, LVIR_LABEL, rcItem);
rcItem.left += 5;
pDc->DrawText(szString,lstrlen(szString),&rcItem,DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
return TRUE;
}