Re: CustomDraw with CListCtrl
Matrixinline a ?crit :
On Sep 7, 2:37 am, mosfet <john....@anonymous.org> wrote:
Hi,
I am trying to modify font on text displayed in a CListCtrl in report
mode by using customdraw.
My problem is I don't know in which stage I have to do it and all my
experiments are unsuccessful.
When I try to display something, it's always above the default text...
check
/ First thing - check the draw stage. If it's the control's prepaint
// stage, then tell Windows we want messages for every item.
if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
Can you give more details and post code to check what you are
missing ..
Anup K
First try ;
BOOL CListCtrlCommands::GetCellRect(int iRow, int iCol, int nArea, CRect
&rect)
{
if(iCol)
return GetSubItemRect(iRow, iCol, nArea, rect);
if(GetColumnCount()== 1)
return GetItemRect(iRow, rect, nArea);
iCol = 1;
CRect rCol1;
if(!GetSubItemRect(iRow, iCol, nArea, rCol1))
return FALSE;
if(!GetItemRect(iRow, rect, nArea))
return FALSE;
rect.right = rCol1.left;
return TRUE;
}
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
switch(pLVCD->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
*pResult = CDRF_NOTIFYSUBITEMDRAW; // ask for subitem
notifications.
break;
case CDDS_ITEMPREPAINT:
*pResult = CDRF_NOTIFYSUBITEMDRAW;
break;
case CDDS_ITEMPREPAINT|CDDS_SUBITEM:
{
int iCol = pLVCD->iSubItem;
int iRow = pLVCD->nmcd.dwItemSpec;
CString sItem = GetItemText(iRow, iCol);
CRect rc;
GetCellRect(iRow, iCol, LVIR_BOUNDS, rc);
// get the device context.
CDC *pDC= CDC::FromHandle(pLVCD->nmcd.hdc);
// paint the text centered.
pDC->DrawText(sItem , rc, DT_CENTER);
*pResult= CDRF_SKIPDEFAULT;
break;
}
default:// it wasn't a notification that was interesting to us.
*pResult = CDRF_DODEFAULT;
}
Another try :
*pResult = CDRF_DODEFAULT;
if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
{
// This is the pre-paint stage for an item. We need to make
another
// request to be notified during the post-paint stage.
*pResult = CDRF_NOTIFYPOSTPAINT;
}
else if ( CDDS_ITEMPOSTPAINT == pLVCD->nmcd.dwDrawStage )
{
// This is the prepaint stage for a subitem. Here's where we set the
// item's text and background colors. Our return value will tell
// Windows to draw the subitem itself, but it will use the new colors
// we set here.
int nItem = static_cast<int> (pLVCD->nmcd.dwItemSpec);
int nSubItem = pLVCD->iSubItem;
LVITEM rItem;
ZeroMemory ( &rItem, sizeof(LVITEM) );
rItem.mask = LVIF_IMAGE | LVIF_STATE;
rItem.iItem = nItem;
rItem.stateMask = LVIS_SELECTED;
GetItem ( &rItem );
//If this item is selected, redraw the icon with its normal colors.
if ( rItem.state & LVIS_SELECTED )
{
CDC* pDC = CDC::FromHandle ( pLVCD->nmcd.hdc );
// Get the rect that holds the item's icon.
CRect rc;
GetItemRect ( nItem, &rc, LVIR_ICON );
// Draw the icon.
//if (m_cImageList.GetSafeHandle() != NULL){
CImageList* pImgList = GetImageList( LVSIL_SMALL );
if (pImgList != NULL){
pImgList->Draw ( pDC, rItem.iImage, rc.TopLeft(),
ILD_TRANSPARENT );
}
// Draw text
/*CString sItem = GetItemText(nItem, 0);
GetItemRect ( nItem, &rc, LVIR_LABEL );
DrawHTML(pLVCD->nmcd.hdc, (LPCTSTR)sItem, sItem.GetLength(),
rc,DT_LEFT);*/
//delete pMemDC;
*pResult = CDRF_SKIPDEFAULT;
}
}