搜索
bottom↓
回复: 7

VC下自定义类不响应WM_PAINT消息怎么办?

[复制链接]

出0入0汤圆

发表于 2010-11-30 20:48:09 | 显示全部楼层 |阅读模式
自己定义了一个绘图的类,用ClassWizard对其添加了WM_PAINT消息响应函数,在OnPaint中写入MessageBox不会弹出,在里面打了断点单步调试也进不去,而这些操作在主对话框里都执行正常,不知道是哪里出了问题,送上源码,希望高手们能帮我解答下

点击此处下载 ourdev_601439UNPTVG.rar(文件大小:3.41M) (原文件名:MyCurve.rar)

曲线是可以绘制了的,就是想在自定义类里响应重绘

(原文件名:QQ截图未命名.png)

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2010-12-1 09:18:07 | 显示全部楼层
有没有人帮帮我啊

出0入0汤圆

发表于 2010-12-1 10:02:28 | 显示全部楼层
因为在对话框里你只是定义了成员变量CMyCurveCtrl m_Curve,但是你没有创建对应的窗口,你可以在调试时看到m_Curve这个CWnd没有绑定窗口句柄(调试器里可以看到是句柄是NULL),也就是说它其实还不是一个窗口,所以就不会响应OnPaint。

有2种方法可以达到你的目的:
1、用CWnd::Attach将那个绘制曲线控件的句柄绑定到你的m_Curve对象上去,这时这个对象就是一个完整的Cwnd了,就能做你想做的事情了,记住最后要Detach一下。
2、其实不需要将这个控件单独做成类,你在主对话框的OnPaint中调用绘图函数更简单点,效率上也不会有什么损失,如果你为了更加模块化,可以单独将它做成不是Cwnd的类,那些什么初始化、绘图之类的都写成函数,在主对话框的各种函数里调用即可。

出0入0汤圆

 楼主| 发表于 2010-12-2 19:33:36 | 显示全部楼层
回复【2楼】jpchen
-----------------------------------------------------------------------

非常感谢,m_Curve成员里确实是没有CWnd,我试着用CreatEx为其创建一个窗口,但是导致我的绘图出现问题,学艺不精啊,最近要考试了,没时间来研究了,最终我还是采用了您的第二种方案,其实非常希望有人能按我的思路给我一个参考,我原本思路是这样:
在自定义的OnPaint下实现曲线的重绘,在绘图按钮按下之后绘出曲线图,然后将其保存在BitMap中,当OnPaint触发时将保存的图用BitBlt重绘。先在卡在保存和重绘那了,客户区啥子的搞不太清楚,很多函数都没有指定绘图区域,我也看的莫名其妙的。
VC自学还是很难啊,很多东西概念还是不清楚。

出0入0汤圆

发表于 2010-12-3 20:18:22 | 显示全部楼层
用Create或CreateEx创建窗口也是可以的,这样就不需要Attach了。

如果要提高重绘效率,保存在Bitmap里是可以的,你可以先创建一个Bitmap和MemoryDC,然后将SelectObject一下,这样就将Bitmap和MemoryDC捆绑在一起了,你在MemoryDC里的绘图就反映在Bitmap里了,那当你需要绘制时,用BitBlt从MemoryDC拷贝到窗口DC。这样当内容没变化时,每次重绘就只需要BitBlt一下就可以了。
这里面的关键就是用SelectObject将MemoryDC和Bitmap联系起来。

VC相对是比较繁杂一点,但是只要花时间,也不难的。那本《Visual C++ 技术内幕》写的还不错,你可以去看看。

出0入0汤圆

 楼主| 发表于 2010-12-3 23:08:13 | 显示全部楼层
回复【4楼】jpchen
-----------------------------------------------------------------------

我改了改还是不行,CreatEx创建的区域一团黑。先传上改过后的代码吧。身边没人学这个,我这个专业也没开这课,没老师问的。希望能帮我看看,非常非常感谢啊,周二要考试了,现在要先去复习了

点击此处下载 ourdev_602147RK6OEB.rar(文件大小:3.46M) (原文件名:MyCurve.rar)

出0入0汤圆

发表于 2010-12-6 15:57:01 | 显示全部楼层
帮你改了,有注解,你看一下。

关键是这几步:
1、CMyCurveCtrl::DrawInit里创建MemDC,创建Bitmap,然后SelectObject。
2、CMyCurveCtrl::DrawAxis和CMyCurveCtrl::DrawCurve的绘制要针对MemDC,而不是窗口DC。
3、CMyCurveCtrl::OnPaint里直接从MemDC拷贝到窗口DC。
4、注意m_Client是针对CMyCurveCtrl窗口的,所以左上角是(0,0),而不是在父窗口中的左上角坐标。
5、你里面的myLeft、myRight、myTop、myBottom也是针对CMyCurveCtrl窗口的,但是为了给坐标轴腾出空间,所以上下左右要空一些。

点击此处下载 ourdev_602720HVAU5K.rar(文件大小:51K) (原文件名:MyCurve.rar)

出0入0汤圆

 楼主| 发表于 2010-12-13 18:07:03 | 显示全部楼层
回复【6楼】jpchen
-----------------------------------------------------------------------

这段时间考试有点多,复习有点紧张,上坛子的机会少,今天特地来感谢您帮我,真的非常非常感谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-16 06:04

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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