Multithreading 检测窗口还原操作即将开始
最大化操作即将开始时生成Multithreading 检测窗口还原操作即将开始,multithreading,winapi,event-handling,directx,Multithreading,Winapi,Event Handling,Directx,最大化操作即将开始时生成WM_GETMINMAXINFO,最大化操作完成时生成WM_SIZE 还原操作完成时也会生成WM_SIZE 但如何检测即将开始的窗口还原操作? 我需要检测窗口即将恢复的确切时刻,而不是已经恢复的时刻。我正在开发多线程DirectX应用程序。我在专用的辅助线程中渲染。当窗口即将开始最大化或还原时,我需要更改渲染回缓冲区大小(DirectX设备Reset)。我只能从主线程调整后缓冲区的大小,所以我使用关键部分与渲染线程同步。问题是我无法中断渲染线程中的Present操作,当
WM_GETMINMAXINFO
,最大化操作完成时生成WM_SIZE
还原操作完成时也会生成WM_SIZE
但如何检测即将开始的窗口还原操作?
我需要检测窗口即将恢复的确切时刻,而不是已经恢复的时刻。我正在开发多线程
DirectX
应用程序。我在专用的辅助线程中渲染。当窗口即将开始最大化或还原时,我需要更改渲染回缓冲区大小(DirectX设备
Reset
)。我只能从主线程调整后缓冲区的大小,所以我使用关键部分
与渲染线程同步。问题是我无法中断渲染线程中的Present
操作,当最大化或还原操作即将开始时,我会等待当前Present
操作完成,然后才开始调整大小(最大化/还原)。如果更改回缓冲区大小太晚(当最大化/还原操作完成时(WM_size
message),您可能会注意到旧帧的大小错误(图像被拉伸).好吧,很高兴看到有人还在思考这些问题。这些小事情,比如在调整大小时拉伸一秒钟的图像,将外观专业的应用程序与卧室编码的应用程序区分开来
在我的旧代码中,我发现了一些可能会让您感兴趣的技巧。
首先,您可以检查WM\u SYSCOMMAND
:
case WM_SYSCOMMAND:
{
switch (wParam)
{
case SC_MAXIMIZE:
std::cout << "Going to MAXIMIZE: " << std::endl;
break;
case SC_MINIMIZE:
std::cout << "Going to MINIMIZE: " << std::endl;
break;
case SC_RESTORE:
std::cout << "Going to RESTORE: " << std::endl;
break;
default:
break;
}
return DefWindowProc(m_hWnd, msg, wParam, lParam);
}
参见实用程序函数
当我们玩得够多的时候,我们现在可以让它变得有用:
bool bFrameChanged = ((wp->flags) & SWP_FRAMECHANGED) > 0;
bool bNoCopyBits = ((wp->flags) & SWP_NOCOPYBITS) > 0;
bool bNormal = (!m_bMaximized) && (!m_bMinimized);
// from maximized
if(m_bMaximized && bFrameChanged && !bNoCopyBits)
{
std::cout << " MAXIMIZED -> NORMAL " << std::endl;
}
if (m_bMaximized && bFrameChanged && bNoCopyBits)
{
std::cout << " MAXIMIZED -> MINIMIZED " << std::endl;
}
// from normal states
if (bNormal && bFrameChanged && !bNoCopyBits)
{
std::cout << " NORMAL -> MAXIMIZED " << std::endl;
}
if (bNormal && bFrameChanged && bNoCopyBits)
{
std::cout << " NORMAL -> MINIMIZED" << std::endl;
}
// from minimized
if(m_bMinimized && bFrameChanged)
{
std::cout << " MINIMIZED -> MAXIMIZED " << std::endl;
}
if(m_bMinimized && m_bMaximized && bFrameChanged)
{
std::cout << " MINIMIZED -> MAXIMIZED " << std::endl;
}
return DefWindowProc(m_hWnd, msg, wParam, lParam);
boolbframechanged=((wp->flags)&SWP\u FRAMECHANGED)>0;
bool bNoCopyBits=((wp->flags)和SWP_NOCOPYBITS)>0;
布尔b正态=(!m_b最大化)&(!m_b最小化);
//从最大化
if(m_b最大化和&bFrameChanged和&bNoCopyBits)
{
标准::cout
bool bFrameChanged = ((wp->flags) & SWP_FRAMECHANGED) > 0;
bool bNoCopyBits = ((wp->flags) & SWP_NOCOPYBITS) > 0;
bool bNormal = (!m_bMaximized) && (!m_bMinimized);
// from maximized
if(m_bMaximized && bFrameChanged && !bNoCopyBits)
{
std::cout << " MAXIMIZED -> NORMAL " << std::endl;
}
if (m_bMaximized && bFrameChanged && bNoCopyBits)
{
std::cout << " MAXIMIZED -> MINIMIZED " << std::endl;
}
// from normal states
if (bNormal && bFrameChanged && !bNoCopyBits)
{
std::cout << " NORMAL -> MAXIMIZED " << std::endl;
}
if (bNormal && bFrameChanged && bNoCopyBits)
{
std::cout << " NORMAL -> MINIMIZED" << std::endl;
}
// from minimized
if(m_bMinimized && bFrameChanged)
{
std::cout << " MINIMIZED -> MAXIMIZED " << std::endl;
}
if(m_bMinimized && m_bMaximized && bFrameChanged)
{
std::cout << " MINIMIZED -> MAXIMIZED " << std::endl;
}
return DefWindowProc(m_hWnd, msg, wParam, lParam);