通常我发现在头文件和实现文件中定义东西更麻烦,当它工作正常时也可以在头文件中编写实现.通常以这种方式进行的原因是什么?
我有一个非常具体的问题,涉及我的应用程序中的无模式对话框.
该对话框冻结,并且对我的应用程序中的其他功能发送给它的任何消息都没有响应.有趣的是,我的调试告诉我,当对话程序收到大约5000条未处理的消息时,它会冻结.我能想到的唯一解释是Windows消息队列可能已满,并且或多或少地证实了通过对话框的消息流似乎非常低调.
现在 - 我之前从未使用过与普通主窗口相关的对话框,因此我可能会进行非法移动.我的意思是我通过使用SendMessage或SetWindowText函数发送特定的控件消息来直接更新对话框的控件(静态文本和列表框).
我认为奇怪的是,这种技术在5000条消息通过之前完美运行.
主循环通过父窗口句柄和使用IsDialogMessage函数向对话框发送消息.
主窗口和对话框仍然会收到消息,但对话框会冻结.
有没有办法让我手动清空消息队列或检查当前的卷以检查是否实际上是问题?我使用PeekMessage函数来检索我的消息,根据MSDN,它应该从消息队列的底部删除一条消息.
这是我如何实现我的主循环(我很确定它是完全合法的):
while (true) //while there is a message
{
//if there was a windows message
if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
{
if ( msg.message == WM_QUIT ) //if the message was WM_QUIT
return 0; //Exit the message loop
if ( !IsDialogMessage( m_StatusHwnd, &msg ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
else
{
advanceFrame();
}
}
Run Code Online (Sandbox Code Playgroud)
我真的希望你们中的一个人知道出了什么问题,因为这真的很难调试!
Dialog过程实现如下:(抱歉你必须看到我的实际代码)
首先,静态对话框过程将消息重定向到自定义方法:
BOOL CALLBACK …Run Code Online (Sandbox Code Playgroud)