Scrollen im CDialog



  • Hi,

    ich habe das Problem dass beim Scrollen meines CDialogs alles was ich in OnPaint zeichne verschoben wird und zwar genau um soviel wie ich gescrollt habe.

    Wie kann ich das verhindern??

    Initalisierung

    CRect rcWindow;
    		GetWindowRect(rcWindow);
    		if(rcWindow.Width() < iWidth)
    		{
    			m_iWidth = iWidth;
    			m_iHScrollWidth = m_iWidth-rcWindow.Width() + m_iSpaceX;
    			SetScrollRange(SB_HORZ, 0, m_iHScrollWidth);
    			ShowScrollBar (SB_HORZ, TRUE);
    		}
    		else
    		{
    			m_iWidth = rcWindow.Width();
    			ShowScrollBar(SB_HORZ, FALSE);
    		}
    

    iWidth ist die Breite der Zeichnung.

    Eventhandler für die Scrollbar:

    void CExpertModeDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
    {
    	int iDelta;
    	switch (nSBCode)
    	{
    		case SB_LINERIGHT:
    				if (m_iHScrollPos >= m_iHScrollWidth)
    				{
    					return;
    				}
    				iDelta = 5;
    
    				break;
    
    		case SB_LINELEFT:
    				if (m_iHScrollPos <= 0)
    				{
    					return;
    				}
    				iDelta = -5;
    
    				break;
    
    		case SB_PAGERIGHT:
    				if (m_iHScrollPos >= m_iHScrollWidth)
    				{
    					return;
    				}
    				iDelta = 5;
    				break;
    
    		case SB_THUMBTRACK:
    		case SB_THUMBPOSITION:
    				iDelta = (int)nPos - m_iHScrollPos;
    				break;
    
    		case SB_PAGELEFT:
    				if (m_iHScrollPos <= 0)
    				{
    					return;
    				}
    				iDelta = -5;
    				break;
    
    		default:
    				return;
    		}
    
    		m_iHScrollPos += iDelta;
    		SetScrollPos(SB_HORZ, m_iHScrollPos);
    		ScrollWindow(-iDelta, 0);
    		CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
    }
    

    Lg und Danke
    Kerberos


  • Mod

    Das ist so auch falsch.
    Ermittle in OnPaint die Scrollparameter und setze Dir den entsprechenden Viewport.
    Dann kannst Du ScrollWindow in Deinem OnScroll Handler vergessen.

    Grund: Du musst die aktuellen Scrollbar Parameter in OnPaint berücksichtigen. Sonst zeichnet der doch immer auf ide alten Koordinaten...



  • Hi Martin,

    Viewport ist ein Teilbereich einer Grafik, die größer ist als das Fenster / Display auf dem diese angezeigt wird? Nicht dass du was anderes meinst wie ich 🙂

    Wie setze ich denn den aktuellen Viewport, soetwas wie SetViewPort(...) gibt es nicht und wenn ich hier im Forum nach ViewPort suche finde ich auch nichts das mir weiterhilft.

    ScrollWindow werde ich wahrscheinlich trozdem benötigen, da ich auch noch buttons auf meinem Dialog habe.

    Lg und Danke
    Kerberos


  • Mod

    Damit Du verstehst was ich meine lies mal bitte:
    http://msdn.microsoft.com/en-us/library/bb787531(VS.85).aspx



  • Hi,

    Danke für Deine Hilfe, Martin!

    Ich hab das jetzt einfach so gelöst, dass ich einen Offset in der OnPaint
    Methode eingeführt habe. Dieser Offset beinhaltet genau den Wert um den das Fenster mit der Scrollbar verschoben wurde. Alle Objekte werden jetzt um diesen Offset-Wert verschoben gezeichnet.

    Funktioniert wunderbar.

    Lg
    Kerberos


  • Mod

    So meinte ich es 🕶


Anmelden zum Antworten