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

[WinApi] Przewijanie dwóch kontrolek

Ostatnio zmodyfikowano 2012-06-10 21:12
Autor Wiadomość
xevuel
» 2012-06-10 18:06:09
pójść w strone dynamicznego rozszerzania obu kontrolek ?
Czytaj uważnie posty, które piszą do ciebie inni. Wyjaśniłem ci już, że to rozwiązanie jest bez sensu.

Jak? Tworzysz scrollbar, odbierasz komunikat, przewijasz edita o daną wartość, przewijasz static'a o daną wartość. Proste.
P-58184
stream
Temat założony przez niniejszego użytkownika
» 2012-06-10 19:12:49
Nie rozumiem w ogóle tego -,-... głupio opisane, nic się nie da zrozumieć. Mam to:


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

I nic nie działa, psuje w ogóle kontrolki tworząc jakieś dziwne linie..
P-58185
xevuel
» 2012-06-10 19:35:30
głupio opisane, nic się nie da zrozumieć.
Innym się jakoś udaje. Tak btw. to ten kurs jest jednym z najlepszych kursów WinAPI jaki czytałem, a po polsku na pewno lepszego nie znajdziesz.

Ogólnie, ciężko mi coś powiedzieć, bo nie mam pełnego kodu żeby spróbować coś pokombinować, a ten co wrzuciłeś jest prawie identyczny z tym co jest w kursie. Może zamiast bezmyślnie kopiować kod, spróbuj go krok po kroku ręcznie przepisać? Tylko nie tego gotowca, tylko kod z początku, i stopniowo go ulepszać. Na własnym przykładzie mogę powiedzieć, że to bardzo dobra metoda.

Jeśli nie masz w kodzie nic ważnego dla Ciebie, wrzuć go, a ja spróbuję pomóc (choć nie obiecuję, że mi się uda).
P-58189
stream
Temat założony przez niniejszego użytkownika
» 2012-06-10 19:56:31
Jest coraz lepiej, teraz mogę sobie jeździć po pliczku tyle, że otrzymuje coś takiego po przejechaniu na dół i wróceniu..

http://s13.postimage.org/tmf0trfkl/obrazek123.png

W obsłudze WM_SIZE mam:

GetClientRect( hwnd, & rcClient );
MoveWindow( hEdit, 40, 0, rcClient.right-56, rcClient.bottom, TRUE );
MoveWindow( hLines, 0, 0, 40, rcClient.bottom, TRUE );
LineControl();

ZeroMemory( & si, sizeof( si ) );
si.cbSize = sizeof( SCROLLINFO );
si.fMask = SIF_RANGE | SIF_PAGE;
si.nMin = 0;
si.nMax = Edit_GetLineCount( hEdit ) * 15;
si.nPage = rcClient.bottom;
SetScrollInfo( hwnd, SB_VERT, & si, TRUE );

W WM_VSCROLL:

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

  
    ZeroMemory( & si, sizeof( si ) );
    si.cbSize = sizeof( SCROLLINFO );
    si.fMask = SIF_POS;
    si.nPos = pozycja;
  
    SetScrollInfo( hwnd, SB_VERT, & si, TRUE );
break;

A w okienka tworze przez:

hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, Window, APP_NAME, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT , 800, 600, NULL, hMenu, hInstance, NULL );
hEdit = CreateWindowEx( 0, "EDIT", NULL, WS_CHILD | WS_VISIBLE | ES_MULTILINE, 0, 0, 0, 0, hwnd, NULL, hInstance, NULL );   
SetWindowTextA( hEdit, "Wpisz dowolny tekst..." );
hLines = CreateWindowEx( 0, "STATIC", NULL, WS_CHILD | WS_VISIBLE | SS_CENTER,  0, 0, 0, 0, hwnd, NULL, hInstance, NULL );
SetWindowTextA( hLines, "1");

I nie zabardzo wiem na czym polega błąd.. jakby źle wczytywał kontrolki czy coś

P-58196
xevuel
» 2012-06-10 20:10:26
To będzie coś z odświeżaniem kontrolki... Strzelam, że okno nie nadąża jej odrysować.

Jak już wrzucasz kod, to wrzuć cały... nie chce mi się go sklejać z kilku kawałków, poza tym brakuje kilku zadeklarowanych zmiennych i funkcji. Nie mówiąc o tym, że nie podałeś kodu dodającego numery linii do statica i edita.
P-58199
stream
Temat założony przez niniejszego użytkownika
» 2012-06-10 20:19:42
C/C++
#include <windows.h>
#include <windowsx.h>
#include "menu.h"
#include "constans.h"
#define ID_BUTTON1 501
#define ID_BUTTON2 502

LPSTR Window = "Klasa okna";
LPSTR FileName = NULL;
int NumberOfLines, dy, pozycja, max;
MSG Msg;
HWND hEdit, hwnd, hLines;
HMENU hMenu;
RECT rcClient;
HFONT g_hfnNowy;
SCROLLINFO si;
HBRUSH g_hBrush = CreateSolidBrush( RGB( 246, 246, 246 ) ); //Kolor okienka z numerem linii

OPENFILENAME ofn, Ofn; // common dialog box structure
char szFile[ 260 ]; // buffer for file name
HANDLE hFile, hfile; // file handle


LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
void int_to_lpstr( int liczba, char * cache );
void LineControl();
void SizeControl();


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
   
    // WYPEŁNIANIE STRUKTURY
    WNDCLASSEX wc;
   
    wc.cbSize = sizeof( WNDCLASSEX );
    wc.style = CS_DBLCLKS;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    wc.hCursor = LoadCursor( NULL, IDC_ARROW );
    wc.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
    wc.lpszMenuName = NULL;
    wc.lpszClassName = Window;
    wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
   
   
    // Tworzenie klasy okna
    if( !RegisterClassEx( & wc ) )
    {
        MessageBox( NULL, ERROR001, "ERROR 001..", MB_ICONEXCLAMATION | MB_OK );
        return 1;
    }
   
    // Tworzenie OKNA, MENU oraz ładowanie AKCELERATORÓW
    hMenu = LoadMenu( hInstance, MAKEINTRESOURCE( 200 ) );
    HACCEL hAccel = LoadAccelerators( hInstance, MAKEINTRESOURCE( IDR_ACCELERATORS ) );
    if( !hAccel )
    {
        MessageBox( hwnd, ERROR003, "ERROR 003..", MB_ICONEXCLAMATION );
    }
    hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, Window, APP_NAME, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, hMenu, hInstance, NULL );
   
    //Obsługa błędu okna
    if( hwnd == NULL )
    {
        MessageBox( NULL, ERROR002, "ERROR 002..", MB_ICONEXCLAMATION );
        return 1;
    }
   
    hEdit = CreateWindowEx( 0, "EDIT", NULL, WS_CHILD | WS_VISIBLE | ES_MULTILINE, 0, 0, 0, 0, hwnd, NULL, hInstance, NULL );
    SetWindowTextA( hEdit, "Wpisz dowolny tekst..." );
    hLines = CreateWindowEx( 0, "STATIC", NULL, WS_CHILD | WS_VISIBLE | SS_CENTER, 0, 0, 0, 0, hwnd, NULL, hInstance, NULL );
    SetWindowTextA( hLines, "1" );
   
   
   
   
    //Pokazuje okno
    ShowWindow( hwnd, nCmdShow );
    UpdateWindow( hwnd );
   
    // Pętla komunikatowa
    while( GetMessage( & Msg, NULL, 0, 0 ) )
    {
        if( !TranslateAccelerator( hwnd, hAccel, & Msg ) )
        {
            TranslateMessage( & Msg );
            DispatchMessage( & Msg );
        }
    }
   
}

// OBSŁUGA ZDARZEŃ
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
       
    case WM_CLOSE:
        if( MessageBox( hwnd, ESC_INFO, "Wyjść z programu?", MB_YESNO | MB_ICONQUESTION ) == IDYES )
        {
            DestroyWindow( hwnd );
        }
        break;
       
    case WM_DESTROY:
        if( g_hfnNowy != NULL ) DeleteObject( g_hfnNowy );
       
        DeleteObject( g_hBrush );
        PostQuitMessage( 0 );
        break;
       
    case WM_VSCROLL:
        ZeroMemory( & si, sizeof( si ) );
        si.cbSize = sizeof( SCROLLINFO );
        si.fMask = SIF_POS | SIF_PAGE | SIF_TRACKPOS;
        GetScrollInfo( hwnd, SB_VERT, & si );
       
        pozycja = si.nPos;
        max = si.nMax;
       
        switch( LOWORD( wParam ) ) {
        case SB_TOP:
            pozycja = 0;
            break;
        case SB_BOTTOM:
            pozycja = max;
            break;
        case SB_LINEUP:
            if( pozycja > 0 ) {
                pozycja--;
            }
            break;
        case SB_LINEDOWN:
            if( pozycja < max ) {
                pozycja++;
            }
            break;
        case SB_PAGEUP:
            pozycja -= si.nPage;
            if( pozycja < 0 ) {
                pozycja = 0;
            }
            break;
        case SB_PAGEDOWN:
            pozycja += si.nPage;
            if( pozycja > max ) {
                pozycja = max;
            }
            break;
        case SB_THUMBPOSITION:
            pozycja = si.nTrackPos;
            break;
        case SB_THUMBTRACK:
            pozycja = si.nTrackPos;
            break;
        }
       
        dy = -( pozycja - si.nPos );
        ScrollWindowEx( hEdit, 0, dy,( CONST RECT * ) NULL,( CONST RECT * ) NULL,( HRGN ) NULL,( LPRECT ) NULL, SW_SCROLLCHILDREN | SW_INVALIDATE | SW_ERASE );
        ScrollWindowEx( hLines, 0, dy,( CONST RECT * ) NULL,( CONST RECT * ) NULL,( HRGN ) NULL,( LPRECT ) NULL, SW_SCROLLCHILDREN | SW_INVALIDATE | SW_ERASE );
        UpdateWindow( hEdit );
        UpdateWindow( hLines );
       
       
        ZeroMemory( & si, sizeof( si ) );
        si.cbSize = sizeof( SCROLLINFO );
        si.fMask = SIF_POS;
        si.nPos = pozycja;
       
        SetScrollInfo( hwnd, SB_VERT, & si, TRUE );
        break;
       
    case WM_CTLCOLORSTATIC:
        {
            HWND hCtl =( HWND ) lParam;
            HDC hDC =( HDC ) wParam;
           
            if( hCtl == hLines )
            {
                SetBkMode( hDC, TRANSPARENT );
                SetTextColor( hDC, RGB( 160, 160, 160 ) ); //kolor tekstu w okienku z numerem linii
                return( LRESULT ) g_hBrush;
            }
        }
        break;
       
    case WM_SIZE:
        // Zwiekszanie wszystkich okien w aplikacji
        SizeControl();
        break;
       
       
    case WM_COMMAND:
        if(( HWND ) lParam == hEdit )
        {
            LineControl();
        }
       
       
        switch( wParam )
        {
            default:
            break;
        }
        switch( LOWORD( wParam ) )
        {
        case ID_ACC_BACK:
            Edit_Undo( hEdit );
            break;
           
        case ID_ACC_STYLES:
            CHOOSEFONT cfnt;
            LOGFONT lf;
            ZeroMemory( & cfnt, sizeof( CHOOSEFONT ) );
            cfnt.lStructSize = sizeof( CHOOSEFONT );
            cfnt.hwndOwner = hwnd;
            cfnt.Flags = CF_FORCEFONTEXIST | CF_SCREENFONTS;
            cfnt.lpLogFont = & lf;
           
            if( !ChooseFont( & cfnt ) )
            {
                DWORD dwErr = CommDlgExtendedError();
                if( dwErr ) MessageBox( hwnd, "Błąd dialogu stylów.", NULL, MB_ICONEXCLAMATION );
               
            }
            else
            {
                if( g_hfnNowy != NULL )
                     DeleteObject( g_hfnNowy );
               
                g_hfnNowy = CreateFontIndirect( cfnt.lpLogFont );
                if( g_hfnNowy != NULL )
                     SendMessage( hEdit, WM_SETFONT,( WPARAM ) g_hfnNowy, MAKELPARAM( TRUE, 0 ) );
               
            }
            break;
           
        case ID_ACC_F11:
            MessageBox( hwnd, About, "O programie", MB_ICONINFORMATION );
            break;
           
        case ID_ACC_ESC:
            if( MessageBox( hwnd, ESC_INFO, "Wyjść z programu?", MB_YESNO | MB_ICONQUESTION ) == IDYES )
            {
                DestroyWindow( hwnd );
            }
            break;
           
        case ID_ACC_OPEN:
            FileName = NULL;
            ZeroMemory( & ofn, sizeof( ofn ) );
            ofn.lStructSize = sizeof( ofn );
            ofn.hwndOwner = hwnd;
            ofn.lpstrFile = szFile;
            ofn.lpstrFile[ 0 ] = '\0';
            ofn.nMaxFile = sizeof( szFile );
            ofn.lpstrFilter = "Pliki tekstowe (*.txt)\0*.txt\0Wszystkie pliki\0*.*\0";
            ofn.nFilterIndex = 1;
            ofn.lpstrFileTitle = NULL;
            ofn.nMaxFileTitle = 0;
            ofn.lpstrInitialDir = NULL;
            ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
           
            // Pokazanie okna dialogu do otwarcia pliku
            if( GetOpenFileName( & ofn ) == TRUE )
            {
                //Wczytanie zawartości pliku
                LPSTR buffer; //wskaźnik do bufora zawierajacego dane z pliku
                DWORD size, read; //zmienne przechowujące rozmiar pliku i ilość przeczytanych danych
               
                FileName =( LPSTR ) ofn.lpstrFile;
                hFile = CreateFile( ofn.lpstrFile, GENERIC_READ, 0,( LPSECURITY_ATTRIBUTES ) NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,( HANDLE ) NULL ); // generalnie odczytuje plik, ew. wywala blad etc    
                size = GetFileSize( hFile, NULL ); // pobiera rozmiar pliku
                buffer =( LPSTR ) GlobalAlloc( GPTR, size + 1 ); //alokacja zmiennych?...
                ReadFile( hFile, buffer, size, & read, NULL ); //wczytanie zawartości pliku do bufora
                buffer[ size ] = 0; //dopisanie końca wczytywania do bufora
                SetWindowTextA( hEdit, buffer ); // wyswietlenie w hEdit danych z pliku
               
                GlobalFree( buffer ); // zwolnienie buffora
                CloseHandle( hFile ); // zwolnienie uchwytu pliku
            }
           
            //Rozszerzanie okna
            SizeControl();
            LineControl();
           
            break;
           
        case ID_ACC_SAVENEW:
            ZeroMemory( & Ofn, sizeof( Ofn ) );
            Ofn.lStructSize = sizeof( Ofn );
            Ofn.hwndOwner = hwnd;
            Ofn.lpstrFile = szFile;
            Ofn.lpstrFile[ 0 ] = '\0';
            Ofn.nMaxFile = sizeof( szFile );
            Ofn.lpstrFilter = "Pliki tekstowe (*.txt)\0*.txt\0Wszystkie pliki\0*.*\0";
            Ofn.nFilterIndex = 1;
            Ofn.lpstrFileTitle = NULL;
            Ofn.nMaxFileTitle = 0;
            Ofn.lpstrInitialDir = NULL;
            Ofn.lpstrDefExt = "txt";
            Ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
           
            if( GetSaveFileName( & Ofn ) == TRUE )
            {
                LPSTR Buffer;
                DWORD Size, Read;
               
                hfile = CreateFile( Ofn.lpstrFile, GENERIC_WRITE, 0,( LPSECURITY_ATTRIBUTES ) NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,( HANDLE ) NULL );
                Size = GetWindowTextLength( hEdit );
                Buffer =( LPSTR ) GlobalAlloc( GPTR, Size + 1 );
                GetWindowText( hEdit, Buffer, Size + 1 );
                Buffer[ Size ] = 0;
                WriteFile( hfile, Buffer, Size, & Read, NULL );
               
                GlobalFree( Buffer );
                CloseHandle( hfile );
               
                MessageBox( 0, "Plik został pomyślnie zapisany.", "Informacja!", MB_ICONINFORMATION );
               
            }
            break;
           
        case ID_ACC_SAVE:
            if( !( FileName == NULL ) )
            {
                LPSTR Buffer;
                DWORD Size, Read;
               
                hfile = CreateFile( FileName, GENERIC_WRITE, 0,( LPSECURITY_ATTRIBUTES ) NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,( HANDLE ) NULL );
                Size = GetWindowTextLength( hEdit );
                Buffer =( LPSTR ) GlobalAlloc( GPTR, Size + 1 );
                GetWindowText( hEdit, Buffer, Size + 1 );
                Buffer[ Size ] = 0;
                WriteFile( hfile, Buffer, Size, & Read, NULL );
               
                GlobalFree( Buffer );
                CloseHandle( hfile );
            } else {
                ZeroMemory( & Ofn, sizeof( Ofn ) );
                Ofn.lStructSize = sizeof( Ofn );
                Ofn.hwndOwner = hwnd;
                Ofn.lpstrFile = szFile;
                Ofn.lpstrFile[ 0 ] = '\0';
                Ofn.nMaxFile = sizeof( szFile );
                Ofn.lpstrFilter = "Pliki tekstowe (*.txt)\0*.txt\0Wszystkie pliki\0*.*\0";
                Ofn.nFilterIndex = 1;
                Ofn.lpstrFileTitle = NULL;
                Ofn.nMaxFileTitle = 0;
                Ofn.lpstrInitialDir = NULL;
                Ofn.lpstrDefExt = "txt";
                Ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
               
                if( GetSaveFileName( & Ofn ) == TRUE )
                {
                    LPSTR Buffer;
                    DWORD Size, Read;
                   
                    FileName =( LPSTR ) Ofn.lpstrFile;
                    hfile = CreateFile( Ofn.lpstrFile, GENERIC_WRITE, 0,( LPSECURITY_ATTRIBUTES ) NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,( HANDLE ) NULL );
                    Size = GetWindowTextLength( hEdit );
                    Buffer =( LPSTR ) GlobalAlloc( GPTR, Size + 1 );
                    GetWindowText( hEdit, Buffer, Size + 1 );
                    Buffer[ Size ] = 0;
                    WriteFile( hfile, Buffer, Size, & Read, NULL );
                   
                    GlobalFree( Buffer );
                    CloseHandle( hfile );
                   
                    MessageBox( 0, "Plik został pomyślnie zapisany.", "Informacja!", MB_ICONINFORMATION );
                   
                }
               
            }
            break;
           
        case ID_ACC_NEW:
            //Wyczyszczenie hEdit i nazwy pliku, reset numerowania linii
            SetWindowTextA( hEdit, "Wpisz dowolny tekst..." );
            FileName = NULL;
            SetWindowTextA( hLines, "1" );
           
            //Rozszerzanie okna
            SizeControl();
            break;
           
            default:
            break;
        }
        break;
       
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
   
    return 0;
}

void int_to_lpstr( int liczba, char * cache )
{
    wsprintf( cache, "%d", liczba );
}

void LineControl()
{
    LPSTR Buffer;
    DWORD Size, Read;
    char test[ 10 ];
   
    GetClientRect( hwnd, & rcClient );
    NumberOfLines = Edit_GetLineCount( hEdit );
    Size = NumberOfLines * 3;
    Buffer =( LPSTR ) GlobalAlloc( GPTR, Size + 1 );
    for( int i = 1; i <= NumberOfLines; i++ )
    {
        int_to_lpstr( i, test );
        lstrcat( Buffer, test );
        lstrcat( Buffer, "\n" );
    }
    SetWindowTextA( hLines, Buffer );
    GlobalFree( Buffer );
}

void SizeControl()
{
    GetClientRect( hwnd, & rcClient );
    MoveWindow( hEdit, 40, 0, rcClient.right - 56, rcClient.bottom, TRUE );
    MoveWindow( hLines, 0, 0, 40, rcClient.bottom, TRUE );
    LineControl();
   
    ZeroMemory( & si, sizeof( si ) );
    si.cbSize = sizeof( SCROLLINFO );
    si.fMask = SIF_RANGE | SIF_PAGE;
    si.nMin = 0;
    si.nMax = Edit_GetLineCount( hEdit ) * 15;
    si.nPage = rcClient.bottom;
    SetScrollInfo( hwnd, SB_VERT, & si, TRUE );
}
P-58202
xevuel
» 2012-06-10 20:45:56
O ironio! Błąd był tam, gdzie się tego najmniej spodziewałem... A wystarczyło uważnie przeczytać kurs... Podpowiedź: Zastanów się, jaki uchwyt przekazujesz funkcji ScrollWindowEx a jaki jest podany w kursie.

//edit: Trochę dziwnie się ten scrollbar pokazuje, no i zrobiłbym jeszcze przewijanie na wheelowanie, czyli kręcenie kółkiem myszy, ale to już takie podpowiedzi niezwiązane z tematem.
P-58207
stream
Temat założony przez niniejszego użytkownika
» 2012-06-10 21:11:03
[code=c]ScrollWindowEx( hEdit, 0, dy,( CONST RECT * ) NULL,( CONST RECT * ) NULL,( HRGN ) NULL,( LPRECT ) NULL, SW_SCROLLCHILDREN | SW_INVALIDATE | SW_ERASE );         ScrollWindowEx( hLines, 0, dy,( CONST RECT * ) NULL,( CONST RECT * ) NULL,( HRGN ) NULL,( LPRECT ) NULL, SW_SCROLLCHILDREN | SW_INVALIDATE | SW_ERASE );[/code]

Chodzi o hEdit oraz hLines? Powinnien być tam uchwyt do okna głównego czyli "hwnd" ? Jeśli tak to w jaki sposób mam przewijać te dwie kontrolki...
P-58211
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona