WS_VSCROLL - Scrollbar scrollt nicht? was muss man machen?



  • Hallo,
    bin noch Anfänger und denke, dass mir hier schnell jemand bei meinem Problem helfen kann.

    Ich habe ein Fenster (welches in einem anderen Fenster ist) ohne Rahmen und ohne Möglichkeit es größer oder kleiner zu machen. Mit WS_VSCROLL habe ich diesem Fenster eine Scrollbar gegeben und das Fenster mit Inhalten gefüllt (zum Testen einfach mehrere Buttons untereinander)

    Bei der Create Methode vom Fenster habe ich ja die Größe angegeben, dies ist die Größe in der das Fenster dargestellt werden soll. Jetzt habe ich gehofft, dass wenn ich einen Button außerhalb des Fensters einfüge, dass man dann dahin runterscrollen kann. So einfach ist das natürlich nicht. Im Moment hat die Scrollbar keine Funktion und man kann den Button somit nicht sehen.

    Testhalber habe ich dem Fenster mal einen Rahmen gegeben um die Größe verändert zu können. mache ich es jetzt größer, sieht man den Button. Aber selbst wenn ich das Fenster jetzt kleiner mache, kann ich mit der Scrollbar immer noch nicht scrollen.

    Was muss man machen damit die mit WS_VSCROLL erstellte Scrollbar eine Funktion bekommt?



  • Ich bin jetzt kein Profi auf dem Gebiet, aber ich glaube nicht, dass es da in Windows eine eingebaute Funktionalität gibt, für das, was du versuchst zu erreichen. Meiner Meinung nach muss du die ganzen mit Scrollbars verbundenen WM-Nachrichten verarbeiten und die Child-Controls per Hand bewegen. Dafür kann man sich über die API-Funktionen aber bestimmt etwas "generisches" zusammenbasteln, das man nicht immer anpassen muss, wenn ein neues Child-Fenster hinzukommt.

    Hier ist ein Überblick über Scrollbars der auf mich einen anständigen Eindruck macht:
    http://msdn.microsoft.com/en-us/library/windows/desktop/bb787527(v=vs.85).aspx



  • danke, Ich habe selber noch ein bisschen gesucht und ich habe hier: http://www.codeproject.com/Articles/2283/Scrollbars-using-the-WS_HSCROLL-and-WS_VSCROLL-sty ein gutes Beispiel gefunden.
    Ich musste nur die Funktion

    void PartWindow::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
    {
    	// its horizontal scroll bar 
    	int nCurPos = GetScrollPos(SB_VERT) ;
    	int nPrevPos = nCurPos;
    	// decide what to do for each diffrent scroll event
    	switch(nSBCode)
    		{
    		case SB_LEFT:			nCurPos = 0;
    								break;
    		case SB_RIGHT:			nCurPos = GetScrollLimit(SB_VERT)-1;
    								break;
    		case SB_LINELEFT:		nCurPos = max(nCurPos - 6, 0);
    								break;
    		case SB_LINERIGHT:		nCurPos = min(nCurPos + 6, GetScrollLimit(SB_VERT)-1);
    								break;
    		case SB_PAGELEFT:		nCurPos = max(nCurPos - m_ClientSize.Height(), 0);
    								break;
    		case SB_PAGERIGHT:		nCurPos = min(nCurPos + m_ClientSize.Height(), GetScrollLimit(SB_VERT)-1);
    								break;
    		case SB_THUMBTRACK:
    		case SB_THUMBPOSITION:  nCurPos = nPos;
    							    break;
    		}		
    
    	SetScrollPos(SB_VERT, nCurPos);
    	ScrollWindow(0, nPrevPos - nCurPos) ;
    	CWnd::OnVScroll(nSBCode, nPos, pScrollBar);
    }
    

    und natürlich

    BEGIN_MESSAGE_MAP(PartWindow, CWnd)
    	ON_WM_VSCROLL()
    END_MESSAGE_MAP()
    

    hinzufügen, jetzt klappt alles wie ich es mir vorgestellt habe


Anmelden zum Antworten