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

[WinAPI, C++] GetWindowText ucina jeden znak przy odczytywaniu

Ostatnio zmodyfikowano 2013-06-11 18:49
Autor Wiadomość
noindyfikator
Temat założony przez niniejszego użytkownika
[WinAPI, C++] GetWindowText ucina jeden znak przy odczytywaniu
» 2013-06-11 09:47:27
Witam! Mam pewien problem. Mógłby ktoś mnie nakierować co mam zrobić aby w moim programie zostały rozwiązane poniższe problemy...
C/C++
#include <windows.h>

LPSTR NazwaKlasy = "Klasa Okienka";
MSG Komunikat;
HFONT hNormalFont =( HFONT ) GetStockObject( DEFAULT_GUI_FONT );
HWND g_hPrzycisk;
HWND hText;

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
   
    // WYPEŁNIANIE STRUKTURY
    WNDCLASSEX wc;
   
    wc.cbSize = sizeof( WNDCLASSEX );
    wc.style = 0;
    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 = NazwaKlasy;
    wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
   
    // REJESTROWANIE KLASY OKNA
    if( !RegisterClassEx( & wc ) )
    {
        MessageBox( NULL, "Wysoka Komisja odmawia rejestracji tego okna!", "Niestety...",
        MB_ICONEXCLAMATION | MB_OK );
        return 1;
    }
   
    // TWORZENIE OKNA
    HWND hwnd;
   
    hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, NazwaKlasy, "Aplikacja", WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU,
    550, 220, 500, 440, NULL, NULL, hInstance, NULL );
   
    if( hwnd == NULL )
    {
        MessageBox( NULL, "Okno odmówiło przyjścia na świat!", "Ale kicha...", MB_ICONEXCLAMATION );
        return 1;
    }
   
    ShowWindow( hwnd, nCmdShow ); // Pokaż okienko...
    UpdateWindow( hwnd );
   
    hText = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER |
    WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 5, 5, 470, 340, hwnd, NULL, hInstance, NULL );
    g_hPrzycisk = CreateWindowEx( 0, "BUTTON", "Zapisz", WS_CHILD | WS_VISIBLE,
    180, 360, 100, 30, hwnd, NULL, hInstance, NULL );
    SendMessage( g_hPrzycisk, WM_SETFONT,( WPARAM ) hNormalFont, 0 );
   
    // ODCZYT Z PLIKU
   
    LPSTR Bufor;
    DWORD dwRozmiar, dwPrzeczyt;
    HANDLE hPlik;
   
   
    hPlik = CreateFile( "D:\\odczyt.txt", GENERIC_READ, 0, NULL, OPEN_ALWAYS, 0, NULL );
    if( hPlik == INVALID_HANDLE_VALUE ) {
        MessageBox( NULL, "Nie można otworzyć pliku.", "A to pech!", MB_ICONEXCLAMATION );
        PostQuitMessage( 0 ); // Zakończ program
    }
   
    dwRozmiar = GetFileSize( hPlik, NULL );
    if( dwRozmiar == 0xFFFFFFFF ) {
        MessageBox( NULL, "Nieprawidłowy rozmiar pliku!", "Niedobrze...", MB_ICONEXCLAMATION );
        PostQuitMessage( 0 ); // Zakończ program
    }
   
    Bufor =( LPSTR ) GlobalAlloc( GPTR, dwRozmiar + 1 );
    if( Bufor == NULL ) {
        MessageBox( NULL, "Za mało pamięci!", "Ale wiocha...", MB_ICONEXCLAMATION );
        PostQuitMessage( 0 ); // Zakończ program
    }
   
    if( !ReadFile( hPlik, Bufor, dwRozmiar, & dwPrzeczyt, NULL ) ) {
        MessageBox( NULL, "Błąd czytania z pliku", "Dupa blada!", MB_ICONEXCLAMATION );
        PostQuitMessage( 0 ); // Zakończ program
    }
   
    Bufor[ dwRozmiar ] = 0; // dodaj zero na końcu stringa
    SetWindowText( hText, Bufor ); // zrób coś z tekstem, np. wyświetl go
    CloseHandle( hPlik );
   
    // Pętla komunikatów
    while( GetMessage( & Komunikat, NULL, 0, 0 ) )
    {
        TranslateMessage( & Komunikat );
        DispatchMessage( & Komunikat );
    }
    return Komunikat.wParam;
}

// OBSŁUGA ZDARZEŃ
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
    case WM_CLOSE:
        DestroyWindow( hwnd );
        break;
       
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
    case WM_COMMAND:
        if(( HWND ) lParam == g_hPrzycisk )
        {
            LPSTR Bufor;
            DWORD dwRozmiar, dwZapisane;
            HANDLE hPlik;
           
            hPlik = CreateFile( "D:\\odczyt.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL );
            if( hPlik == INVALID_HANDLE_VALUE ) {
                MessageBox( NULL, "Nie można otworzyć pliku.", "A to pech!", MB_ICONEXCLAMATION );
                PostQuitMessage( 0 ); // Zakończ program
            }
           
            dwRozmiar = GetWindowTextLength( hText );
            if( dwRozmiar == 0 ) {
                MessageBox( NULL, "Nieprawidłowy rozmiar pliku!", "Niedobrze...", MB_ICONEXCLAMATION );
                PostQuitMessage( 0 ); // Zakończ program
            }
           
            Bufor =( LPSTR ) GlobalAlloc( GPTR, dwRozmiar + 1 );
            if( Bufor == NULL ) {
                MessageBox( NULL, "Za mało pamięci!", "Ale wiocha...", MB_ICONEXCLAMATION );
                PostQuitMessage( 0 ); // Zakończ program
            }
           
            GetWindowText( hText, Bufor, dwRozmiar ); // skopiuj do bufora tekst z jakiegoś okna
            Bufor[ dwRozmiar ] = 0; // dodaj zero na końcu stringa
           
            if( !WriteFile( hPlik, Bufor, dwRozmiar, & dwZapisane, NULL ) ) {
                MessageBox( NULL, "Błąd zapisu do pliku", "Dupa blada!", MB_ICONEXCLAMATION );
                PostQuitMessage( 0 ); // Zakończ program
            }
           
            GlobalFree( Bufor ); // Zwolnij bufor
            CloseHandle( hPlik ); // Zamknij plik
        }
       
        break;
       
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
   
    return 0;
}
Problem:
1. Dlaczego jak kliknę zapisz i potem sprawdzam co się zapisało to ZAWSZE ucina ostatnią literkę?
P-85368
pekfos
» 2013-06-11 13:23:47
C/C++
GetWindowText( hText, Bufor, dwRozmiar + 1 );
P-85375
noindyfikator
Temat założony przez niniejszego użytkownika
» 2013-06-11 18:49:52
Dziękuję działa ;)
P-85388
« 1 »
  Strona 1 z 1