CScrollBar, keine Nachrichten? Wie steuern?



  • Hallo,

    ich habe ein SDI Fenster mit MFC gemacht ohne Unterstützung von Dokument-/Ansichtarchitektur. In der dortigen freien weißen Fläche habe ich mit OnPaint rum gepinselt. Dort brauche ich nun eine Scrollbar und mal nicht, mal brauch sich sie ganz rechts, mal in der mitte, mal in voller länger, mal nur halb so lang. Das alles funktioniert soweit .. kein Thema. Ich verwende dafür eine Klasse (CScrollBarControl) die von CScrollBar abgeleitet ist.

    Ich weiß das beim erstellen vom Fenster eine Scrollbar mit angegeben werden kann, aber ich denke das die für meine Zwecke nicht richtig ist. Sie soll ja in ihrer Position und größer zur Laufzeit geändert werden und sie darf eben nicht den ganzen Fensterinhalt verschieben. Sondern je nachdem nur nen Teilbereich.

    Das Problem ist jetzt wenn ich auf meine eigene Scrollbar klicke, sei es auf die Pfeile oder den Schieber bzw den freien Flächen darüber oder darunter nichts passiert. Beim Mausklick wird zwar WM_LBUTTONDOWN gesendet die auch bei meiner Klasse ankommt aber ich bekomme keine WM_VSCROLL oder WM_HSCROLL. Bei PretranslateMessage kommt auch nichts an, unabhängig davon ob ich diese in CScrollBarControl habe oder in CChildView. Die Instanz der Scrollbar Klasse befindet sich in der CChildView Klasse.

    Dann hab ich probiert mit CScrollBar::GetScrollBarInfo(...) weiter zu kommen, die Funktion liefert TRUE zurück aber in rgstate steht scheinbar nichts drin. So als wenn ein Klick auf eines der komponenten der ScrollBar nicht registriert wird.

    // Das steht in OnLButtonDown, rgstate bleibt jedoch leer
    // Auch in OnLButtonUp tut sich da nichts
    
    CScrollBar::OnLButtonUp(nFlags, point);
    
    SCROLLBARINFO	pScrollBarInfo;
    pScrollBarInfo.cbSize	= sizeof(SCROLLBARINFO);
    
    if(!CScrollBar::GetScrollBarInfo(&pScrollBarInfo))
    {
        MessageBox(TEXT("Fehler bei GetScrollBarInfo()"));
        return;
    }
    
    if(pScrollBarInfo.rgstate[5] == STATE_SYSTEM_PRESSED)
    {
        CScrollBar::SetScrollPos( CScrollBar::GetScrollPos() + 10 );
    }
    
    if(pScrollBarInfo.rgstate[1] == STATE_SYSTEM_PRESSED)
    {
        CScrollBar::SetScrollPos( CScrollBar::GetScrollPos() - 10 );
    }
    
    // Der Header meiner Klasse
    
    class CScrollBarControl : public CScrollBar
    {
        DECLARE_DYNAMIC(CScrollBarControl)
    
        public:
        CScrollBarControl();
        virtual ~CScrollBarControl();
    
        void    ShowBar(bool bShow);
        void    Create(DWORD dwStyle, CWnd* pParentWnd, UINT nResourceID);
        int     GetResourceID();
        void    SetScrollBarPos(const CWnd* pWndInsertAfter, int x1, int y1, int xRect, int yRect);
        bool    CheckIsInitialized();	
    
        afx_msg   BOOL  OnEraseBkgnd(CDC* pDC);
        afx_msg   void  OnLButtonDown(UINT nFlags, CPoint point);
        afx_msg   void  OnLButtonUp(UINT nFlags, CPoint point);
    
    // Die Überladungen für H- und VScroll sind wieder rausgelöscht
    
        protected:
    
        DECLARE_MESSAGE_MAP()
    
        int	    mValue_iResourceID;
        bool    mFlag_IsInitialized;
        bool    mFlag_IsShowing;
    };
    

    Hat hier vielleicht jemand ne Lösung für mich? Da OnLButton ja funktioniert, könnte man es ja nutzen aber mir fehlen dann die Ausmaße der Pfeilblöcke und Schieberegler usw usw um das dann so herum zu fummeln.

    gruß
    dennis



  • Hat sich soweit erledigt ...

    ... hab keine Ahnung was ich vorher vergessen hab. Mit probiererei und versuchen und dies und das kommen jetzt in CChildView::OnVScroll() Nachrichten an wenn i auf meine Scrollbar klicke.


Anmelden zum Antworten