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. |
|
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.. |
|
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). |
|
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ś |
|
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. |
|
stream Temat założony przez niniejszego użytkownika |
» 2012-06-10 20:19:42 #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 ) );
OPENFILENAME ofn, Ofn; char szFile[ 260 ]; HANDLE hFile, hfile;
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 ) { 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 ); if( !RegisterClassEx( & wc ) ) { MessageBox( NULL, ERROR001, "ERROR 001..", MB_ICONEXCLAMATION | MB_OK ); return 1; } 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 ); 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" ); ShowWindow( hwnd, nCmdShow ); UpdateWindow( hwnd ); while( GetMessage( & Msg, NULL, 0, 0 ) ) { if( !TranslateAccelerator( hwnd, hAccel, & Msg ) ) { TranslateMessage( & Msg ); DispatchMessage( & Msg ); } } }
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 ) ); return( LRESULT ) g_hBrush; } } break; case WM_SIZE: 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; if( GetOpenFileName( & ofn ) == TRUE ) { LPSTR buffer; DWORD size, read; FileName =( LPSTR ) ofn.lpstrFile; hFile = CreateFile( ofn.lpstrFile, GENERIC_READ, 0,( LPSECURITY_ATTRIBUTES ) NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,( HANDLE ) NULL ); size = GetFileSize( hFile, NULL ); buffer =( LPSTR ) GlobalAlloc( GPTR, size + 1 ); ReadFile( hFile, buffer, size, & read, NULL ); buffer[ size ] = 0; SetWindowTextA( hEdit, buffer ); GlobalFree( buffer ); CloseHandle( hFile ); } 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: SetWindowTextA( hEdit, "Wpisz dowolny tekst..." ); FileName = NULL; SetWindowTextA( hLines, "1" ); 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 ); } |
|
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. |
|
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... |
|
1 « 2 » 3 |