Окно создано, но не видно

У меня проблема с окном Winapi. У меня есть приложение, которое может (но не обязательно) запускаться в полноэкранном режиме, и если это произойдет, у меня не может быть пустое окно, отображаемое до перехода в полноэкранный режим. Итак, что я делаю, это:

  1. Создать окно
  2. Вызов

    ShowWindow(HWnd, SW_HIDE);
    UpdateWindow(HWnd);
    
  3. Чтение настроек из файла

  4. Сброс D3D рендерера, настройка окна, возможность переключения в полноэкранный режим и вызов

    SetWindowPos(HWnd, HWND_NOTOPMOST, posx, posy,sizex, sizey, SWP_SHOWWINDOW);
    ShowWindow(HWnd, SW_SHOW);
    

В полноэкранном режиме все в порядке, но когда приложение запускается в оконном режиме, окна просто нет — CreateWindowEx возвращает правильный дескриптор окна, приложение работает в фоновом режиме и все, но окно не найдено. Что я забыл?

редактировать
Хорошо, некоторый прогресс. Оказалось, что SetWindowPos в подпрограмме сброса визуализатора D3D не вызывался. Я исправил это, и теперь появилась новая проблема — окно там, где оно должно быть, но оно полностью прозрачно, в клиентской области ничего не отображается, кроме курсора.

В полноэкранном режиме все работает нормально. Если приложение запускается в полноэкранном режиме и пользователь переключается в оконный режим, все также в порядке.

edit2
Хорошо, мне удалось найти причину, по которой в окне ничего не отображается — IDirect3DDevice9::BeginScene метод возвращает D3DERR_INVALIDCALL, так что, видимо, что-то не так с перезагрузкой рендерера D3D.

void VD3D9Renderer::Reset(bool windowed, ulong width, ulong height)
{
for (size_t i=0; i<Fonts.size(); i++)
Fonts[i]->Font->OnLostDevice();

if (FontMgr)
FontMgr->OnLostDevice();

for (VMap<VString, VD3D9Texture*>::iterator it = TextureMap.begin(); it != TextureMap.end(); it++)
{
VD3D9Texture* tex = it->second;
if (tex && tex->IsRenderTarget())
tex->TexturePtr->Release();
}

D3DD->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &BackBufferColor);
D3DD->GetDepthStencilSurface(&BackBufferDepthStencil);

if (BackBufferColor) BackBufferColor->Release();
if (BackBufferDepthStencil) BackBufferDepthStencil->Release();

bool change_fs = (windowed==true && D3DPP.Windowed == FALSE) || (windowed==false && D3DPP.Windowed == TRUE) ? true : false;

D3DPP.Windowed = windowed;

if (width) D3DPP.BackBufferWidth = width;
if (height) D3DPP.BackBufferHeight = height;

D3DD->Reset(&D3DPP);

RECT rc;
rc.left = 0;
rc.top = 0;
rc.right = D3DPP.BackBufferWidth;
rc.bottom = D3DPP.BackBufferHeight;if (change_fs)
{
if(D3DPP.Windowed)
{
DWORD style = GetWindowLong(HWnd, GWL_STYLE);
DWORD exstyle = GetWindowLong(HWnd, GWL_EXSTYLE);

style = WS_CAPTION | WS_SYSMENU;
exstyle = 0;

int posx = (GetSystemMetrics(SM_CXSCREEN) - (rc.right-rc.left)) >> 1;
int posy = 0;

AdjustWindowRectEx(&rc, style, false, exstyle);

SetWindowLong(HWnd, GWL_STYLE, style);
SetWindowLong(HWnd, GWL_EXSTYLE, exstyle);

if(!SetWindowPos(HWnd, HWND_NOTOPMOST, posx, posy, rc.right, rc.bottom, SWP_SHOWWINDOW))
{
DWORD error = GetLastError();
VLog("Error in SetWindowPos: %u\n", error);
}
ShowWindow(HWnd, SW_SHOW);
}
else
{
DWORD style = GetWindowLong(HWnd, GWL_STYLE);
DWORD exstyle = GetWindowLong(HWnd, GWL_EXSTYLE);

style = WS_POPUP;
exstyle = 0;
int posx = (GetSystemMetrics(SM_CXSCREEN) - (width)) >> 1;
int posy = 0;

SetWindowLong(HWnd, GWL_STYLE, style);
SetWindowLong(HWnd, GWL_EXSTYLE, exstyle);

if(!SetWindowPos(HWnd, HWND_NOTOPMOST, posx, posy, rc.right, rc.bottom, SWP_SHOWWINDOW))
{
DWORD error = GetLastError();
VLog("Error in SetWindowPos: %u\n", error);
}
ShowWindow(HWnd, SW_SHOW);
}
}
else
{
if (rc.right > 0 && rc.bottom > 0)
{
DWORD style = GetWindowLong(HWnd, GWL_STYLE);
AdjustWindowRect(&rc, style, false);
int posx = (GetSystemMetrics(SM_CXSCREEN) - (rc.right-rc.left)) >> 1;
int posy = 0;

if(!SetWindowPos(HWnd, HWND_NOTOPMOST, posx, posy, rc.right, rc.bottom, SWP_SHOWWINDOW))
{
DWORD error = GetLastError();
VLog("Error in SetWindowPos: %u\n", error);
}
//SetWindowPos(HWnd, HWND_NOTOPMOST, posx, posy, rc.right, rc.bottom, SWP_SHOWWINDOW);
ShowWindow(HWnd, SW_SHOW);
}
}

for (VMap<VString, VD3D9Texture*>::iterator it = TextureMap.begin(); it != TextureMap.end(); it++)
{
VD3D9Texture* tex = it->second;
if (tex && tex->IsRenderTarget())
D3DD->CreateTexture(tex->Width, tex->Height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8,
D3DPOOL_DEFAULT, &tex->TexturePtr, NULL);
}

for (size_t i=0; i<Fonts.size(); i++)
Fonts[i]->Font->OnResetDevice();

if (FontMgr)
FontMgr->OnResetDevice();

ResetDeviceState();
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector