neunes Fenster mit Splitter erstellen



  • Hallo,
    ich habe eine leere SDI-Anwendung mit dem Assistent in visual studio 2005 erstellt.
    und möchte aus der SDI-Anwendung einen neunes Fenster wie popup öffnen

    void CMainFrame::OnCreateSplitterFrame()
    {
       CSpiltter* pSplitterFrm = NULL;
       pSplitterFrm = new CSpiltter();
       if ( pSplitterFrm  )
       {
          CFrameWnd *pFrame = (CFrameWnd *)AfxGetApp()->m_pMainWnd;
          CRect rect ( 0, 0, 750, 400 );
          pSplitterFrm->Create( NULL, NULL,WS_OVERLAPPEDWINDOW |   WS_POPUP,rect,pFrame);
       }
    }
    

    dieses Fenster muss aus zwei Teilen bestehen
    habe ich versucht mit splitter zu realisieren

    BOOL CSpiltter::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
    {
       CRect cr; 
       GetClientRect( &cr);
    
       //teilen des Hauptfensters in 2 Zeilen
       if ( !m_mainSplitter.CreateStatic( this, 2, 1 ) ) 
       { 
          AfxMessageBox( _T("Error setting up splitter frames?"), 
             MB_OK);
          return FALSE; 
       }
    
       if ( !m_mainSplitter.CreateView( 0, 0, 
          RUNTIME_CLASS(CSplitterView1), 
          CSize(cr.Width(), cr.Height()/4), pContext ) ) 
       { 
          AfxMessageBox( _T("Error setting up splitter frames!"), MB_OK);
          return FALSE; 
       }
       if ( !m_mainSplitter.CreateView( 1, 0, 
          RUNTIME_CLASS(CSplitterView1), 
          CSize(0,0), pContext ) ) 
       { 
          AfxMessageBox( _T("Error setting up splitter frames!"), MB_OK);
          return FALSE; 
       }
    
       m_bInitSplitter = true;
       return TRUE;
    }
    

    das View , das im ersten Teil angezeigt werden soll sieht so aus

    #pragma once
    #include "afxwin.h"
    #include "gueltigkeitsbetstaetigungDoc.h"
    
    class CSplitterView1 :public CScrollView
    {
       DECLARE_DYNCREATE(CSplitterView1)
    public:
       CSplitterView1(void);
       ~CSplitterView1(void);
    
       // Überladungen
       // Vom Klassenassistenten generierte Überladungen virtueller Funktionen
       //{{AFX_VIRTUAL(CToolsView)
    public:
       virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
    protected:
       virtual void OnInitialUpdate(); // das erste mal nach der Konstruktion aufgerufen
       virtual void OnDraw(CDC*);
    };
    

    .

    das Problem ist. es wird kein neues Fenster erstellt bzw angezeigt.
    was muss man besonders beachten.
    bitte helft mir. ich bin am zweifeln


  • Mod

    Das geht so nicht. Ein CSplitterWnd kann immer nur ein CHild Fenster sein. Will heißen es muss WS_CHILD gesetzt sein. Das wiederspricht aber Deinem Popup Gedanken!

    Wieso möchtest Du ein neues Popup Window erzeugen? Welchen Sinn macht das?

    Du kannst ein neues CFrameWnd erzeugen. In dem kannst Du dannn Dein CSplitterWnd erzeugen.



  • hallo,
    sorry weil ich mich falsch ausgedruckt habe.
    genau was ich möchte ist ein CFrameWnd-Fenster aus meiner Anwendung zu erzeugen. In dem ich mit CSplitterWnd das Fenster in zwei Zeilen teile (horizental).
    in dem oberen Teil möchte ich einen Text ausgeben (Textview).
    in dem unteren Teil möchte ich auch Text ausgeben und Informationen zeichnen mit buttons(Formview)
    was muss ich in meinem Programm anpassen?


  • Mod

    Das einfachste ist, Du lässt Dir mit dem Wizard mal ein SDI Projekt im Explorer-Stil erzeugen.

    Ansonsten ist Dein Code doch soweit OK, wie ich das sehe. Nur die Funktion OnCreateSplitterFrame macht in meinen Augen keinen Sinn!

    Die Größe des zweiten Splitter Windows ist auf 0. Vermutlich hängt der Splitter also am unteren Rand.



  • mit dem Wizard habe ich schon eine leere SDI MFC-Anwendung erzeugt. mit der Funktion OnCreateSplitterFrame möchte ich ein neues (zweites) CFrameWnd-Fenster erzeugen. dieses zweites Fenster und nicht das Fenster von meiner SDI-Anwendung möchte ich dann mit CSplitterWnd teilen.


  • Mod

    OK! Sorry. Ich habe es jetzt erst gaz verstanden.

    OnCreateSplitterFrame:
    Füge WS_VISIBLE als Stil hinzu oder führe ShowWindow(SW_SHOW) aus nachdem das Fenster erzeugt wurde.



  • wenn ich den Inhalt der Funktion CSpiltter::OnCreateClient auskommentiere, wird das zweites Fenster erzeugt und angezeigt. es liegt dann an der Splitterung

    so erstelle jetzt das Fenster.

    void CMainFrame::OnCreateSplitterFrame()
    {
    
       CSpiltter* pSplitterFrm = NULL;
       pSplitterFrm = new CSpiltter();
       if ( pSplitterFrm  )
       {
          CFrameWnd *pFrame = (CFrameWnd *)AfxGetApp()->m_pMainWnd;
          CRect rect ( 0, 0, 750, 400 );
          pSplitterFrm->[b]Create[/b]( pFrame);
       }
    
    }
    

    und

    BOOL CSpiltter::Create( CWnd *pParent)
    {
    
     .......
    ........
      [b] BOOL ret = CFrameWnd :: Create ( NULL,
          csFehlerausgabeTitel,
          WS_OVERLAPPEDWINDOW ,
          rect,
          pParent ); // TODO[/b]   if ( ret == 0 )
       {
          return ret;  
       }
    
        ......
    .......
    
       [b]ShowWindow ( SW_SHOW );[/b]
       return ret;  
    }
    
    BOOL CSpiltter::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
    {
       CRect cr; 
       GetClientRect( &cr);
    
       //teilen des Hauptfensters in 2 Zeilen
       if ( !m_mainSplitter.CreateStatic( this, 2, 1 ) ) 
       { 
          AfxMessageBox( _T("Error setting up splitter frames?"), 
             MB_OK);
          return FALSE; 
       }
    
       [b]// Sturtzt hier ab. es scheint etwas mit der View nicht in Ordnung zu sein[/b]   if ( !m_mainSplitter.CreateView( 0, 0, 
          RUNTIME_CLASS(CSplitterView1), 
          CSize(cr.Width(), cr.Height()/4), pContext ) ) 
       { 
          AfxMessageBox( _T("Error setting up splitter frames!"), MB_OK);
          return FALSE; 
       }
       if ( !m_mainSplitter.CreateView( 1, 0, 
          RUNTIME_CLASS(CSplitterView1), 
          CSize(cr.Width(),cr.Height()*3/4), pContext ) ) 
       { 
          AfxMessageBox( _T("Error setting up splitter frames!"), MB_OK);
          return FALSE; 
       }
    
       m_bInitSplitter = true;
       return TRUE;
    }
    

    bei der Spßlitterung sturtzt ab und zwar in der Stelle der MFC Klassen steht der Text
    // dialog template must exist and be invisible with WS_CHILD set

    was mache ich noch falsch
    ich vermute dass es etwas in den View nicht stimmt

    #include "StdAfx.h"
    #include "SplitterView1.h"
    
    IMPLEMENT_DYNCREATE( CSplitterView1, CFormView )
    
    CSplitterView1::CSplitterView1(void)
          : CFormView ( CSplitterView1 :: IDD )
    {
    }
    
    CSplitterView1::~CSplitterView1(void)
    {
    }
    
    void CSplitterView1::OnInitialUpdate()
    {
      CFormView:: OnInitialUpdate ( );
    }
    
    BOOL CSplitterView1::PreCreateWindow(CREATESTRUCT& cs) 
    { 
       return CFormView::PreCreateWindow(cs);
    }
    
    void CSplitterView1::OnDraw(CDC* cdc)
    {
       //CScrollView::OnDraw(cdc);
    
    }
    

  • Mod

    Steht doch da!
    Dein Dialog Template hat nicht das Attribut WS_CHILD (Kindfenster).
    Oder es existiert nicht, also was ist als CSplitterView1::IDD definiert?



  • das wars. habe ich mir auch so gedacht aber ich wusste nicht welchen Attributte.
    du hast Recht. mein IDD-Dialog attributte stil muss auf "Untergeordnet" stehen.
    ist das irgendwo dokumentiert !
    danke dir vielmals dür dein Geduld und deine Hilfe. jetzt kann ich mal weiter kooken wie ich auf meine Fenster zeichne.


  • Mod

    jolay schrieb:

    du hast Recht. mein IDD-Dialog attributte stil muss auf "Untergeordnet" stehen.
    ist das irgendwo dokumentiert !

    Jupp! Wie so immer steht zu 95% aller Fragen dieAntwortin der MFC:
    http://msdn2.microsoft.com/en-us/library/1k26hkc2(vs.80).aspx


Anmelden zum Antworten