为了账号安全,请及时绑定邮箱和手机立即绑定

执行程序,鼠标按客户区一下,为什么显示的是10?Invalidate不是在之前么?

执行程序,鼠标按客户区一下,为什么显示的是10?Invalidate不是在之前么?

C
大话西游666 2023-03-18 17:14:36
a是View类的一个int成员,构造函数初始化为。然后添加一个view消息:void CMy123View::OnLButtonUp(UINT nFlags, CPoint point) {// TODO: Add your message handler code here and/or call defaultthis->Invalidate();a = 10;CView::OnLButtonUp(nFlags, point);}然后Ondraw里:void CMy123View::OnDraw(CDC* pDC){CMy123Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCString s;s.Format("%d", a);pDC->TextOut(10, 10, s);}a是View里面的一个成员啊.......构造函数初始化为0!!如果在InInvalidate()后再加一句AfxMessageBox("fdasfdsafas");就可以看见输出0了,说明AfxMessageBox会调用updatewindow?
查看完整描述

2 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

因为你的a是在函数外部定义的,在鼠标点击之前就已经给它赋值了。

查看完整回答
反对 回复 2023-03-21
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

Invalidate只是给View的消息队列中加入一个WM_PAINT消息,然后立即继续下面的语句(包括a=10;这句)。View响应WM_PAINT消息调用OnDraw的时机由其消息队列的处理方式决定,通常会在WM_LBUTTONUP响应结束之后(即OnLButtonUp结束之后)。
如果需要立即重绘,请使用UpdateWindow函数。 

补充:
不清楚Windows内部是如何处理AfxMessageBox的。如果你用弹出的消息框挡住了客户区文字部分,然后关闭消息框,确实有可能调用UpdateWindow。

查看完整回答
反对 回复 2023-03-21
  • 2 回答
  • 0 关注
  • 67 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信