Alt + Войти в приложения Win32, управлять размером и разрешением - PullRequest
0 голосов
/ 13 февраля 2020

Я борюсь с изменением размера и полноэкранным режимом моего проекта. Это то, над чем я работаю Мандельброт в пиксельном шейдере , а здесь GIT https://github.com/ShamanLKG/Mandelbrot

Приложение вылетает при нажатии Alt + Enter и Я не понимаю, почему.

case WM_SIZE:
{
    int width = LOWORD(lParam);  // Macro to get the low-order word.
    int height = HIWORD(lParam); // Macro to get the high-order word.

    pThis->D3D->OnResize(width, height);
    pThis->D3D = std::shared_ptr<Direct3D>(new Direct3D(hWnd, width, height));
    pThis->D2D = std::shared_ptr<Direct2D>(new Direct2D(hWnd, pThis->D3D));
    break;
}

Я заново создал объекты Direct3d и Direct2 при изменении размера, чтобы решить проблемы с навигацией и отрегулировать разрешение окна. Но пока невозможно заставить работать полный экран. Полный экран работает без воссоздания объектов D3D и D2D, но затем я застрял с исходным разрешением, и навигация не работает должным образом. Я использую функцию OnResize () из MSDN (https://docs.microsoft.com/en-us/windows/win32/direct3ddxgi/d3d10-graphics-programming-guide-dxgi#handling - изменение размера окна ). Я попытался передать аргумент BOOL в InitD3D, чтобы сообщить программе, является ли swapchain полноэкранным или нет из swapchain-> GetFullScreenState, но это не помогло.

Навигация работает до тех пор, пока размер окна не изменяется тогда это не точно. Регулировка yDelta с изменением соотношения экрана помогает, но только при изменении ширины окна. Он снова становится нестабильным при изменении высоты окна. В качестве обходного пути я воссоздал объект D3D и D2D, чтобы начать с параметров fre sh и иметь функцию навигации. Но в результате полный экран теперь падает.

void Direct3D::CenterScreen(int xPos, int yPos)
{

    //float ratio = startRatio / currentRatio;
    int xDelta = xPos - width / 2;
    int yDelta = (yPos - height / 2);  //could divide by ratio to capture window width change

    realStart += (float)xDelta / (float)width * 2 * mandelWidth;
    imagStart += (float)yDelta / (float)height * 2 * mandelHeight;
}

Есть какие-нибудь подсказки, как мне решить эти проблемы? Большое спасибо заранее.

1 Ответ

0 голосов
/ 15 февраля 2020

Обнаружена ошибка, ресурсы Direct2D не были освобождены, что привело к сбою ResizeBuffers с кодом 0x887A0001. Учебное пособие https://bell0bytes.eu/fullscreen/ было очень полезным.

hr = swapchain->ResizeBuffers(0, 0, 0, DXGI_FORMAT_UNKNOWN, 0);

Урок дня, имейте надежную систему обработки ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...