Фредерик Дельхом хотел узнать, существует ли простой пример кода, который переключает приложение из оконного режима в полноэкранный . Затем он приложил фрагмент кода, который выполнял довольно странные действия с родительскими окнами, а также с их скрытием и отображением.
Вы всё усложняете гораздо больше, чем нужно. Давайте начнём с нашей программы на Scratch и внесем следующие изменения:
Private Sub MainForm_OnLButtonUp( _
ByVal self As MainForm Ptr, _
ByVal hWin As HWND _
)
Dim dwStyle As DWORD = GetWindowLongPtr(hWin, GWL_STYLE)
Dim dwExStyle As DWORD = GetWindowLongPtr(hWin, GWL_EXSTYLE)
If dwStyle And WS_OVERLAPPEDWINDOW Then
' FullScreen mode
Dim mi As MONITORINFO = Any
mi.cbSize = SizeOf(MONITORINFO)
Dim resPacement As WINBOOL = GetWindowPlacement(hWin, @self->wndPlacement)
Dim hMon As HMONITOR = MonitorFromWindow(hWin, MONITOR_DEFAULTTONEAREST)
Dim resInfo As WINBOOL = GetMonitorInfo(hMon, @mi)
If resPacement And resInfo Then
Dim dwNewStyle1 As DWORD = dwStyle And Not(WS_OVERLAPPEDWINDOW)
' Dim dwNewStyle2 As DWORD = dwNewStyle1 Or WS_POPUP
Dim dwNewExStyle As DWORD = dwExStyle And Not(WS_EX_OVERLAPPEDWINDOW)
SetWindowLongPtr( _
hWin, _
GWL_STYLE, _
dwNewStyle1 _
)
SetWindowLongPtr( _
hWin, _
GWL_EXSTYLE, _
dwNewExStyle _
)
SetWindowPos( _
hWin, _
HWND_TOP, _
mi.rcMonitor.left, _
mi.rcMonitor.top, _
mi.rcMonitor.right - mi.rcMonitor.left, _
mi.rcMonitor.bottom - mi.rcMonitor.top, _
SWP_NOOWNERZORDER Or SWP_FRAMECHANGED _
)
End If
Else
' Windowed mode
' Dim dwNewStyle1 As DWORD = dwStyle And Not(WS_POPUP)
Dim dwNewStyle2 As DWORD = dwStyle Or WS_OVERLAPPEDWINDOW
Dim dwNewExStyle As DWORD = dwExStyle Or WS_EX_OVERLAPPEDWINDOW
SetWindowLongPtr( _
hWin, _
GWL_STYLE, _
dwNewStyle2 _
)
SetWindowLongPtr( _
hWin, _
GWL_EXSTYLE, _
dwNewExStyle _
)
SetWindowPlacement( _
hWin, _
@self->wndPlacement _
)
SetWindowPos( _
hWin, NULL, 0, 0, 0, 0, _
SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOZORDER Or SWP_NOOWNERZORDER Or SWP_FRAMECHANGED _
)
End If
End SubЧтобы избежать сложностей с горячими клавишами и сочетаниями клавиш, я решил переключаться в полноэкранный режим по щелчку мыши. Когда кнопка поднимается, мы проверяем, находимся ли мы в обычном или полноэкранном режиме, анализируя стили окна. Если мы в обычном режиме, мы сохраняем текущее расположение окна и получаем размеры текущего монитора. И затем происходит волшебство: мы удаляем заголовок и другие элементы оформления из стиля окна и перемещаем окно так, чтобы оно занимало весь монитор. Важный флаг, который нужно передать здесь, — это SWP_FRAMECHANGED, который указывает менеджеру окон пересчитать элементы оформления окна (что нам необходимо, поскольку мы только что их изменили).
При возвращении из полноэкранного режима мы просто отменяем то, что сделали при переходе в полноэкранный режим: восстанавливаем подпись и другие элементы оформления окна и возвращаем его в исходное состояние.
Вот и всё. Вам не нужно делать ничего особенного, чтобы панель задач «убралась с экрана»; панель задач распознаёт, когда приложение переходит в полноэкранный режим, и убирается самостоятельно.