如何在CTreeCtrl中相应OnPaint重绘

zyq5945 2010-06-03 09:12:24
郁闷了,最近有个需求,要用CTreeCtrl显示一些东西,每个Item带有三个控件(一个Button和两个复选框),在CodeProject上也没有找到类似的例子。自己子类化在OnPaint中居然处理不了,MoveTo+LineTo或者TextOut画的东西看不见,然而放在OnLButtonDown和OnLButtonUp又是可以的,放在WM_CTLCOLOR 中会画出来又会很乱。
看到有个很接近的例子用CWnd派生的,但工作量似乎很大。
...全文
785 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyq5945 2010-06-05
  • 打赏
  • 举报
回复
在CTreeCtrl的派生类中CTreeCtrl::OnPaint()和CPaintDC dc(this)不能同时使用。
fishion 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 visualeleven 的回复:]
重载DrawItem应该是可以的吧。。。
[/Quote]
一般都这样的吧
zyq5945 2010-06-04
  • 打赏
  • 举报
回复
好的,我先试试,但还是很奇怪为什么我派生的CTreeCtrl处理不了OnPaint,但看别人的例子是能处理的。
向立天 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 zyq5945 的回复:]
确实是可以这样,但CTreeCTrl的OnPaint无法处理,现在用VS2008处理CTreeCTrl派生类的OnPaint就出错了。
[/Quote]
不用处理OnPaint啊
换图标就好了
zyq5945 2010-06-04
  • 打赏
  • 举报
回复
确实是可以这样,但CTreeCTrl的OnPaint无法处理,现在用VS2008处理CTreeCTrl派生类的OnPaint就出错了。
向立天 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 zyq5945 的回复:]
引用 15 楼 visualeleven 的回复:

http://www.codeproject.com/KB/tree/CRHTree.aspx

这个例子看过,但是现在上头需求是一个按钮和两个复选框这三个控件(图片也行,自己再慢慢处理消息)是在节点名称与图标之间。
[/Quote]
那你直接用一个矩形图标不就好了
一个是实体图标
一个模拟按钮
然后再画上两个复选框
zyq5945 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 visualeleven 的回复:]

http://www.codeproject.com/KB/tree/CRHTree.aspx
[/Quote]
这个例子看过,但是现在上头需求是一个按钮和两个复选框这三个控件(图片也行,自己再慢慢处理消息)是在节点名称与图标之间。
j8daxue 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 zyq5945 的回复:]
引用 13 楼 j8daxue 的回复:

引用 11 楼 zyq5945 的回复:

就是CTreeCtrl派生的,擦背景我直接返回了。
整个结构就这样
C/C++ code

HTREEITEM hItem = GetFirstVisibleItem();
do
{
//draw...
}while(hItem = GetNextVisibleItem(hItem));……
[/Quote]
我的工作环境,vs2008,没带插件,windows 7。
家里机也是win 7.不过做法才xp机上也测试过了,能跑
zyq5945 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 j8daxue 的回复:]

引用 11 楼 zyq5945 的回复:

就是CTreeCtrl派生的,擦背景我直接返回了。
整个结构就这样
C/C++ code

HTREEITEM hItem = GetFirstVisibleItem();
do
{
//draw...
}while(hItem = GetNextVisibleItem(hItem));
[/Quote]
难道VS2008SP1的CTreeCtrl做了很大改动了,刚看了下在VS2008中WM_ERASEBKGND是能直接返回TRUE的。
zyq5945 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 xianglitian 的回复:]

每个item里要有一个按钮和两个复选框?
你是不是要做TreeList
[/Quote]
是啊,扩展使得每一个节点有一个按钮和两个复选框
j8daxue 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zyq5945 的回复:]
[/Quote]
就是CTreeCtrl派生的,擦背景我直接返回了。
整个结构就这样

HTREEITEM hItem = GetFirstVisibleItem();
do
{
//draw...
}while(hItem = GetNextVisibleItem(hItem));
向立天 2010-06-04
  • 打赏
  • 举报
回复
每个item里要有一个按钮和两个复选框?
你是不是要做TreeList
zyq5945 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 j8daxue 的回复:]

引用 9 楼 zyq5945 的回复:
CTreeCtrl没有DrawItem虚函数,不像CListBox一样能响应WM_DRAWITEM,WM_MEASUREITEM消息。
NM_CUSTOMDRAW是能响应,但dwDrawStage只有CDDS_PREPAINT(在这里画的话在OnPaint中又会乱成一团),似乎没有CDDS_POSTPAINT,还是需要什么地方需要设置。
在OnPai……
[/Quote]
你是在CTreeCtrl派生类中做的吗?我感觉应该不是这个问题,感觉是CTreeCtrl中了其他处理,展开某个节点会有好多的WM_ERASEBKGND消息出来。
在windows2003的VS2008SP1版本中做的,同事在同样配置的机器上建个新工程,也是一样的画不了。
j8daxue 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zyq5945 的回复:]
CTreeCtrl没有DrawItem虚函数,不像CListBox一样能响应WM_DRAWITEM,WM_MEASUREITEM消息。
NM_CUSTOMDRAW是能响应,但dwDrawStage只有CDDS_PREPAINT(在这里画的话在OnPaint中又会乱成一团),似乎没有CDDS_POSTPAINT,还是需要什么地方需要设置。
在OnPaint中尝试用双缓冲也画不出来。
那位大哥给……
[/Quote]
代码是否有问题呢?
我做过,只需要重载onpaint画,不需要修改什么样式,不过tree是在资源里建立。
zyq5945 2010-06-04
  • 打赏
  • 举报
回复
CTreeCtrl没有DrawItem虚函数,不像CListBox一样能响应WM_DRAWITEM,WM_MEASUREITEM消息。
NM_CUSTOMDRAW是能响应,但dwDrawStage只有CDDS_PREPAINT(在这里画的话在OnPaint中又会乱成一团),似乎没有CDDS_POSTPAINT,还是需要什么地方需要设置。
在OnPaint中尝试用双缓冲也画不出来。
那位大哥给个提示。
Eleven 2010-06-03
  • 打赏
  • 举报
回复
重载DrawItem应该是可以的吧。。。
ToCpp 2010-06-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 oldmanzhao 的回复:]
NM_CUSTOMDRAW,这个是CTreeCtrl和CListCtrl的御用自绘消息。
[/Quote]
这个比DrawItem好用,\(^o^)/~
oldmanzhao 2010-06-03
  • 打赏
  • 举报
回复
NM_CUSTOMDRAW,这个是CTreeCtrl和CListCtrl的御用自绘消息。
oyljerry 2010-06-03
  • 打赏
  • 举报
回复
http://tieba.baidu.com/f?kz=688719618
加载更多回复(3)

15,979

社区成员

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

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