Ну, у меня есть 2 проблемы, но моя главная проблема сейчас - мое исключение улова. Вот код ...
int GXRenderManager::Ignite(HINSTANCE * hinst, int * nCmd, GXDEVICE DeviceType, int width, int height)
{
try
{
GXRenderManager::hinstance = hinst;
GXRenderManager::nCmdShow = nCmd;
GXRenderManager::height = height;
GXRenderManager::width = width;
InitWindows();
switch(DeviceType)
{
case DIRECTX:
GXRenderManager::renderDevice = new GXDX;
break;
case OPENGL:
GXRenderManager::renderDevice = new GXGL;
break;
default:
throw GXException(L"Error Finding Video Device");
}
Device()->StartUp(GXRenderManager::mainWindow ,width, height); //Error happens here
}
catch(GXVideoException &e)
{
MessageBox(0,e.pReason,L"GXVideoException",1);//Catch happens but no message box
return 0;
}
catch(GXWindowsException &e)
{
MessageBox(0,e.pReason,L"Windows Error",1);
return 0;
}
catch(GXException &e)
{
MessageBox(0,e.pReason,L"Error",1);
return 0;
}
return 1;
}
Здесь происходит ошибка
void GXDX::StartUp(HWND* mainWindow,int w, int h)
{
width = w;
height = h;
this->mainWindow = mainWindow;
ID3D10Texture2D *backBufferSurface;
DXGI_SWAP_CHAIN_DESC swapChainDesc;
swapChainDesc.BufferCount = 2;
swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
swapChainDesc.BufferDesc.RefreshRate.Numerator = 60;
swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
swapChainDesc.BufferDesc.Width = width;
swapChainDesc.BufferDesc.Height = height;
swapChainDesc.SampleDesc.Count = 1;
swapChainDesc.SampleDesc.Quality = 0;
swapChainDesc.OutputWindow = *mainWindow;
swapChainDesc.Windowed = TRUE;
D3D10_DRIVER_TYPE driverType = D3D10_DRIVER_TYPE_HARDWARE;
HRESULT hr = D3D10CreateDeviceAndSwapChain(NULL,driverType,NULL,0,
D3D10_SDK_VERSION, &swapChainDesc,&swapChain,&dxDevice);
if(FAILED(hr))
throw GXVideoException(L"Problems retrieving directX device");
}
Когда я иду через. D3D10CreateDeviceAndSwapChain возвращает ошибку, что вызывает ошибку GXVideoException.
Затем он перехватывает и возвращает обратно в класс GXRenderManager, как показано ниже.
catch(GXVideoException &e)
{
MessageBox(0,e.pReason,L"GXVideoException",1);
return 0;
}
В этот момент, если я наведу курсор на значок & e, я отчетливо вижу свое сообщение «Проблемы с получением устройства DirectX». Но окно сообщения не показывает
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
if(GXRenderManager::Ignite(&hInstance, &nCmdShow,DIRECTX) != 1)
return 0;
//NEVER REACHES THE RUN METHOD BELOW YET THE MAIN WINDOW REMAINS OPEN
GXRenderManager::Run();
return 0;
}
Другая вещь, которую я нахожу странной, заключается в том, что мое созданное окно продолжает отображаться, но никогда не достигает основного цикла. Это похоже на то, что приложение бездействует из-за окна сообщения, но окно сообщения не отображается ...
Я также хотел бы добавить, что статический член renderDevice является типом интерфейса. GXDX - это, конечно, реализованный класс интерфейса.
Класс GXDX включает заголовок GXException, поэтому он может генерировать эти исключения, чтобы основной GXRenderManager мог их перехватить.
[EDIT] * * тысячу двадцать-один
Еще одна вещь, которую я хотел бы добавить, если я уберу метод Показать окно
ShowWindow(*GXRenderManager::mainWindow, *GXRenderManager::nCmdShow);
Это работает. Так что пока главное окно моего приложения не открыто. Мое окно сообщения выглядит так, как и предполагалось.
[EDIT]
Перед тем, как решить проблему, я решил продолжить и отредактировал свой код. Мой улов теперь выглядит так
catch(GXVideoException &e)
{
MessageBox(*GXRenderManager::mainWindow,e.pReason,L"GXVideoException",1);
return 0;
}
Но теперь мое приложение открывается, а затем сразу же закрывается без отображения окна. mainWindow - указатель на мое базовое окно. Поэтому мне пришлось разыменовать указатель.
[EDIT]
Указатель Windows плохой