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

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);
}
...全文
42 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
前言最近随着计算机的发展,软件日益更新,有很多公司发布的产品遭到篡改和破解,在总众多年的历史种逐渐形成了软件保护与软件破解之间的对抗产生了软件逆向工程这本门技术将在如下的课程讲解各种软件逆向知识,软件保护知识,已经破解脱壳反调试知识,为初期学软件逆向不懂而又迷茫的同学门指明一条道路此套课堂能有效帮助同学们解决软件逆向中所遇到的大部分问题大纲软件逆向工程高级班分为反调试篇汇编篇算法篇补丁篇HOOK篇将在如上这几篇对软件逆向的各个方面进行详解,包括网络验证的分析思路,封包算法的提取,以及各种软件保护技术,无论哪一篇都会从诸多个方面的细节进行详解反调试篇:分为PEB,时间校验,CRC,NtQuery函数,内核过渡等知识要领与诸多方面的综合性详解,细节分为每一节课,每一节课目标清晰无比,每一节深入精髓进行讲解!汇编篇:一个程序编译完成之后是如何通过在计算机运行起来的,其中少不了底层知识的汇编指令,汇编篇中将深入浅出的带领同学们对MASM32SDK的一套汇编库中开发程序,熟悉汇编的原理,如何运用汇编写出一套花指令,并且去除指令,方便以后的算法学习以及为今后的学习打下坚实的基础算法篇:随着编程语言的发展,编程语言的标准也在发展,一些编译器善于运用数学的手法,对程序进行各种优化,然后我们进行分析,我们得需要一步步还原这个优化或清晰了解这个优化才有可能掌握这个数学模型优化,进一步还原代码,算法篇知识要领将在优化,技巧这方面表现的玲离尽致!此篇会带领同学们分析多个语言的算法,包括C/C++算法还原代码还原易语言代码还原 算分开库的实现,制作自己的第一个注册机等!补丁篇:说到补丁,同学们可能第一个到的就是对方一些网络验证所用到的技巧,我的课程这一方面虽有涉及,但是补丁技术远远不止这一点,我的课程会详解更多的补丁知识原理,包括什么是补丁,补丁的真正概念,前辈们是如何善用补丁对程序的漏洞进行修补损坏的程序。将在此篇一一介绍HOOK篇:详细详解了各种HOOK的原理以及实现代码,包括网上流行所说的超级HOOK,COMHOOK,协议HOOK,代理中转等方法,怎么定位关键位置,环境的保存知识要领,hook关键的注意事项,为自己以后做hook行业打下坚实的基础课程每一个细节讲究的深入骨髓,通俗易懂的学习方式,全程贯彻原理,软件逆向中必不可少少的教程!

15,979

社区成员

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

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