CStatic will nicht scrollen

Thopeto

Erfahrenes Mitglied
Hallo

Ich hab mir von CStatic abgeleitete Klasse erstellt, in dem ich eine virtuale Tastatur zeichne. Wenn ich beim Create der Klasse SW_VSCROLL und SW_HSCROLL angebe, dann werden auch die Scrollbalken angezeigt, aber sie scrollen nicht. Wie kann ich es ändern?

Gruß
Thorsten
 
das hilft nicht wirklich. das mit WM_HSCROLL usw war ja klar, aber wie genau das aussieht weiß ich nicht. hat jmd ein beispiel? aber bitte kein codeguru und co...das ist zu allg. und hab da auch schon gesucht
 
Ich habe hier mal ein Beispiel für einen Dialog, das sich aber prinzipiell auch auf andere Fenster (Static-Control) anwenden läßt

Das ist der Initialisierungteil, der z.B. in OnInitDialog untergebracht werden kann:
Code:
SCROLLINFO si;
si.fMask = SIF_PAGE | SIF_RANGE;
si.nPage = nWidth;      // Breite des Fensters
si.nMin  = 0;
si.nMax  = nHScrollMax; // Breite des Scrollbereiches
SetScrollInfo(SB_HORZ, &si, FALSE);

si.fMask = SIF_PAGE | SIF_RANGE;
si.nPage = nHeight;     // Höhe des Fensters
si.nMin  = 0;
si.nMax  = nVScrollMax; // Höhe des Scrollbereiches
SetScrollInfo(SB_VERT, &si, FALSE);

Das sind die Messagehandler für WM_VSCROLL und WM_HSCROLL
Code:
void CScrollDialog::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
    CRect rcClient;
    GetClientRect(&rcClient);

    int nCurPos     = GetScrollPos(SB_VERT);
    int nPrevPos    = nCurPos;

    switch (nSBCode)
    {
        case SB_TOP:    
            nCurPos = 0;
            break;
        case SB_BOTTOM:
            nCurPos = GetScrollLimit(SB_VERT) - 1;
            break;
        case SB_LINEUP:
            nCurPos = max(nCurPos - 6, 0);
            break;
        case SB_LINEDOWN:
            nCurPos = min(nCurPos + 6, GetScrollLimit(SB_VERT) - 1);
            break;
        case SB_PAGEUP:
            nCurPos = max(nCurPos - rcClient.Height(), 0);
            break;
        case SB_PAGEDOWN:
            nCurPos = min(nCurPos + rcClient.Height(), GetScrollLimit(SB_VERT) - 1);
            break;
        case SB_THUMBTRACK:
            nCurPos = nPos;
            break;
    }

    ScrollWindow(0, nPrevPos - nCurPos, NULL, NULL);
    SetScrollPos(SB_VERT, nCurPos, TRUE);
    
    CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}

void CScrollDialog::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
    CRect rcClient;
    GetClientRect(&rcClient);

    int nCurPos     = GetScrollPos(SB_HORZ);
    int nPrevPos    = nCurPos;

    switch( nSBCode )
    {
        case SB_LEFT:
            nCurPos = 0;
            break;
        case SB_RIGHT:
            nCurPos = GetScrollLimit(SB_HORZ) - 1;
            break;
        case SB_LINELEFT:
            nCurPos = max(nCurPos - 6, 0);
            break;
        case SB_LINERIGHT:
            nCurPos = min(nCurPos + 6, GetScrollLimit(SB_HORZ) - 1);
            break;
        case SB_PAGELEFT:
            nCurPos = max(nCurPos - rcClient.Width(), 0);
            break;
        case SB_PAGERIGHT:
            nCurPos = min(nCurPos + rcClient.Width(), GetScrollLimit(SB_HORZ) - 1);
            break;
        case SB_THUMBTRACK:
        case SB_THUMBPOSITION:
            nCurPos = nPos;
            break;
    }

    ScrollWindow(nPrevPos - nCurPos, 0, NULL, NULL);
    SetScrollPos(SB_HORZ, nCurPos, TRUE);

    CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
 
Zurück