@WYCOR

Использование Direct2D В FullScreen?

Собственно как?


На каком то сайте читал что сам Direct2D в полноэкранный режим переводить не умеет, поэтому надо использовать либо возможности WinAPI, либо direct3d.

Нагуглил код для перевода в фуллскрин:
void SetFullScreenMode(HWND hwnd)
{
  static WINDOWPLACEMENT g_wpPrev = { sizeof(g_wpPrev) };
  DWORD dwStyle = GetWindowLong(hwnd, GWL_STYLE);
  if (dwStyle & WS_OVERLAPPEDWINDOW) {
    MONITORINFO mi = { sizeof(mi) };
    if (GetWindowPlacement(hwnd, &g_wpPrev) &&
        GetMonitorInfo(MonitorFromWindow(hwnd,
                       MONITOR_DEFAULTTOPRIMARY), &mi)) {
      SetWindowLong(hwnd, GWL_STYLE,
                    dwStyle & ~WS_OVERLAPPEDWINDOW);
      SetWindowPos(hwnd, HWND_TOP,
                   mi.rcMonitor.left, mi.rcMonitor.top,
                   mi.rcMonitor.right - mi.rcMonitor.left,
                   mi.rcMonitor.bottom - mi.rcMonitor.top,
                   SWP_NOOWNERZORDER | SWP_FRAMECHANGED);
    }
  } else {
    //Перевод обратно в оконный режим
  }
}



И все бы замечательно, но в полноэкранном режиме перестает работать следующий код direct2d
ID2D1Factory* pD2DFactory = NULL;
	HRESULT hr = D2D1CreateFactory(
    D2D1_FACTORY_TYPE_SINGLE_THREADED,
    &pD2DFactory);		
		
	// Obtain the size of the drawing area.
	RECT rc;
	GetClientRect(hWnd, &rc);

	// Create a Direct2D render target			
	ID2D1HwndRenderTarget* pRT = NULL;			
	 hr = pD2DFactory->CreateHwndRenderTarget(
		D2D1::RenderTargetProperties(),
		D2D1::HwndRenderTargetProperties(
			hWnd,
			D2D1::SizeU(
				rc.right - rc.left,
				rc.bottom - rc.top)),
    &pRT);
	//Create a Brush
	ID2D1SolidColorBrush* pBlackBrush = NULL;
	if (SUCCEEDED(hr))
	{
  			
    pRT->CreateSolidColorBrush(
        D2D1::ColorF(D2D1::ColorF::Black),
        &pBlackBrush
        ); 
	}


А именно SUCCEEDED(hr) возвращает false(иначе говоря CreateHwndRenderTarget() возвращает ошибку).

При переходе обратно в оконный режим все опять работает.

P.S. С WinAPI, direct2d только знакомлюсь, т.ч. если можно объяснение максимально простым языком.
  • Вопрос задан
  • 3821 просмотр
Пригласить эксперта
Ответы на вопрос 2
AxisPod
@AxisPod
Что-то мне подсказывает, что проблема в формате пикселей. Посмотрите, что вернет функция D2D1::PixelFormat() в полноэкранном и оконном режимах.
Ответ написан
AxisPod
@AxisPod
Формат пикселей, это как видяха кодирует символы, для чего какие биты используются, можно задать множество разных форматов, например 16битный, 32битный, 48битный, при этом еще по несколько вариаций, все зависит от нужд.

GetClientRect возвращает прямоугольник клиентской области окна, это где можно рисовать. Координаты при этом оконные, т.е. левый верхний угол должен быть 0,0, правый нижний это размер, если нужны экранные координаты, то можно сконвертировать методом ClientToScreen, есть и обратный метод, обычно нужны для работы с мышью.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы