想前辈请教一个自绘的问题

alionx 2003-10-20 07:18:34
晚辈在项目中派生了一个CEXHEADERCTRL的子类,并重画了控件的边框
是之呈现平面的效果这一步是做到了,但加入HEADERCTRL的COLUMN的标题却无论如何都不显示,下面是我的代码,基本是抄CJLIB里的CJFLATHEADERCTRL的,请前辈们指点
void CExHeaderCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);

// Get the column rect
CRect rcLabel(lpDrawItemStruct->rcItem);

// Save DC
int nSavedDC = dc.SaveDC();

// Set clipping region to limit drawing within column
CRgn rgn;
rgn.CreateRectRgnIndirect(&rcLabel);
dc.SelectObject(&rgn);
rgn.DeleteObject();

// Draw the background
COLORREF clr = ::GetSysColor(COLOR_3DFACE);
CBrush brush(clr);
dc.FillRect(rcLabel, &brush);
dc.SetBkMode(TRANSPARENT);

// Get the column text and format
TCHAR buf[256];
HD_ITEM hditem;

hditem.mask = HDI_TEXT | HDI_FORMAT;
hditem.pszText = buf;
hditem.cchTextMax = 255;

GetItem(lpDrawItemStruct->itemID, &hditem);

// Determine format for drawing column label
UINT uFormat = DT_SINGLELINE | DT_NOPREFIX | DT_NOCLIP
| DT_VCENTER | DT_END_ELLIPSIS ;

if(hditem.fmt & HDF_CENTER)
uFormat |= DT_CENTER;
else if(hditem.fmt & HDF_RIGHT)
uFormat |= DT_RIGHT;
else
uFormat |= DT_LEFT;

// Adjust the rect if the mouse button is pressed on it
if(lpDrawItemStruct->itemState == ODS_SELECTED)
{
rcLabel.left++;
rcLabel.top += 2;
rcLabel.right++;
}

// Adjust the rect further if Sort arrow is to be displayed
if( lpDrawItemStruct->itemID == (UINT)m_nSortCol )
{
rcLabel.right -= 3 * m_nOffset;
}

rcLabel.left += m_nOffset;
rcLabel.right -= m_nOffset;

// Draw column label
if(rcLabel.left < rcLabel.right)
{
//dc.SelectObject(&m_Font);
dc.DrawText(buf,-1,rcLabel, uFormat);
}

// Draw the Sort arrow
if(lpDrawItemStruct->itemID == (UINT)m_nSortCol)
{
CRect rcIcon(lpDrawItemStruct->rcItem);

// Set up pens to use for drawing the triangle
CPen penLite(PS_SOLID, 1, ::GetSysColor(COLOR_3DHILIGHT));
CPen penShad(PS_SOLID, 1, ::GetSysColor(COLOR_3DSHADOW));
CPen *pOldPen = dc.SelectObject(&penLite);

if(m_bSortAsc)
{
// Draw triangle pointing upwards
dc.MoveTo(rcIcon.right - 2*m_nOffset, m_nOffset-1);
dc.LineTo(rcIcon.right - 3*m_nOffset/2, rcIcon.bottom - m_nOffset);
dc.LineTo(rcIcon.right - 5*m_nOffset/2-2, rcIcon.bottom - m_nOffset);
dc.MoveTo(rcIcon.right - 5*m_nOffset/2-1, rcIcon.bottom - m_nOffset-1);

dc.SelectObject(&penShad);
dc.LineTo(rcIcon.right - 2*m_nOffset, m_nOffset-2);
}
else
{
// Draw triangle pointing downwords
dc.MoveTo(rcIcon.right - 3*m_nOffset/2, m_nOffset-1);
dc.LineTo(rcIcon.right - 2*m_nOffset-1, rcIcon.bottom - m_nOffset + 1);
dc.MoveTo(rcIcon.right - 2*m_nOffset-1, rcIcon.bottom - m_nOffset);

dc.SelectObject(&penShad);
dc.LineTo(rcIcon.right - 5*m_nOffset/2-1, m_nOffset -1);
dc.LineTo(rcIcon.right - 3*m_nOffset/2, m_nOffset -1);
}

// Restore the pen
dc.SelectObject(pOldPen);
}

dc.RestoreDC(nSavedDC);
dc.Detach();
//CHeaderCtrl::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
...全文
38 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
qrlvls 2003-10-27
  • 打赏
  • 举报
回复
http://www.vckbase.com/code/listcode.asp?mclsid=3&sclsid=323&page=3
wangjs720 2003-10-26
  • 打赏
  • 举报
回复
没耐心看下去了,帮你UP
alionx 2003-10-25
  • 打赏
  • 举报
回复
ModifyStyle(0,BS_OWNERDRAW)是设按钮的吧
自绘的风个已经设好了
而且,CJLIBARY的CJFLATHEADERCTRL在没加数据的情况下都显示正常的
我都整个抄CJFLATHEADERCTRL的代码可是不行啊

请个位再指点一下在下吧!~_~
roger_ding 2003-10-24
  • 打赏
  • 举报
回复
你先加入一条记录试试看,因为没有item,listctrl是不会绘制的
Linux2001 2003-10-24
  • 打赏
  • 举报
回复
同意楼上的
wuxfBrave 2003-10-24
  • 打赏
  • 举报
回复
ModifyStyle(0,BS_OWNERDRAW)
wuxfBrave 2003-10-24
  • 打赏
  • 举报
回复
是不是没有设置OWNERDRAW
alionx 2003-10-23
  • 打赏
  • 举报
回复
怎么没有人回答我的问题啊?!
郁闷ing~_~
alionx 2003-10-21
  • 打赏
  • 举报
回复
设了断点,可是一直都进不去
似乎没有调用过该涵数.
wuxfBrave 2003-10-21
  • 打赏
  • 举报
回复
if(rcLabel.left < rcLabel.right)
{
//dc.SelectObject(&m_Font);
dc.DrawText(buf,-1,rcLabel, uFormat);
}
在此处设置一个断点,观察一下各个变量的值看看那
bcpl 2003-10-20
  • 打赏
  • 举报
回复
检测一下dc.DrawText(buf,-1,rcLabel, uFormat);时rcLabel是否正确
popyyb 2003-10-20
  • 打赏
  • 举报
回复
mark & up

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧