如何在 WTL 应用程序中设置 CWindowImpl FullScreen?

Posted

技术标签:

【中文标题】如何在 WTL 应用程序中设置 CWindowImpl FullScreen?【英文标题】:How to set CWindowImpl FullScreen in WTL application? 【发布时间】:2017-06-18 23:35:17 【问题描述】:

我正在查看 MFC SDI Cview 全屏示例应用程序:

https://www.codeproject.com/Articles/9632/Views-in-Full-Screen-Mode

我用 WTL 应用程序测试全屏设置源代码,但它不起作用。

我应该使用 SetWindowPlacement()/GetWindowPlacement() 函数吗?

void toggle_fullscreen()

  if (b_fullscreen == false)
  
    b_fullscreen = true;
    save_window = this->GetParent();
    const HWND hwnd = GetDesktopWindow();
    this->SetParent(hwnd);
    RECT rect;
    ::GetWindowRect(hwnd, &rect);
    //m_view.SetWindowPos(hwnd, rect.left, rect.top, rect.right, rect.bottom, SWP_SHOWWINDOW);
    //m_view.SetWindowPos(HWND_TOPMOST, 0, 0, 4096, 2000, SWP_SHOWWINDOW);
    //m_view.ShowWindow(SW_MAXIMIZE);
    this->SetWindowPos(HWND_TOPMOST, 0, 0, 1920, 1080, SWP_SHOWWINDOW);
  
  else
  
    b_fullscreen = false;
    //m_view.SetParent(save_window);
    this->SetParent(save_window);
  

编辑:

谢谢!实际上我找到了源代码。 (感谢 Czarek Tomczak)

Win32: full-screen and hiding taskbar

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)

  switch (msg)
  
  case WM_CLOSE:
    DestroyWindow(hwnd);
    break;
  case WM_RBUTTONDOWN:
    printf("full screen\n");
    break;
  case WM_DESTROY:
    PostQuitMessage(0);
    break;
  default:
    return DefWindowProc(hwnd, msg, wParam, lParam);
  
  return 0;


HWND CreateFullscreenWindow(HWND hwnd)
 

  WNDCLASSEX wc;
  wc.cbSize = sizeof(WNDCLASSEX);
  wc.style = 0;
  wc.lpfnWndProc = WndProc;
  wc.cbClsExtra = 0;
  wc.cbWndExtra = 0;
  wc.hInstance = (HINSTANCE)::GetModuleHandle(NULL); 
  wc.hIcon = NULL;
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  wc.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1); // (HBRUSH)(COLOR_WINDOW + 1);
  wc.lpszMenuName = NULL;
  wc.lpszClassName = L"fullscreen";
  wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
  RegisterClassEx(&wc);

 HMONITOR hmon = MonitorFromWindow(hwnd,
                                   MONITOR_DEFAULTTONEAREST);
 MONITORINFO mi =  sizeof(mi) ;
 if (!GetMonitorInfo(hmon, &mi)) return NULL;
 return CreateWindowEx(NULL,
       TEXT("fullscreen"),
       TEXT(""),
       WS_POPUP | WS_VISIBLE,
       mi.rcMonitor.left,
       mi.rcMonitor.top,
       mi.rcMonitor.right - mi.rcMonitor.left,
       mi.rcMonitor.bottom - mi.rcMonitor.top,
       hwnd, NULL, wc.hInstance, 0);

【问题讨论】:

toggle_fullscreen() 是什么成员? 我尝试在 VS 2013 中编译 codeproject mfc 示例,但它太旧了,它给我一个关于 unicode 的错误。 【参考方案1】:

我应该使用 SetWindowPlacement()... 函数吗?

你可以,但你不必。这个和 SetWindowPos 和其他 API 函数都是一样的:你修改窗口的位置,使其完全覆盖特定监视器对应的坐标,并将窗口设置为最顶层。这会产生“全屏效果”。

您找到的代码使用桌面窗口句柄并将您的窗口作为子窗口停靠在它上面。这可能可行,但我不会这样做 - 我将创建一个标准的弹出窗口,无边框和无标题,而不需要重新设置它。我宁愿在“普通”用户界面和全屏弹出框架帮助窗口之间重新设置子窗口。

【讨论】:

在普通窗口和创建的弹出窗口之间重新设置父级真是绝妙的主意!

以上是关于如何在 WTL 应用程序中设置 CWindowImpl FullScreen?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中设置 libsvm?

如何在 C# 中的控制台应用程序中设置鼠标光标的位置?

如何在 nativescript 中设置方向

如何在 Android 应用中设置全息黑暗主题?

如何在黑莓应用程序中设置备用入口点?

如何在 springboot graphql 应用程序中设置基本 url