clistctrlcl 闪烁_CListCtrl 防止闪烁,调整行显示长度

#pragma once#include"afxcmn.h"

classDBufferListCtrl :publicCListCtrl

{public:

DBufferListCtrl(void);~DBufferListCtrl(void);

DECLARE_MESSAGE_MAP()

afx_msgvoidOnPaint();

afx_msg BOOL OnEraseBkgnd(CDC*pDC);

CString GetItemText(int nItem, int nSubItem) const;virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);

};

#include"stdafx.h"#include"DBufferListCtrl.h"DBufferListCtrl::DBufferListCtrl(void)

{

}

DBufferListCtrl::~DBufferListCtrl(void)

{

}

BEGIN_MESSAGE_MAP(DBufferListCtrl, CListCtrl)

ON_WM_PAINT()

ON_WM_ERASEBKGND()

END_MESSAGE_MAP()voidDBufferListCtrl::OnPaint()

{

CPaintDC dc(this); //device context for painting

CRect rect;

CRect headerRect;

CDC MenDC;

CBitmap MemMap;

GetClientRect(&rect);

GetDlgItem(0)->GetWindowRect(&headerRect);

MenDC.CreateCompatibleDC(&dc);

MemMap.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());

MenDC.SelectObject(&MemMap);

MenDC.FillSolidRect(&rect,RGB(255,255,255));

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 DBufferListCtrl::OnEraseBkgnd(CDC*pDC)

{//TODO: Add your message handler code here and/or call default//return CListCtrl::OnEraseBkgnd(pDC);

returnFALSE;

}

CString DBufferListCtrl::GetItemText(int nItem, int nSubItem) const{

ASSERT(::IsWindow(m_hWnd));

LVITEM lvi;

memset(&lvi, 0, sizeof(LVITEM));

lvi.iSubItem=nSubItem;

CString str;int nLen = 512;intnRes;do{

nLen*= 2;

lvi.cchTextMax=nLen;

lvi.pszText=str.GetBufferSetLength(nLen);

nRes= (int)::SendMessage(m_hWnd, LVM_GETITEMTEXT, (WPARAM)nItem,

(LPARAM)&lvi);

}while (nRes >= nLen-1);

str.ReleaseBuffer();returnstr;

}voidDBufferListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)

{

CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);

CRect rcItem(lpDrawItemStruct->rcItem);int nItem = lpDrawItemStruct->itemID;

COLORREF clrTextSave, clrBkSave;static _TCHAR szBuff[1024];

LV_ITEM lvi;

lvi.mask= LVIF_TEXT | LVIF_STATE;//LVIF_IMAGE |

lvi.iItem =nItem;

lvi.iSubItem= 0;

lvi.pszText=szBuff;

lvi.cchTextMax= sizeof(szBuff);

lvi.stateMask= 0xFFFF;

GetItem(&lvi);

BOOL bSelected= (lvi.state &LVIS_SELECTED);

CRect rcAllLabels;

GetItemRect(nItem, rcAllLabels, LVIR_BOUNDS);if(bSelected)

{

clrTextSave= pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));

clrBkSave= pDC->SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));

pDC->FillRect(rcAllLabels, &CBrush(::GetSysColor(COLOR_HIGHLIGHT)));

}

GetItemRect(nItem, rcItem, LVIR_LABEL);

pDC->DrawText(szBuff, -1, rcItem, DT_LEFT | DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP |DT_VCENTER);

LV_COLUMN lvc;

lvc.mask= LVCF_FMT |LVCF_WIDTH;for (int nColumn = 1; GetColumn(nColumn, &lvc); nColumn++)

{

rcItem.left=rcItem.right;

rcItem.right+=lvc.cx;int nRetLen =CListCtrl::GetItemText(nItem, nColumn,

szBuff,sizeof(szBuff));if (nRetLen == 0)continue;

UINT nJustify=DT_LEFT;switch (lvc.fmt &LVCFMT_JUSTIFYMASK)

{caseLVCFMT_RIGHT:

nJustify=DT_RIGHT;break;caseLVCFMT_CENTER:

nJustify=DT_CENTER;break;default:break;

}

pDC->DrawText(szBuff, -1, rcItem,

nJustify| DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP |DT_VCENTER);

}if (lvi.state &LVIS_FOCUSED)

pDC->DrawFocusRect(rcAllLabels);if(bSelected)

{

pDC->SetTextColor(clrTextSave);

pDC->SetBkColor(clrBkSave);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值