SplitterWnd mit TreeView -> Messages ?



  • Ich soll also die Controls in einer vom SplitterWnd abgeleiteten Klasse in OnCreate() erzeugen? Verstehe ich das so richtig?

    Soll ich zum Erstellen der Controls CreateView() benutzen oder ganz normal Create() ?
    Wie weise ich dann dem Control das Pane zu, bzw. umgekehrt (also (0,0) und (1,0) )?


  • Mod

    Nein. Du sollst ein CDockable Pane ableitenb und darin die Childs in OnCreate erzeugen. SplitterWnd ableiten macht keinen Sinn.

    Du erzeugst erst den Splitter und danach die Childs im Splitter... (CreateStatic)



  • Fast genau so mache ich es ja.
    Mir fehlt nur der Schritt

    Martin Richter schrieb:

    ... und danach die Childs im Splitter... (CreateStatic)

    Benutze ich CreateView() des Splitters, dann crashts.
    Alternative wäre, TreeCtrl mit Create zu erzeugen mit Splitter als Parent, geht aber auch nicht.
    Wie erzeuge ich also das TreeCtrl und weise es einem Pane zu ?


  • Mod

    Wo liegt das Problem?
    Wo kracht es?



  • Folgendes funktioniert (CTreeView):

    int Test::OnCreate(LPCREATESTRUCT lpCreateStruct ) {
    	CDockablePane::OnCreate(lpCreateStruct);
    	m_splitter.CreateStatic(this,2,1,WS_CHILD | WS_VISIBLE,59648);
    	m_splitter.CreateView(0,0,RUNTIME_CLASS(CTreeView), CSize(0,0), 0);
    	m_splitter.CreateView(1,0,RUNTIME_CLASS(CTreeView), CSize(0,0), 0);
    	return 0;
    }
    

    Folgendes stürzt ab (CTreeCtrl):

    int Test::OnCreate(LPCREATESTRUCT lpCreateStruct ) {
    	CDockablePane::OnCreate(lpCreateStruct);
    	m_splitter.CreateStatic(this,2,1,WS_CHILD | WS_VISIBLE,59648);
    	m_splitter.CreateView(0,0,RUNTIME_CLASS(CTreeCtrl), CSize(0,0), 0);
    	m_splitter.CreateView(1,0,RUNTIME_CLASS(CTreeCtrl), CSize(0,0), 0);
    	return 0;
    }
    

    Fehlermeldung: Debug Assertion Failed!
    Debuggen ist nicht möglich.
    Edit: return wird noch ausgeführt, dann crasht es.


  • Mod

    Wenn Du einen ASSERT bekommst dann kannst Du doch in dem Moment debuggen.
    Wo kommt den der ASSERT?
    Was sagt der callstack in dem Moment?
    Verstehe ich nicht.



  • Ich debugge bis return. Dann kommt im nächsten Schritt die Meldung "Für die aktuelle Position ist kein Quellcode verfügbar". Was muss ich da machen, um weiter debuggen zu können?

    Edit: Ok, das TreeCtrl braucht das Makro "DECLARE_DYNCREATE".
    Stürzt nun nicht mehr ab, aber die Client-Bereiche der Controls werden nun nicht neu gezeichnet.



  • Warum werden die Controls im SplitterWnd nicht sichtbar. Die Fenster scheinen durchsichtig, bzw. nicht gezeichnet zu werden.
    Auch nach Ändern der Grösse wird nichts sichtbar.

    Benutze ich statt CTreeCtrl CTreeView gehts hingegen, was mach ich bloss falsch?



  • Habe jetzt eine für mich akzeptable Lösung gefunden.
    Im OnCreate() des DockablePane erzeuge ich den Splitter mit CreateStatic().
    Dann habe ich die Klasse TreeWnd von CWnd abgleitet. TreeWnd hat ein TreeCtrl als Member.
    TreeWnd wird dann in den Splitter gesetzt. Wichtig ist dabei die ID, die mittels IdFromRowCol() dem Splitter-Pane entnommen wird:

    m_splitter.CreateStatic(this,2,1,WS_CHILD | WS_VISIBLE,59648);
    m_treeWnd. Create (0,"Hallo",WS_CHILD | WS_VISIBLE, CRect (0, 0, 0, 0),&m_splitter, m_splitter.IdFromRowCol (0, 0));
    

    Die Messages des TreeCtrl kann ich dann in TreeWnd abfangen.Genau so geht es auch mit beliebigen anderen Controls.


  • Mod

    ... dann scheint der CSplitterWnd nur Views als Child zu mögen...
    obwohl die Doku was anderes sagt und Q262024 auch!

    Wann geht dnen der Callstack hopps?
    Debugge doch mal durch und beobachte den Callstack...


Anmelden zum Antworten