Skip to content

Instantly share code, notes, and snippets.

@zamabuvaraeu
Last active June 8, 2026 00:01
Show Gist options
  • Select an option

  • Save zamabuvaraeu/169b0e05a80cd9c5150776a502a18765 to your computer and use it in GitHub Desktop.

Select an option

Save zamabuvaraeu/169b0e05a80cd9c5150776a502a18765 to your computer and use it in GitHub Desktop.
Полноэкранный режим и обратно

Как переключить окно между обычным и полноэкранным режимами?

Фредерик Дельхом хотел узнать, существует ли простой пример кода, который переключает приложение из оконного режима в полноэкранный . Затем он приложил фрагмент кода, который выполнял довольно странные действия с родительскими окнами, а также с их скрытием и отображением.

Вы всё усложняете гораздо больше, чем нужно. Давайте начнём с нашей программы на 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, который указывает менеджеру окон пересчитать элементы оформления окна (что нам необходимо, поскольку мы только что их изменили).

При возвращении из полноэкранного режима мы просто отменяем то, что сделали при переходе в полноэкранный режим: восстанавливаем подпись и другие элементы оформления окна и возвращаем его в исходное состояние.

Вот и всё. Вам не нужно делать ничего особенного, чтобы панель задач «убралась с экрана»; панель задач распознаёт, когда приложение переходит в полноэкранный режим, и убирается самостоятельно.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment