我有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 Header,因此它可以抛出这些异常,因此主GXRenderManager可以捕获它们。
[编辑]
我想添加的另一件事是我删除了显示窗口方法
ShowWindow(*GXRenderManager::mainWindow, *GXRenderManager::nCmdShow);
有效。所以只要我的主应用程序窗口没有打开。我的消息框显示为它的假设。
[编辑]
在修复部分问题的dauphic响应之前,我继续编辑了我的代码。我的抓住现在看起来像这样
catch(GXVideoException &e)
{
MessageBox(*GXRenderManager::mainWindow,e.pReason,L"GXVideoException",1);
return 0;
}
但是现在我的应用程序打开然后立即关闭而不显示该框。 mainWindow是指向我的基本窗口的指针。所以我不得不取消引用指针。
[编辑]
Windows指针不好
答案 0 :(得分:1)
如果存在对话框,则应始终向MessageBox传递句柄,而不是0.如果没有可用的对话框,则仅传递MessageBox 0.
旁注,我不明白这个的确切原因,所以如果其他人可以提供见解会很棒。
您的消息框也可能被附加到对话框,并且由于您的对话框未处于活动状态,因此未显示消息框。挂起时按alt可能会导致显示。