[WinApi] Problem z scrollbarem.
Ostatnio zmodyfikowano 2012-08-01 08:10
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;
|
|
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. |
|
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. |
|
« 1 » |