CAD中非模态对话框内容被擦除

对话框内容不显示原因是对话框失效后内容不显示。

1. 解决方案:光标焦点设置和对话框失效重绘

第一步, 解决光标使得对话框失效。如果不刷新,当前光标焦点离开非模态对话框后,对话框会处于失效状态。既然这样,可以在当前光标离开对话框后,仍然把对话框设置成当前焦点。

在宏BEGIN_MESSAGE_MAP(class,baseClass) 和 宏END_MESSAGE_MAP()中间定义WM_ACAD_KEEPFOCUS消息映射

ON_MESSAGE(WM_ACAD_KEEPFOCUS, OnAcadKeepFocus)

定义消息函数

afx_msg LRESULT OnAcadKeepFocus(WPARAM wParam, LPARAM lParam);

实现

//当前光标
POINT pt;
::GetCursorPos(&pt);
//控件相对与对话框或者(设备屏幕)的坐标大小,即整个对话框大小
CRect rect;
::GetWindowRect(this->m_hWnd, rect);

再比较pt是否在rect范围内,在返回TRUE,不在返回FALSE
..

第二步,解决程序切换后对话框失效。该情况需要重绘窗口
使用ON_WM_SIZE 和 ON_WM_PAINT消息

ON_WM_SIZE()
ON_WM_PAINT()
// 在OnSize函数中重绘RedrawWindow(); 
afx_msg void OnSize(UINT nType, int cx, int cy);
//在OnPaint函数中重绘UpdateWindow() -- 失效才会重绘
afx_msg void OnPaint();

2. RedrawWindow和RedrawWindow的区别

InvalidateRect(NULL); //设置无效区 和 UpdateWindow(); //立即刷新
与 RedrawWindow()等价。

如果不调用 InvalidateRect就调用 UpdateWindow,那么UpdateWindow什么都不做。
如果调用 InvalidateRect 后不调用UpdateWindow,则系统会自动在窗口消息队列为空的时候,系统自动发送WM_PAINT消息。
调用UpdateWindow()时将会发送一个WM_PAINT消息,而应用程序在接收到WM_PAINT消息后,将自动地调用Invalidate()。
UpdateWindow()就是立即发送WM_PAINT消息,updateWindow要求系统对区域进行立即重绘,其只对声明为无效的区域起作用,而Invalidate()是声明无效区域的方式之一。
Invalidate()表示客户区域无效,在下次WM_PAINT发生时重绘。
而WM_PAINT是由系统进行维护的,每当CWnd的更新区域不为空,并且在应用程序的窗口消息队列中没有其它消息时,Windows就发送一条WM_PAINT消息。
Invalidat最后也是调用InvalidatRect。
RedrawWindow()则是具有Invalidate()和UpdateWindow()的双特性。声明窗口的状态为无效,并立即更新窗口,立即调用WM_PAINT消息处理。

RedrawWindow 强制刷新,会调用WM_PAINT,但如果你强制刷新的部分不存在就不会调用WM_PAINT。若不带任何参数,则本窗口全部刷新。

3. 隐患

在基类消息中函数OnPaint()调用updatewindow(),会使得子类对话框DoModel()不置顶显示
参考: https://blog.csdn.net/francisapp/article/details/52764117

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值