我試圖從基類繼承一些公共全局變量,併成功地獲得了啓動並運行的窗口,並以簡單的方式初始化了directx - 在它自己的類中,繼承了全局變量如HWND hWnd
。DirectX 11:在運行簡單的DirectX應用程序時運行時崩潰
但是,當程序運行時,D3D11CreateDeviceAndSwapChain()
失敗。上進一步檢查,調試器給出:
DXGI ERROR: IDXGIFactory::CreateSwapChain: No target window specified in DXGI_SWAP_CHAIN_DESC, and no window associated with owning factory. [ MISCELLANEOUS ERROR #6: ]
的DXGI_SWAP_CHAIN_DESC
結構如下:
SwapChainDesc.BufferCount = 1;
SwapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
SwapChainDesc.BufferDesc.Width = 1024;
SwapChainDesc.BufferDesc.Height = 768;
SwapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
SwapChainDesc.OutputWindow = hWnd;
SwapChainDesc.BufferDesc.RefreshRate.Numerator = 60;
SwapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
SwapChainDesc.SampleDesc.Count = 4;
SwapChainDesc.Windowed = TRUE;
SwapChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
凡hWnd
存儲在:
class Infinity{
public:
Infinity();
~Infinity();
HWND hWnd;
};
和遺傳這樣:
class Direct3D : public Infinity{
public:
Direct3D();
~Direct3D();
IDXGISwapChain *Swapchain; //Display modes.
ID3D11Device *Device;
ID3D11DeviceContext *DeviceContext;
ID3D11RenderTargetView *RenderTargetView;
void D3D_Start(int width, int height);
void D3D_Render();
void D3D_Terminate();
}Direct3D;
在運行時檢查SwapChainDesc.OutputWindow = hWnd;
的值,它爲空。 (0x00000000
),我認爲這就是Swapchain->GetBuffer
失敗的原因,因爲D3D11CreateDeviceAndSwapChain
需要工作HWND
。如果這是真的,爲什麼ShowWindow()
成功?
編輯:我還要補充一點,ShowWindow()
是相似的類從class Infinity
繼承:
class Windows : public Infinity{
public:
Windows();
~Windows();
bool DisplayWindow(int width, int height, HINSTANCE hInstance);
static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
}Windows;
hWnd在您的代碼中不是全局的,它是數據成員。 – NmdMystery 2014-08-29 18:54:34
@NmdMystery在這個班級結構中,「hWnd」不應該是全球性的嗎?這兩個類都從'Infinity'繼承, – 2014-08-29 19:01:39
不,因爲它是一個實例變量。所有實例變量都是對象的本地變量。如果您實例化一個Window類型的對象,然後是另一個Direct3D類型的對象,那麼它們將分別擁有自己的hWnd實例。你可能想要做的就是製作hWnd'static',這樣只有一個hWnd副本,並且所有的繼承類都可以訪問它(當然,如果你只打算製作一個窗口的話)。 – NmdMystery 2014-08-29 19:05:42