1

所以我试图让我的窗口类全屏,但它不工作,它只是闪烁黑色然后它不会变成全屏这里是源代码: -

void InitEngine::Init(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd, DesktopScreenInfo * ScreenInfo, LPSTR WindowName)
{
    mWindoClass = new WNDCLASSEX();
    ZeroMemory(mWindoClass,sizeof(WNDCLASSEX));
    if(ScreenInfo) mScreenInfo = ScreenInfo;
    else mScreenInfo = &DesktopScreen::GetScreenInfo();

    mWindoClass->cbSize        = sizeof(WNDCLASSEX);// window size
    mWindoClass->style         = CS_HREDRAW | CS_VREDRAW; // so it draw when Horizontal or Vertical change
    mWindoClass->lpfnWndProc   = WindowProc;
    mWindoClass->hInstance     = hInstance;
    mWindoClass->hCursor       = LoadCursor(NULL, IDC_ARROW); //load normal cursor
    mWindoClass->hbrBackground = (HBRUSH)COLOR_WINDOW;
    mWindoClass->lpszClassName = "PoPEngineClass";

    DEVMODE screen;
    memset(&screen,0,sizeof(screen));
    screen.dmSize = sizeof(screen);
    screen.dmPelsWidth = mScreenInfo->Width;
    screen.dmPelsHeight = mScreenInfo->Height;
    screen.dmBitsPerPel = mScreenInfo->ScreenDepth;
    screen.dmDisplayFrequency = mScreenInfo->FrameRate;
    screen.dmFields = DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
    ChangeDisplaySettings(&screen, CDS_FULLSCREEN);

    RegisterClassEx(mWindoClass);

    WindowHandel = CreateWindowEx(NULL , mWindoClass->lpszClassName , WindowName , WS_POPUP, 0 , 0, mScreenInfo->Width, mScreenInfo->Height, NULL, NULL, hInstance, NULL);
    ShowWindow(WindowHandel, nShowCmd);
    UpdateWindow(WindowHandel);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}
4

1 回答 1

0

ChangeDisplaySettings 实际上并没有使窗口全屏 - 尽管标志的名称可能具有误导性。要使窗口全屏显示,您基本上必须自己做很多工作:

  • 记住旧位置
  • 更改窗口样式以删除边框和标题栏
  • 获取屏幕大小,设置窗口的新位置以覆盖屏幕
  • 并将其放在其他窗口的顶部(后两个您可以使用 SetWindowPos 调用来完成。)

在 SO 的其他地方有几个相同问题的答案——但它们存在问题。相反,建议阅读 Raymond Chen 的博客文章:如何用全屏窗口覆盖任务栏?- 他所做的任何我上面的列表之间的区别在于他正在创建一个新窗口而不修改现有窗口;这实际上是一种更简洁的方法,因为这意味着您不需要处理记住/恢复旧位置的问题。

ChangedisplaySetting 的CDS_FULLSCREEN标志有不同的含义:调用是用于更改显示模式设置,而不是使窗口全屏;但是该标志告诉窗口模式更改是暂时的,因此不应保存。例如,如果以特定分辨率播放视频的应用程序正在全屏播放,它可能想要更改实际屏幕分辨率以匹配视频,但只要它是全屏的。或者 OpenGL 游戏或类似游戏可能会使用它来确保它以特定分辨率全屏运行。所以它的真正意思是“将显示设置更改为这些,但我这样做只是因为我要全屏显示,所以不要永久更改”。Raymond Chan在他的博客上写了更多关于这个标志的信息。. 如果您不关心屏幕分辨率设置,并且只想让窗口占据所有屏幕区域,则不需要此调用。

于 2012-09-09T22:25:05.333 回答