GetClientRect brint die Werte (0,0,0,0)



  • Hall,
    ich habe folgendes Problem.
    Ich habe meiner SDI-Anwendung eine 2. Ansicht vom Typ FormView (wie die Erste) hinzugefügt.
    Das Umschalten zwischen beiden Ansichten funktioniert.
    Aber:
    Der Aufruf der oben genannten Funktion in der 2. Ansicht (egal wo) wirft ein Rechteck mit den Werten (0,0,0,0) zurück!

    CRect rect;
    	GetClientRect(&rect);
             TRACE("%d   %d   %d   %d\n",rect.left,rect.right,rect.top,rect.bottom);
    

    Kennt jemand dieses Phänomen?



  • Also bei mir kommt:
    0 1014 0 668
    Hast du meine Lösung aus der FAQ benutzt? (Damit sollte es wohl gehen.)



  • also wenn ich GetClientRect aufrufe erwartet er als ersten parameter das fenster handle des clienten
    es kann sein das diese methode durch die MFC ueberladen ist

    versuch es mal indem du explizit die api funktion aufrufst

    ::GetClientRect(m_WindowHandle, &rect);

    oder spiele mal mit GetWindowRect rum



  • Mr Evil schrieb:

    also wenn ich GetClientRect aufrufe erwartet er als ersten parameter das fenster handle des clienten
    es kann sein das diese methode durch die MFC ueberladen ist

    Ist sie. 😉
    Wenn man sie in einer Viewklasse aufruft, wird genau dieser View genommen.

    Ist also identisch mit:

    CRect rect;
        ::GetClientRect(m_hWnd, &rect);
        TRACE("%d   %d   %d   %d\n",rect.left,rect.right,rect.top,rect.bottom);
    

    ...auch vom TRACE her.



  • Also der Aufruf der API bringt ebenfalls 4 mal die 0;

    @estartu
    Ich habe nicht deine Anleitung genommen! Aber die werde ich jetzt mal umsetzen

    Danke


  • Mod

    ratmann schrieb:

    Ich habe meiner SDI-Anwendung eine 2. Ansicht vom Typ FormView (wie die Erste) hinzugefügt.
    Das Umschalten zwischen beiden Ansichten funktioniert.

    Man kann keine zwei Ansichten einfach so in ein SDI Projekt einfügen. Das Frame kann immer nur einen View behandeln. Wenn müsstest Du ein CSplitterWnd einbauen!

    Oder Du müsstest Tabs-verwenden (Also so was CPropertySheet) oder oder oder.



  • Oder einen totmachen und dann den anderen anzeigen, das mache ich. 😉


  • Mod

    estartu schrieb:

    Oder einen totmachen und dann den anderen anzeigen, das mache ich. 😉

    Oder den einen verstecken und die ID umändern AFX_FIRST_VIEW_IRGENDWAS.
    Das ganze wird in einem Sample "Switch Views" beschrieben!



  • Als ich verstehe nur Bahnhof!
    Ich habe doch eine zweite Ansicht, wie bei Kruglinski in Inside Visual C++ beschrieben eingefügt. (Ist bestimmt SwitchView)
    Der Code:

    void CMainFrame::SwitchToView(eView nView)
    {
    	CView* pOldActiveView = GetActiveView();
    	CView* pNewActiveView = (CView*) GetDlgItem(nView);
    
    	if (pNewActiveView == NULL) {
    		switch (nView) {
    		case ADMIN:
    			pNewActiveView = (CView*) new CEnglsih_v2View;
    			break;
    		case QUESTION:
    			pNewActiveView = (CView*) new CEnglish_v2QuestionView;
    			break;
    		}
    		CCreateContext context;
    
    		context.m_pCurrentDoc = pOldActiveView->GetDocument();
    
    		pNewActiveView->Create(NULL, NULL, NULL,
    			rectDefault, this, nView, &context);
    
    		pNewActiveView->OnInitialUpdate();
    	}
    
    	SetActiveView(pNewActiveView);
    	pNewActiveView->ShowWindow(SW_SHOW);
    	pOldActiveView->ShowWindow(SW_HIDE);
    	pOldActiveView->SetDlgCtrlID(
    		pOldActiveView->GetRuntimeClass() == 
    		RUNTIME_CLASS(CEnglsih_v2View) ? ADMIN : QUESTION);
    	pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
    	RecalcLayout();
    }
    

  • Mod

    Genau! Und nur der View mit der ID AFX_IDW_PANE_FIRST ist der View der sichtbar ist, der andere hat die Ausdehnung 0,0,0,0. Das ist normal!


Anmelden zum Antworten