DX9从全屏切换到窗口给出错误的客户区
Posted
技术标签:
【中文标题】DX9从全屏切换到窗口给出错误的客户区【英文标题】:DX9 switching from full screen to window give wrong client area 【发布时间】:2017-09-01 08:07:06 【问题描述】:我的 dx9 应用程序有点问题。 当我使用客户区域下方的代码从全屏切换回窗口模式时,大小不合适,它更小。 AdjustWindowRect 函数正在正确执行其任务,但 SetWindowPos 未设置正确的窗口大小。也许我错过了一些东西。任何想法。
if (d3dpp.Windowed && resChoice == resolutionchoice) return false; // already in window mode and same resolution
//MessageBox(NULL, L"switching to window", L"ERROR", MB_OK);
resChoice = resolutionchoice;
screenWidth = resolutionwidth[resChoice];
screenHeight = resolutionheight[resChoice];
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; // set the back buffer format to 32-bit
d3dpp.BackBufferWidth = screenWidth; // set the width of the buffer
d3dpp.BackBufferHeight = screenHeight; // set the height of the buffer
d3dpp.Windowed = true;
SetWindowLong(hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW); // WS_CAPTION | WS_SYSMENU | WS_VISIBLE | WS_MINIMIZEBOX );
// need to call SetWindowPos as well
string values;
RECT r = 0,0,screenWidth,screenHeight ;
AdjustWindowRect(&r, WS_OVERLAPPEDWINDOW, false);
values = std::to_string(r.left);
OutputDebugStringA("Adjust area = ");
OutputDebugStringA(values.c_str()); OutputDebugStringA(",");
values = std::to_string(r.top);
OutputDebugStringA(values.c_str()); OutputDebugStringA(",");
values = std::to_string(r.right);
OutputDebugStringA(values.c_str()); OutputDebugStringA(",");
values = std::to_string(r.bottom);
OutputDebugStringA(values.c_str()); OutputDebugStringA("\n");
SetWindowPos(hWnd, HWND_TOP, r.left, r.top, r.right - r.left , r.bottom - r.top, SWP_NOZORDER | SWP_SHOWWINDOW | SWP_FRAMECHANGED);//
//screenWidth = SCREEN_WIDTH;
//screenHeight = SCREEN_HEIGHT;
//windowXscale = 1;
//windowYscale = 1;
GetClientRect(hWnd, &r);
values = std::to_string(r.left);
OutputDebugStringA("Client area = ");
OutputDebugStringA(values.c_str()); OutputDebugStringA(",");
values = std::to_string(r.top);
OutputDebugStringA(values.c_str()); OutputDebugStringA(",");
values = std::to_string(r.right);
OutputDebugStringA(values.c_str()); OutputDebugStringA(",");
values = std::to_string(r.bottom);
OutputDebugStringA(values.c_str()); OutputDebugStringA("\n");
【问题讨论】:
您必须在切换后通过调用重置来重置设备。在调用 SetWindowPos 之前尝试调用 SetWindowLongPtr 很清楚重置设备。这是在其他地方完成的,SetWindowLong 和 SetWindowPos 一样被调用。问题是为什么窗口没有正确的客户区。 【参考方案1】:经过一番搜索发现,如果你使用 SetWindowPos 并尝试制作比桌面更大的窗口,或者在这种情况下从全屏返回时,窗口会发送消息并自动调整窗口大小以使它不大于当前桌面大小。
在 SetWindowPos api 调用中添加 SWP_NOSENDCHANGING 标志可以阻止这种情况的发生,并且客户端大小将是您想要的。
【讨论】:
以上是关于DX9从全屏切换到窗口给出错误的客户区的主要内容,如果未能解决你的问题,请参考以下文章
MPMoviePlayerController:无法从全屏切换到嵌入式
如何检测 UITableView 上的“快速触摸”以切换到/从全屏?
来自全窗口游戏的 C++ DirectX CreateDevice