VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 432|回复: 5

[求助] 画图的困惑

[复制链接]
71_avatar_middle
online_member zzw843 发表于 2018-2-10 11:01:35 | 显示全部楼层 |阅读模式
3驿站币
  1. void CMyListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  2. {

  3.         // TODO:  添加您的代码以绘制指定项
  4.         //CDC * pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
  5.         if (lpDrawItemStruct->itemAction&ODA_DRAWENTIRE)
  6.         {
  7.                 CDC pDC;
  8.                 pDC.Attach(lpDrawItemStruct->hDC);
  9.                 int red = 125, green = 50, black = 68;
  10.                 CPen pen;
  11.                 pen.CreatePen(PS_DASH, 0.8, RGB(255, 255, 255));
  12.                 CBrush brush;
  13.                 CHeaderCtrl *m_header;
  14.                 m_header = GetHeaderCtrl();
  15.                 CRect rc;
  16.                 pDC.SelectObject(&pen);
  17.                 pDC.SetBkMode(TRANSPARENT);
  18.                 CString s;
  19.                 int j;
  20.                 for (int i = 0; i < m_header->GetItemCount(); i++)
  21.                 {
  22.                         brush.CreateSolidBrush(RGB(red, green, black));
  23.                         pDC.SelectObject(&brush);
  24.                         if (lpDrawItemStruct->itemState&ODS_SELECTED)
  25.                         {
  26.                                 if (i == m_sub)
  27.                                 {
  28.                                         brush.Detach();
  29.                                         brush.CreateSolidBrush(RGB(250, 0, 0));
  30.                                         pDC.SelectObject(&brush);
  31.                                 }
  32.                                 else
  33.                                 {
  34.                                         brush.Detach();
  35.                                         brush.CreateSolidBrush(RGB(0, 250, 0));
  36.                                         pDC.SelectObject(&brush);
  37.                                 }
  38.                         }
  39.                         if (i == 0)
  40.                         {
  41.                                 GetSubItemRect(lpDrawItemStruct->itemID, 1, LVIR_BOUNDS, rc);
  42.                                 rc.right = rc.left;
  43.                                 rc.left = lpDrawItemStruct->rcItem.left;
  44.                         }
  45.                         else
  46.                                 GetSubItemRect(lpDrawItemStruct->itemID, i, LVIR_BOUNDS, rc);
  47.                         j = pDC.Rectangle(rc);
  48.                         brush.Detach();
  49.                         s = GetItemText(lpDrawItemStruct->itemID, i);
  50.                         if (i == 0)
  51.                         {
  52.                                 rc.left -= GetScrollPos(SB_HORZ);
  53.                         }
  54.                         if (lpDrawItemStruct->itemID == 0)
  55.                         {
  56.                                 rc.top -= GetScrollPos(SB_VERT)*m_height;
  57.                         }
  58.                         j = pDC.DrawText(s, rc, DT_SINGLELINE | DT_VCENTER | DT_CENTER);
  59.                         red += 10;
  60.                         green += 15;
  61.                         black += 21;
  62.                         if (red>255)
  63.                                 red = 0;
  64.                         if (green> 255)
  65.                                 green = 0;
  66.                         if (black> 255)
  67.                                 black = 0;
  68.                 }
  69.                 pen.Detach();
  70.                 brush.Detach();
  71.                 pDC.DeleteDC();
  72.         }
  73. }
复制代码

我想自己写CListCtrl类,通过DrawItem来绘制控件,以上是代码,在运行时item为0的那一行正常绘制,当其他行绘制时执行pDC.Rectangle(rc)返回的是0,还有pDC.DrawText(s, rc, DT_SINGLELINE | DT_VCENTER | DT_CENTER)返回也是0,真是费解,请高手指点。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

71_avatar_middle
ico_lz  楼主| zzw843 发表于 2018-2-10 14:54:05 | 显示全部楼层
想了一中午,明白了,不能用pDC.DeleteDC(),需要先释放句柄,应该用Detach(),测试成功,但是运行过程中调整标头宽度几次后背景色就没了,然后程序就死了,不知道为何???

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

01_avatar_middle
online_admins admin 发表于 2018-2-10 19:36:04 | 显示全部楼层
zzw843 发表于 2018-2-10 14:54
想了一中午,明白了,不能用pDC.DeleteDC(),需要先释放句柄,应该用Detach(),测试成功,但是运行过程中调 ...

CreateCompatibleDC 使用完之后要 DeleteDC
GetDC 之后要ReleaseDC,楼主对照下试试

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

71_avatar_middle
ico_lz  楼主| zzw843 发表于 2018-2-11 08:37:22 | 显示全部楼层
admin 发表于 2018-2-10 19:36
CreateCompatibleDC 使用完之后要 DeleteDC
GetDC 之后要ReleaseDC,楼主对照下试试


谢谢admin,你看我上边的程序有没有什么漏洞,运行过程中当我调整几次标头宽度或移动几次滚动条后就不能正常绘制数据了,底色和数据都显示不出来,列表框就是空白。真是无奈,自绘控件我就总是学的不是特别清楚,这是出问题后的图片,请多指教。
无标题.png

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

74_avatar_middle
online_member supers 发表于 2018-2-12 13:48:58 | 显示全部楼层
画图的困惑

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-5-24 10:07

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表