Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WinApi] Problem z scrollbarem.

Ostatnio zmodyfikowano 2012-08-01 08:10
Autor Wiadomość
ziombel3
Temat założony przez niniejszego użytkownika
[WinApi] Problem z scrollbarem.
» 2012-07-31 11:08:25
Witam. Mam problem z scrollbarem. Mogę przesuwać okno tylko w dół.(działa tylko SB_LINEDOWN. Mam Microsoft Visual C++ 2010 Express. Jak rozwiązać ten problem?
Oto kod:

   g_hScrollBar = CreateWindowEx( 0, _T("SCROLLBAR"), NULL, WS_BORDER | WS_CHILD | WS_VISIBLE |SBS_VERT, 775, 0, 15, 500, hWnd, NULL, hInstance, NULL );
   RECT okno;
GetClientRect( hWnd, & okno );

SCROLLINFO si;
ZeroMemory( & si, sizeof( si ) );

si.cbSize = sizeof( SCROLLINFO );
si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS;
si.nMin = 0;
si.nMax = 1000;
si.nPage = okno.bottom;
si.nPos = 0;
SetScrollInfo( g_hScrollBar, SB_CTL, & si, TRUE );

+


case WM_VSCROLL: {
  
    SCROLLINFO si;
    ZeroMemory( & si, sizeof( si ) );
    si.cbSize = sizeof( SCROLLINFO );
    si.fMask = SIF_POS | SIF_PAGE | SIF_TRACKPOS;
    GetScrollInfo( hWnd, SB_VERT, & si );
  
    int pozycja = si.nPos;
  
    switch( LOWORD( wParam ) ) {
    case SB_TOP:
        pozycja = 0;
        break;
    case SB_BOTTOM:
        pozycja = 1000;
        break;
    case SB_LINEUP:
        if( pozycja > 0 ) {
            pozycja=pozycja-10;
        }
        break;
    case SB_LINEDOWN:
        if( pozycja < 1000 ) {
            pozycja=pozycja+10;
        }
        break;
    case SB_PAGEUP:
        pozycja -= si.nPage;
        if( pozycja < 0 ) {
            pozycja = 0;
        }
        break;
    case SB_PAGEDOWN:
        pozycja += si.nPage;
        if( pozycja > 1000 ) {
            pozycja = 1000;
        }
        break;
    case SB_THUMBPOSITION:
        pozycja = si.nTrackPos;
        break;
    case SB_THUMBTRACK:
        pozycja = si.nTrackPos;
        break;
    }
  
    int dy = -( pozycja - si.nPos );
    ScrollWindowEx( hWnd, 0, dy,( CONST RECT * ) NULL,( CONST RECT * ) NULL,( HRGN ) NULL,( LPRECT ) NULL, SW_SCROLLCHILDREN | SW_INVALIDATE | SW_ERASE );
    UpdateWindow( hWnd );
  
    ZeroMemory( & si, sizeof( si ) );
    si.cbSize = sizeof( SCROLLINFO );
    si.fMask = SIF_POS;
    si.nPos = pozycja;
  
    SetScrollInfo( hWnd, SB_VERT, & si, TRUE );
}
break;

P-61484
DejaVu
» 2012-07-31 18:23:14
Postaw breakpointa na SB_LINEUP i sprawdź czy przychodzi komunikat. Jak nie przychodzi komunikat to będzie trzeba ustalić dlaczego.
P-61514
ziombel3
Temat założony przez niniejszego użytkownika
» 2012-08-01 08:10:05
Nigdy nie ustawiałem breakpointów więc nie wiem czy to dobrze zrobiłem(wstawiłem breakpoint wchodząc w Debug -> Toggle Breakpoint. Postawiłem 1 bezpośrednio na CASE: SB_LINEUP i resztę na każdej linijce kodu w tym zdarzeniu. Zmienna pozycja ma wartość 0. Wszystkie linie przechodzą zawsze. Wstawiłem także messageboxa i on działa. Ale znalazłem już chyba źródło problemu. Kwadrat na pasku przesuwu się nie przesuwa. Problem jest ze zmienną pozycja bo linedown działa dlatego że tam pozycja musi być <1000 a ma wartość 0 cały czas.
P-61556
« 1 »
  Strona 1 z 1