OnPaint()没有执行

alexander_david 2011-01-13 08:46:21
我从CWnd派生了一个类,然后Create, ShowWindow, UpdateWindow,按理说这个时候这个窗口的OnPaint()已经被执行了吧,然后我执行这个类的另外一个函数fun_A,但是奇怪的是,这个函数fun_A出错,因为OnPaint()没有被执行(我在OnPaint中做了fun_A函数必须的一些操作)。


我分别在OnPaint()和fun_A设置断点,结果也是先进fun_A的断点。


各位高人,请教这个是怎么回事?
...全文
960 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
li213y 2012-07-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
引用 5 楼 alexander_david 的回复:
执行次序:

Create
ShowWindow
UpdateWindow
fun_A

OnPaint中的初始化是没有问题的。难倒问题出在上面的Create/showwindow/updatewindow?
另外加了invalidate()也不管用。

谢谢各位回复。


照你这么说,那就不是 OnPain()不……
[/Quote]
别人的问题你先搞清楚,是没进入onpain(),里面程序对不对跟着没关系了
alexander_david 2011-01-13
  • 打赏
  • 举报
回复
谢谢各位回复。

我创建CMYWnd时的位置超过了父窗口的客户区,导致OnPaint没有调用。重新修改位置在父窗口的客户区,正常了。因为我并不需要真正在父窗口中直接显示我的CMYWnd窗口,所以忽略了这个位置参数。

非常感谢各位。
HuWenjin 2011-01-13
  • 打赏
  • 举报
回复
估计:

主程序中 使用了WINDOWS的特殊函数,ALPHA混合,得到半透明的窗口。

在这种情况下,OnPaint在函数调用后失效。
alexander_david 2011-01-13
  • 打赏
  • 举报
回复
我估计和这个程序环境有关。因为我创建的窗口还是有些特殊的,我自己再找找原因。谢谢各位。
alexander_david 2011-01-13
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 tandyt 的回复:]
引用 11 楼 alexander_david 的回复:
引用 8 楼 tandyt 的回复:
引用 5 楼 alexander_david 的回复:
执行次序:

Create
ShowWindow
UpdateWindow
fun_A

OnPaint中的初始化是没有问题的。难倒问题出在上面的Create/showwindow/updatewindow?
另外加了inva……
[/Quote]

to15楼:
我在CMYWnd类中设置一个BOOL OnPaintExecuted,在CMYWnd构造函数内初始化为false,在OnPaint()中修改为true。然后在fun_A中设置断点,此时获取的OnPaintExecuted仍然是0。

因此,可以确认的是这个OnPaint没有执行。

谢谢回复。谢谢各位热心。
alexander_david 2011-01-13
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zhanshen2891 的回复:]
你先把你那个func_A去掉,先看一下OnPaint是否执行了?
[/Quote]

也不进去。在OnPaint()设断点,也进不去。
TandyT 2011-01-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 alexander_david 的回复:]
引用 8 楼 tandyt 的回复:
引用 5 楼 alexander_david 的回复:
执行次序:

Create
ShowWindow
UpdateWindow
fun_A

OnPaint中的初始化是没有问题的。难倒问题出在上面的Create/showwindow/updatewindow?
另外加了invalidate()也不管用。

谢谢各位回复。


……
[/Quote]
你是在OnPain()之前调用 fun_A
函数的,还是在OnPain() 之后调用的啊?
照你说的,那就是在OnPain()之前调用 fun_A 函数的了?那这样肯定不能正常工作啊,因为你都还没初始化就调用 fun_A 了、、、、

我觉得你还是测试下你那个 OnPain() 函数到底有没有执行。 很简单的啊,你在OnPain() 里设置个变量,然后赋值 ,然后判断这个值,如果是你刚才赋值的结果,就弹出个消息框。 而如果没弹出消息框,那说明则个OnPain() 函数并没有执行。。。。。。

我也是菜鸟,一起学习,哈哈
varding 2011-01-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 alexander_david 的回复:]

引用 8 楼 tandyt 的回复:
引用 5 楼 alexander_david 的回复:
执行次序:

Create
ShowWindow
UpdateWindow
fun_A

OnPaint中的初始化是没有问题的。难倒问题出在上面的Create/showwindow/updatewindow?
另外加了invalidate()也不管用。

谢谢各位回复。


……
[/Quote]

添加一个BOOL变量初始为FALSE,在Onpaint里设置成TRUE,fun_A里检测到这个变量为FALSE直接退出,这样就能进OnPaint断点了
zhanshen2891 2011-01-13
  • 打赏
  • 举报
回复
你先把你那个func_A去掉,先看一下OnPaint是否执行了?
alexander_david 2011-01-13
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xujian8919 的回复:]
是消息的问题啊
[/Quote]

不好意思,有没有简单的方法跟踪消息,如果没有,那么我就看书了。vc菜鸟,请多包涵。
alexander_david 2011-01-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 tandyt 的回复:]
引用 5 楼 alexander_david 的回复:
执行次序:

Create
ShowWindow
UpdateWindow
fun_A

OnPaint中的初始化是没有问题的。难倒问题出在上面的Create/showwindow/updatewindow?
另外加了invalidate()也不管用。

谢谢各位回复。


照你这么说,那就不是 OnPain()不……
[/Quote]

如果我在OnPaint()中设置断点是无法进入的,因为程序首先进入fun_A,然后就崩溃了,我跟踪崩溃的原因是一些应该在OnPaint()中初始化的一些变量没有初始化。
并且在OnPaint()和fun_A同时设断点,则首先进入fun_A,但进入fun_A后就崩溃。

谢谢回复。
xujian8919 2011-01-13
  • 打赏
  • 举报
回复
是消息的问题啊
alexander_david 2011-01-13
  • 打赏
  • 举报
回复
在类的头文件中定义:
public:
afx_msg void OnPaint();
在源文件中有:
BEGIN_MESSAGE_MAP(CMYWnd, CWnd)
ON_WM_PAINT()
ON_WM_SIZE()
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()

然后就是文件的定义了:
void CMYWnd::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CWnd::OnPaint()
...
}
TandyT 2011-01-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 alexander_david 的回复:]
执行次序:

Create
ShowWindow
UpdateWindow
fun_A

OnPaint中的初始化是没有问题的。难倒问题出在上面的Create/showwindow/updatewindow?
另外加了invalidate()也不管用。

谢谢各位回复。
[/Quote]

照你这么说,那就不是 OnPain()不执行了,而是你在OnPain() 里的初始化那些语句不正常工作,你可以单步调试下看看到底哪步没有正常执行
alexander_david 2011-01-13
  • 打赏
  • 举报
回复
跟踪create和showwindow返回值都是成功的。这个可真的是奇怪了。
alexander_david 2011-01-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tigermaydo 的回复:]
ON_WM_PAINT()添加消息了么
[/Quote]

也添加了。
alexander_david 2011-01-13
  • 打赏
  • 举报
回复
执行次序:

Create
ShowWindow
UpdateWindow
fun_A

OnPaint中的初始化是没有问题的。难倒问题出在上面的Create/showwindow/updatewindow?
另外加了invalidate()也不管用。

谢谢各位回复。
tigerMayDo 2011-01-13
  • 打赏
  • 举报
回复
ON_WM_PAINT()添加消息了么
TandyT 2011-01-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 alexander_david 的回复:]
我从CWnd派生了一个类,然后Create, ShowWindow, UpdateWindow,按理说这个时候这个窗口的OnPaint()已经被执行了吧,然后我执行这个类的另外一个函数fun_A,但是奇怪的是,这个函数fun_A出错,因为OnPaint()没有被执行(我在OnPaint中做了fun_A函数必须的一些操作)。


我分别在OnPaint()和fun_A设置断点,结果也是先进fu……
[/Quote]

你整个程序运行正常的话,应该是OnPain()先执行的吧?你确定你在OnPain()函数里的初始化没问题?你可以搞个简单的测试,比如,在OnPain() 里给一个全局变量赋值,然后,你在其它地方读取这个全局变量的值,看看是否就是你在 OnPain() 里赋值的结果,如果这个赋值正常,那说明这个OnPain() 应该是正常调用的了。
那就是你那些初始化的程序可能有问题,或者是那些初始化的程序,对其他的部分有依赖,由于依赖的部分没正常执行,所以你这个初始化也不能正常初始化了。
zyyoung 2011-01-13
  • 打赏
  • 举报
回复
invalidate
加载更多回复(1)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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