Splitter und D3D
-
Also mein Problem ist das ich für ein Level Editor ja ein Spliter machen möchte mit 4 Views.
Das ist ja kein Problem. Aber um D3D in ein View zu Initialisieren brauche ich das HWND von den View wo D3D Rendern soll. Aber da liegt das Problem ich bekomme nur das HWND von den ganzen Splitter. Also wen ich D3D Rendern lass übermalt er alle 4 Views.
Also ich habe jetzt 2 Möglichkeiten entweder das HWND von den ein View(Was das bessere wäre) oder ein Rect wo die Position des View gespeichert ist dann kann ich D3D sagen das er nur da Rendern soll. Aber ich komm weder auf das View noch auf dass HWND.So jetzt noch ein par ausschnitte aus meinem Versauten nicht Funktionsfähigen Code
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext) { CRect cr; GetClientRect(&cr); if (!m_wndSplitter.CreateStatic(this, 1, 2)) return FALSE; if ( !m_wndSplitter.CreateView( 0, 1, RUNTIME_CLASS(CPanel), CSize( PANEL_SIZE, cr.Height() ), pContext ) ) { MessageBox( "Error setting up splitter frames!", "Init Error!", MB_OK | MB_ICONERROR ); return FALSE; } ((CPanel*)(m_wndSplitter.GetPane( 0, 1 )))->m_viewports = &m_viewportSplitter; if ( !m_viewportSplitter.CreateStatic( &m_wndSplitter, 2, 2, WS_CHILD | WS_VISIBLE, m_wndSplitter.IdFromRowCol( 0, 0 ) ) ) { MessageBox( "Error setting up splitter frames!", "Init Error!", MB_OK | MB_ICONERROR ); return FALSE; } int i = cr.Width(); //m_viewportSplitter.GetClientRect(&cr); if (!m_viewportSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeftView), CSize((cr.Width()-PANEL_SIZE)/2, cr.Height()/2), pContext) || !m_viewportSplitter.CreateView(0, 1, RUNTIME_CLASS(CReightView), CSize((cr.Width()-PANEL_SIZE)/2, cr.Height()/2), pContext) || !m_viewportSplitter.CreateView(1, 0, RUNTIME_CLASS(CUpView), CSize((cr.Width()-PANEL_SIZE)/2, cr.Height()/2), pContext) || !m_viewportSplitter.CreateView(1, 1, RUNTIME_CLASS(CDownView), CSize((cr.Width()-PANEL_SIZE)/2, cr.Height()/2), pContext)) { m_wndSplitter.DestroyWindow(); return FALSE; } ((CDownView*)(m_viewportSplitter.GetPane( 1, 1 )))->m_viewportSplitter = &m_viewportSplitter; m_initSplitters = TRUE; return TRUE; }
Und dann das HWND zuweisen.
void CDownView::OnInitialUpdate() { CTreeView::OnInitialUpdate(); InitD3D(GetOwner()->GetSafeHwnd()); }
so dann noch die zweite Möglichkeit wen ich unten bei Present das Rect angebe wo er nur Rendern darf.
VOID CDownView::Render() { if( NULL == g_pd3dDevice ) return; CRect rc; POINT P; // int x1, x2, y1, y2; // x1 = x2 = y1 = y2 = 0; // CSplitterWnd * parent; // parent = (CSplitterWnd*)GetParent(); // Das sind anderer Lösungsideen. parent->GetPane(1,1)->GetClientRect( &rc ); m_viewportSplitter->GetPane(1,1)->GetWindowRect(rc); m_viewportSplitter->GetColumnInfo(1,x1,y1); m_viewportSplitter->GetRowInfo(1,x2,y2); g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,255,0), 1.0f, 0 ); g_pd3dDevice->Present( NULL, &rc, NULL, NULL ); }
[ Dieser Beitrag wurde am 01.12.2002 um 18:50 Uhr von Blade editiert. ]
-
Du könntest die Größe des Viewports von D3D verändern (d3ddevice->SetViewPort&GetViewPort) und der Größe des Splitters anpassen...
-
alles was D3D seitigt ist sehe ich kein prob. mein Problem ist es das ich nicht die Daten von View bekomme. Als garnicht wo der View liegt. Die Grösse bekomme ich raus. Aber nicht die Position.
Aber erstmal thx für die antwort.
EDIT:
em p.s. nur ein tip verwende nimals GetViewPort diese function functioniert nicht mehr bei PureDevice also alle neue Grafikkarten.[ Dieser Beitrag wurde am 01.12.2002 um 21:36 Uhr von Blade editiert. ]
-
Hat sich erledigt habs raus.