Problem mein Scrollen im CDialog



  • Hi,

    Mir ist ein Bug im Bezug auf das (Sc)rollen in meinem CDialog aufgefallen. Mein CDialog ist in der Größe veränderbar (Resizable).

    Ich habe ein

    Wenn ich den Scrollbalken nach unten setze und dann das Fenster in der Höhe vergrößere, dann wird das Fenster selbst vergrößert und die Komponenten bleiben an ihrer Position stehen was zur Folge hat dass es aussieht als wären die Komponenten nach oben über das Fenster hinaus verschoben worden.
    Wenn ich dann den Scrollbalken wieder verschiebe ist zwar alles wieder an Ort und Stelle, aber würde den Bug trozdem gerne beseitigen.

    Ich verwende folgenden Code:

    void CMainDlg::OnSize(UINT nType, int cx, int cy)
    {
    	CDialog::OnSize(nType, cx, cy);
    	m_iCurHeight = cy;
    
    	SCROLLINFO si;
    	si.cbSize = sizeof(SCROLLINFO);
    	si.fMask = SIF_ALL; 
    	si.nMin = 0;
    	si.nMax = m_rcOriginalRect.Height();
    	si.nPage = cy;
    	si.nPos = 0;
       SetScrollInfo(SB_VERT, &si, TRUE); 	
    }
    
    void CMainDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
    {
    	int iDelta;
    	int iMaxPos = m_rcOriginalRect.Height()-m_iCurHeight+m_iWndTabDif;
    
    	switch (nSBCode)
    	{
    	case SB_LINEDOWN:
    		if (m_iScrollPos >= iMaxPos)
    			return;
    
    		iDelta = min(max(iMaxPos/20,5),iMaxPos-m_iScrollPos);
    		break;
    
    	case SB_LINEUP:
    		if (m_iScrollPos <= 0)
    			return;
    		iDelta = -min(max(iMaxPos/20,5),m_iScrollPos);
    		break;
    	case SB_PAGEDOWN:
    		if (m_iScrollPos >= iMaxPos)
    			return;
    		iDelta = min(max(iMaxPos/10,5),iMaxPos-m_iScrollPos);
    		break;
    	case SB_THUMBTRACK:
    	case SB_THUMBPOSITION:
    		iDelta = (int)nPos - m_iScrollPos;
    		break;
    
    	case SB_PAGEUP:
    		if (m_iScrollPos <= 0)
    			return;
    		iDelta = -min(max(iMaxPos/10,5),m_iScrollPos);
    		break;
    
             default:
    		return;
    	}
    	m_iScrollPos += iDelta;
    	SetScrollPos(SB_VERT, m_iScrollPos, TRUE);
    	ScrollWindow(0,-iDelta);
    	CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
    }
    

    Danke und Lg
    Kerberos


  • Mod

    Was bitte ist m_iCurHeight? Wenn es die fensterhöhe ist, wird diie nicht aktualisiert!
    Warum berücksichtigst Du das nicht gleich im Scrollbereich? Der sollte nur so groß sein, wie Gesamthöhe-Fensterhöhe.



  • Hi Martin,

    sorry für die späte Antwort, aber da ich mein Projekt am Freitag auf VS2008 umgestellt habe und dies zuhause öffnen wollte (VS2005) war dies nicht möglich.

    Das Ganze ist etwas komplizierter, da sich die Größe meines Fenster dynamisch ergibt und sich auch zur Laufzeit ändern kann(unterschiedliche anzahl von Buttons auf einem CTabCtrl).

    m_iCurHeight => ist die aktuelle Höhe des Fensters (durch Änderungen)
    m_rcOriginalRect => ist die aktuelle Größe des CTabCtrl
    m_iWndTabDif => ist die Differenz zwischen dem Fenster und dem leeren CTabCtrl, die hinzufgefügt werden muss.

    Das Problem ist mir zwar klar, aber ich weiss nicht wie ich es lösen kann.
    Ich scrolle ganz nach unten und dann vergrößere ich die Höhe des Fensters. Dadurch müsste ja der Scrollbalken kleiner werden, bei mir springt er aber nach oben und das Fenster wird quasi nach unten verschoben.

    Danke
    Lg Kerberos


  • Mod

    Kopiere am Besten Code von CScrollView... dann weißt Du wie es geht...

    Dein Problem ist folgendes:
    1. Dein Scrollrange stimmt nicht (ist zu groß).
    2. Wenn Der Scrollbereich sich vergrößert musst Du evtl. auch die aktuelle Position anpassen. Siehe UpdateBars in CScrollView...


Anmelden zum Antworten