好吧,首先繼承不是我的強項,這就是爲什麼我在這裏。不過,我會盡我所能解釋。函數調用繼承C++
我打電話從1級的函數的2類,2類是從1類和2類衍生爲3.
類一旦程序的執行的基類是3級,其被稱爲在WinMain()中。
生病顯示它的代碼始終是有道理的方式:
void SRNTY_API Direct3D11::D3D11ResizeBuffers(HWND hwnd)
{
RECT rect;
GetWindowRect(hwnd, &rect);
mRenderTargetWidth = rect.right - rect.left;
mRenderTargetHeight = rect.bottom - rect.top;
if (mDXGISwapChain != NULL)
{
assert(mD3D11DeviceContext);
assert(mD3D11Device);
assert(mDXGISwapChain);
if (mD3D11DeviceContext)
{
mD3D11DeviceContext->ClearState();
}
if (mD3D11RenderTargetView)
{
mD3D11RenderTargetView->Release();
}
if (mD3D11DepthStencilView)
{
mD3D11DepthStencilView->Release();
}
if (FAILED(result = mDXGISwapChain->ResizeBuffers(1, mRenderTargetWidth, mRenderTargetHeight,
DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH)))
{
SRNTY::ErrorHandler::Instance()->AddError(L"Direct3D11::D3D11ResizeBuffers() - ID3D11Device::CreateRenderTargetView() failed to create render target view!",
SRNTY::ErrorHandler::ErrorHeaderSelect::EHS_ERROR);
}
if (FAILED(result = mDXGISwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&mD3D11RenderTargetView)))
{
SRNTY::ErrorHandler::Instance()->AddError(L"Direct3D11::D3D11ResizeBuffers() - ID3D11Device::CreateDepthStencilView() failed to create depth stencil view!!",
SRNTY::ErrorHandler::ErrorHeaderSelect::EHS_ERROR);
}
if (FAILED(result = mDXGISwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&mD3D11DepthStencilView)))
{
SRNTY::ErrorHandler::Instance()->AddError(L"Direct3D11::D3D11ResizeBuffers() - ID3D11Device::CreateDepthStencilView() failed to create depth stencil view!!",
SRNTY::ErrorHandler::ErrorHeaderSelect::EHS_ERROR);
}
D3D11_VIEWPORT viewport;
ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT));
viewport.TopLeftX = 0;
viewport.TopLeftY = 0;
viewport.Width = mRenderTargetWidth;
viewport.Height = mRenderTargetHeight;
viewport.MinDepth = 0.0f;
viewport.MaxDepth = 1.0f;
if ((mD3D11DeviceContext != NULL) && (mD3D11RenderTargetView != NULL) && (mD3D11DepthStencilView != NULL))
{
mD3D11DeviceContext->OMSetRenderTargets(1, &mD3D11RenderTargetView, mD3D11DepthStencilView);
mD3D11DeviceContext->RSSetViewports(1, &viewport);
}
}
}
上述功能的目的是重新大小IDXGISwapChain *緩衝區。所以這個必須在WM_EXITSIZEMOVE上調用。這個功能將在上述blabba的Class 1中。
所以它使用上述功能類作爲基準的下一個類現在上調用此方法WM_EXITSIZEMOVE,這裏是代碼:
LRESULT Window::MsgProc(__in HWND hWnd, __in UINT message,
__in_opt WPARAM wParam, __in_opt LPARAM lParam)
{
switch (message)
{
case WM_KEYDOWN:
{
if (wParam == VK_ESCAPE)
{
PostQuitMessage(0);
}
}
case WM_MENUCHAR:
{
return MAKELRESULT(0, MNC_CLOSE);
} break;
case WM_DESTROY:
{
PostQuitMessage(0);
} break;
case WM_ENTERSIZEMOVE:
{
} break;
case WM_EXITSIZEMOVE:
{
D3D11ResizeBuffers(hWnd); // heres is the above function being called as mentioned on WM_EXITSIZEMOVE
} break;
case WM_GETMINMAXINFO:
{
} break;
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
這兩類然後被添加到一個引擎類,然後加入到一個應用程序類。該應用程序是WinMain()的前端類。
現在發生的事情並不是緩衝區被重新調整大小,發生了什麼事情Direct3D11 :: D3D11ResizeBuffers()獲取調用GetWindowRect(hwnd,& rect)的窗口滯留;並將結果存儲在RECT矩形中。
但是,當我們到這裏這一行mRenderTargetWidth = rect.right - rect.left ;.它基本上說mRenderTargetWidth「異常拋出:寫訪問衝突,這是0x8。」當我調試程序我注意到Direct3D11類的所有成員說以下內容:
結果無法讀取內存
mhWnd無法讀取內存
mRenderTargetWidth無法讀取內存
mRenderTargetHeight無法讀取內存
mDXGISwapChain無法讀取內存
mDXGIDevice無法讀取內存
mDXGIAdapter無法讀取內存
mDXGIFactory無法讀取內存
mD3D11Device尤娜BLE讀取內存
mD3D11DeviceContext無法讀取內存
mD3D11RenderTargetView無法讀取內存
mD3D11DepthStencilView無法讀取內存
所以在效果類已經diapered所以像這個 - > mD3D11Device爲NULL。
這是非常安全的說我在這裏很困惑。我真的需要幫助,要麼解釋我做錯了什麼或建議如何我可以解決這個問題將不勝感激。如果有任何需要進一步的信息,只要問,我會給。
感謝您的閱讀,我希望人們能幫助:)
請閱讀['如何問]'(http://stackoverflow.com/help/how-to-ask)以充分利用SO。 – StoryTeller