2010-05-21 81 views
1

这是一个更具体的问题,与我以前的问题有关。C++ - 对话框问题

我有一个使用计时器的应用程序。代码以我的WM_TIMER处理程序调用DialogBoxParam(...)以及一些自定义消息处理程序(我们称之为DlgProc)的方式编写。

这在一定程度上做了以下的方法:

情况下WM_TIMER: {// 常规,显示一个特殊的消息框 DisplayMessageBox(...); return 0; }

现在,如果我做DlgProc处理这样的消息(见代码),这将导致吨的对话框(每WM_TIMER调用一个)。

switch (msg) 
    { 
    case WM_INITDIALOG: 
     // (...) 
     return TRUE; 
    case WM_COMMAND: 
     // (...) 
     return TRUE; 
    return FALSE; 
    } 

但是,如果我添加一个虚拟WM_PAINT处理器(return TRUE;)我DlgProc,这导致所示对话框和100%的CPU负载(那是因为我收到吨WM_PAINT消息)只有一个。

问:

有什么可以在这里完成,如果我想我的应用程序,以显示只有一个对话框,并有WM_PAINT处理无CPU负载? (我的意思是,有类似的行为绘制独特的对话框,并完全暂停父窗口)

此外,如果有人解释究竟是什么在这种情况下发生这将是伟大的,为什么我收到WM_PAINT消息gazillions到我的对话框,为什么他们的处理(return TRUE)导致防止其他对话框创建。

谢谢。

+0

你叫DefDlgProc某处您的代码 – 2010-05-21 13:13:44

回答

3

1)如果您只想显示一个对话框,应该在捕获到第一个WM_TIMER信号后禁用定时器。你可以使用KillTimer()来做到这一点。

2)Windows想让GUI保持最新状态。只要屏幕上的某个区域应该更新,就会使用InvalidateRect或InvalidateRgn无效。现在,对于每个“无效”屏幕部分,调用WM_PAINT以便再次生成“有效”。

如果你不这样做(或只是其中的一部分),Windows将再次调用WM_PAINT ...并再次调用WM_PAINT。一种方法是致电ValidateRect。在很多情况下,BeginPaint()和EndPaint()用于完成这项工作。

3)也许最重要的是:你不应该只是返回FALSE!尝试Windows的DefWindowProc()和对话框的DefDlgProc()。他们也将适当地照顾WM_PAINT。

+0

切勿从对话框过程中调用DefDlgProc。 DefDlgProc是调用DialogProc的对话框WINDOW proc。 – 2010-05-22 15:28:10

0

这并不是说你WM_PAINT注册,有事必须使它(即使你不添加WM_PAINT:处理),寻找RE /绘制函数(如InvalidateRect())