sponge 发表于 2010-11-30 20:48:09

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

自己定义了一个绘图的类,用ClassWizard对其添加了WM_PAINT消息响应函数,在OnPaint中写入MessageBox不会弹出,在里面打了断点单步调试也进不去,而这些操作在主对话框里都执行正常,不知道是哪里出了问题,送上源码,希望高手们能帮我解答下

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

曲线是可以绘制了的,就是想在自定义类里响应重绘
http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_601500CW3VKL.png
(原文件名:QQ截图未命名.png)

sponge 发表于 2010-12-1 09:18:07

有没有人帮帮我啊

jpchen 发表于 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的类,那些什么初始化、绘图之类的都写成函数,在主对话框的各种函数里调用即可。

sponge 发表于 2010-12-2 19:33:36

回复【2楼】jpchen
-----------------------------------------------------------------------

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

jpchen 发表于 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++ 技术内幕》写的还不错,你可以去看看。

sponge 发表于 2010-12-3 23:08:13

回复【4楼】jpchen
-----------------------------------------------------------------------

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

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

jpchen 发表于 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)

sponge 发表于 2010-12-13 18:07:03

回复【6楼】jpchen
-----------------------------------------------------------------------

这段时间考试有点多,复习有点紧张,上坛子的机会少,今天特地来感谢您帮我,真的非常非常感谢
页: [1]
查看完整版本: VC下自定义类不响应WM_PAINT消息怎么办?