Hi,
ich habe versucht, in einem wxWidgets 3.0 wxPanel etwas mit Directx11 zu rendern.
Dazu habe ich eine eigene Klasse erstellt, die ich von wxPanel erben lasse. Das Panel hat eine Größe von 100x100 px.
Bei mir ist jedoch die komplette wxFrame, wo das Panel drin liegt schwarz (eigentlich sollte nur die 100x100 px Fläche schwarz sein.
Kann mir jemand sagen, woran das liegen kann? Ich habe im Debugger geprüft, die HWND vom Panel und das in der Swapchain verwendete HWND sind identisch.
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
BEGIN_EVENT_TABLE(STMaker::Widgets::DXPanel, wxPanel)
EVT_SIZE(STMaker::Widgets::DXPanel::OnSize)
EVT_PAINT(STMaker::Widgets::DXPanel::OnPaint)
EVT_ERASE_BACKGROUND(STMaker::Widgets::DXPanel::OnEraseBackground)
EVT_IDLE(STMaker::Widgets::DXPanel::OnIdle)
END_EVENT_TABLE()
STMaker::Widgets::DXPanel::DXPanel(wxFrame* parent,STEngine::System* system,wxPoint pos, wxSize size) : wxPanel(parent,wxID_ANY,pos,size,wxFULL_REPAINT_ON_RESIZE)
{
this->STSystem = system;
}
bool STMaker::Widgets::DXPanel::InitDX()
{
try
{
this->STScene =this->STSystem->CreateScene((HWND)this->GetHWND(),this->GetSize().GetWidth(),this->GetSize().GetHeight(),false);
}
catch (STEngine::Exceptions::STException e)
{
wxMessageBox(e.GetError(), "CREATE SCENE ERROR", wxOK, this);
return false;
}
return true;
}
void STMaker::Widgets::DXPanel::OnClose(wxCloseEvent &event)
{
//TODO: Scene wegmachen
}
void STMaker::Widgets::DXPanel::OnIdle(wxIdleEvent &event)
{
event.RequestMore(true);
if (this->STScene->Init == true)
{
this->STScene->RenderScene();
}
}
void STMaker::Widgets::DXPanel::OnPaint( wxPaintEvent& WXUNUSED(event) )
{
wxPaintDC dc(this);
if (this->STScene->Init == false)
{
this->STScene->InitScene();
}
}
void STMaker::Widgets::DXPanel::OnSize(wxSizeEvent& event)
{
// Reset the D3D view aspect
}
void STMaker::Widgets::DXPanel::OnEraseBackground(wxEraseEvent& WXUNUSED(event))
{
// Do nothing, to avoid flashing on MSW
}
|
Und die Erstellung der SwapChain:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
IDXGISwapChain* STEngine::Grafics::D3D::CreateNewSwapChain(HWND hwnd,int width, int height,bool fullscreen)
{
DXGI_SWAP_CHAIN_DESC scd;
ZeroMemory(&scd, sizeof(DXGI_SWAP_CHAIN_DESC));
scd.BufferCount = 1;
scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
scd.BufferDesc.Width = width;
scd.BufferDesc.Height = height;
scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
scd.OutputWindow = hwnd;
scd.SampleDesc.Count = 4;
scd.Windowed = !fullscreen;
scd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
IDXGISwapChain* swapchain;
HRESULT hres;
hres = this->Factory->CreateSwapChain(this->DXDevice,&scd,&swapchain);
if (FAILED(hres))
{
THROW_GraficsException("error_createswapchain","SwapChain konnte nicht erstellt werden!",hres);
return NULL;
}
return swapchain;
}
|
Kann mir da jemand weiterhelfen? Hab ich vielleicht was wichtiges vergessen?