【问题标题】:change WindowClass to full screen将 WindowClass 更改为全屏
【发布时间】:2012-09-09 08:33:18
【问题描述】:

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

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);
    }
}

【问题讨论】:

  • ChangeDisplaySettings 返回什么?它具有指示它是否成功的返回代码。其次,您是否有一个简单的 WM_PAINT 响应器,可以将屏幕绘制成明显的颜色?

标签: c++ winapi window


【解决方案1】:

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

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

同样的问题elsewhere on SO 有几个答案——但它们存在问题。相反,建议阅读 Raymond Chen 的博客文章:How do I cover the taskbar with a fullscreen window? - 他所做的任何我上面的列表之间的区别在于,他创建一个新窗口而不修改现有窗口;这实际上是一种更简洁的方法,因为这意味着您不需要处理记住/恢复旧位置的问题。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 2017-02-07
    相关资源
    最近更新 更多