2017-02-02 8 views
0

Я смотрю на MFC SDI CView приложения на весь экран образца:Как установить CWindowImpl FullScreen в приложении WTL?

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

EDIT:

спасибо! на самом деле я нашел исходный код. (Благодаря 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); 
} 
+0

Что такое toggle_fullscreen() член? –

+0

Я попытался скомпилировать образец codecroject mfc в VS 2013, но он настолько старый, что он дает мне ошибку об unicode. –

ответ

1

Если я должен использовать SetWindowPlacement() ... функции?

Вы можете, но не обязательно. Это и SetWindowPos и ​​другие функции API - все это одно и то же: вы изменяете положение своего окна, чтобы оно полностью покрывало координаты, соответствующие конкретному монитору, и вы устанавливали окно как самое верхнее. Это создает эффект «полного экрана».

Код, который вы нашли, использует дескриптор рабочего стола и прикрепляет к нему окно в виде дочернего элемента. Это может сработать, но я бы этого не сделал - я бы создал стандартное всплывающее окно без границ и без заголовка, вместо этого без необходимости переустанавливать его. Я предпочел бы переименовать дочернее окно между «нормальным» интерфейсом и полноэкранным окном всплывающего окна.

+0

re-parent между обычным окном и созданным всплывающим окном - действительно блестящая идея! – sailfish009