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

winapi - zapisuje pusty plik .txt

Ostatnio zmodyfikowano 2013-11-08 23:05
Autor Wiadomość
cwanish
Temat założony przez niniejszego użytkownika
winapi - zapisuje pusty plik .txt
» 2013-11-08 21:37:01
Dzień dobry.
Mam problem z programem z tutejszego poradnika. Chcę, by tekst zapisywany w polu tekstowym trafiał do test.txt
Niestety test.txt pozostaje pusty.
Chyba brakuje jakiegoś szczegółu, ale nie potrafię znaleźć.
Proszę o pomoc.

PS: Myślę, że to może GetWindowTextLength( hText );jest w niewłaściwym miejscu. Gdzie powinno być, aby liczone były znaki już po wpisaniu ich do pola tekstowego?
Czy to coś innego?

C/C++
#include <windows.h>
#include <cstdlib>
#define ID_PRZYCISK1 501
#define ID_PRZYCISK2 502
#define ID_PRZYCISK_CANCEL 503
#define ID_TEXTBOX 504
LPSTR NazwaKlasy = "Klasa Okienka";
MSG Komunikat;

HWND hButton1, hButton2, hButton_cancel; //buttons
LPSTR Bufor; // do zapisu pliku
DWORD dwRozmiar, dwZapisane;
HANDLE hPlik;


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, "Program", WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT, 400, 600, NULL, NULL, hInstance, NULL );
   
    if( hwnd == NULL )
    {
        MessageBox( NULL, "Okno odmówiło przyjścia na świat!", "Ale kicha...", MB_ICONEXCLAMATION );
        return 1;
    }
    // Miejsce na przyciski
   
    HWND hButton1 = CreateWindowEx( WS_EX_CLIENTEDGE, "BUTTON", "Pierwszy", WS_CHILD | WS_VISIBLE |
    WS_BORDER, 5, 5, 150, 30, hwnd,( HMENU ) ID_PRZYCISK1, hInstance, NULL ),
    hButton2 = CreateWindowEx( WS_EX_CLIENTEDGE, "BUTTON", "Drugi", WS_CHILD | WS_VISIBLE |
    WS_BORDER, 5, 40, 150, 30, hwnd,( HMENU ) ID_PRZYCISK2, hInstance, NULL );
   
    hButton_cancel = CreateWindowEx( WS_EX_CLIENTEDGE, "BUTTON", "Cancel", WS_CHILD | WS_VISIBLE | // Cancel button
    WS_BORDER, 228, 5, 150, 30, hwnd,( HMENU ) ID_PRZYCISK_CANCEL, hInstance, NULL );
   
    //text box
    HWND hText = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER |
    WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 5, 75, 200, 300, hwnd,( HMENU ) ID_TEXTBOX, hInstance, NULL );
    //-----------CZYTA DŁUGOŚĆ POLA TEKSTOWEGO I ZAPISUJE TEKST DO PLIKU - TUTAJ PROBLEM----------------
    hPlik = CreateFile( "test.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 ); //gdy if prawdziwe, kończy program, a jest prawdziwe, bo na na starcie programu pole tekstowe jest puste
    /*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
    //-----------
   
   
   
   
   
   
   
    ShowWindow( hwnd, nCmdShow ); // Pokaż okienko...
    UpdateWindow( hwnd );
   
    // 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_COMMAND:
        switch( wParam )
        {
        case ID_PRZYCISK1:
            {
                MessageBox( hwnd, "Wcisnąłeś przycisk 1", "Test", MB_ICONINFORMATION );
               
            } break;
           
        case ID_PRZYCISK2:
            MessageBox( hwnd, "Wcisnąłeś przycisk 2", "Test", MB_ICONINFORMATION );
            break;
           
        case ID_TEXTBOX:
            //MessageBox( hwnd, "Wcisnąłeś przycisk 2", "Test", MB_ICONINFORMATION );
            break;
           
        case ID_PRZYCISK_CANCEL:
            //MessageBox( hwnd, "Wcisnąłeś Cancel", "Test", MB_ICONINFORMATION );
            exit( 0 );
            break;
           
            default:
            return DefWindowProc( hwnd, msg, wParam, lParam );
        }
        break;
       
    case WM_CLOSE:
        DestroyWindow( hwnd );
        break;
       
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
       
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
   
    return 0;
}
P-95721
pekfos
» 2013-11-08 21:41:07
Dlaczego to jest w WinMain()?
P-95722
cwanish
Temat założony przez niniejszego użytkownika
» 2013-11-08 22:03:59
Ajoj...
Gdzie powinno być?
Po jakiej linijce?
P-95726
den93
» 2013-11-08 22:08:53
np. w funkcji, którą następnie wywołujesz po naciśnięciu np. buttona z WndProc
P-95727
cwanish
Temat założony przez niniejszego użytkownika
» 2013-11-08 22:18:59
Przeniosłem, ale nadal nie kopiuje. Chyba jednak źle odczytuje ilość danych w polu tekstowym.
C/C++
#include <windows.h>
#include <cstdlib>
#define ID_PRZYCISK1 501
#define ID_PRZYCISK2 502
#define ID_PRZYCISK_CANCEL 503
#define ID_TEXTBOX 504
LPSTR NazwaKlasy = "Klasa Okienka";
MSG Komunikat;
HWND hText;

HWND hButton1, hButton2, hButton_cancel; //buttons
LPSTR Bufor; // do zapisu pliku
DWORD dwRozmiar, dwZapisane;
HANDLE hPlik;


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, "Program", WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT, 400, 600, NULL, NULL, hInstance, NULL );
   
    if( hwnd == NULL )
    {
        MessageBox( NULL, "Okno odmówiło przyjścia na świat!", "Ale kicha...", MB_ICONEXCLAMATION );
        return 1;
    }
    // Miejsce na przyciski
   
    HWND hButton1 = CreateWindowEx( WS_EX_CLIENTEDGE, "BUTTON", "Pierwszy", WS_CHILD | WS_VISIBLE |
    WS_BORDER, 5, 5, 150, 30, hwnd,( HMENU ) ID_PRZYCISK1, hInstance, NULL ),
    hButton2 = CreateWindowEx( WS_EX_CLIENTEDGE, "BUTTON", "Zapisz z pola do pliku", WS_CHILD | WS_VISIBLE |
    WS_BORDER, 5, 40, 250, 30, hwnd,( HMENU ) ID_PRZYCISK2, hInstance, NULL );
   
    hButton_cancel = CreateWindowEx( WS_EX_CLIENTEDGE, "BUTTON", "Cancel", WS_CHILD | WS_VISIBLE | // Cancel button
    WS_BORDER, 228, 5, 150, 30, hwnd,( HMENU ) ID_PRZYCISK_CANCEL, hInstance, NULL );
   
   
    //text box
    HWND hText = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER |
    WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 5, 75, 200, 300, hwnd,( HMENU ) ID_TEXTBOX, hInstance, NULL );
   
    //-----------CZYTA DŁUGOŚĆ POLA TEKSTOWEGO I ZAPISUJE TEKST DO PLIKU - TUTAJ PROBLEM----------------
    /*hPlik = CreateFile( "test.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 ); //gdy if prawdziwe, kończy program, a jest prawdziwe, bo na na starcie programu pole tekstowe jest puste
    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*/
    //-----------
   
   
   
   
   
   
   
    ShowWindow( hwnd, nCmdShow ); // Pokaż okienko...
    UpdateWindow( hwnd );
   
    // 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_COMMAND:
        switch( wParam )
        {
        case ID_PRZYCISK1:
            {
                MessageBox( hwnd, "Wcisnąłeś przycisk 1", "Test", MB_ICONINFORMATION );
               
            } break;
           
        case ID_PRZYCISK2:
            {
                //-----------CZYTA DŁUGOŚĆ POLA TEKSTOWEGO I ZAPISUJE TEKST DO PLIKU - TUTAJ PROBLEM----------------
                hPlik = CreateFile( "test.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 ); //gdy if prawdziwe, kończy program, a jest prawdziwe, bo na na starcie programu pole tekstowe jest puste
                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;
           
        case ID_TEXTBOX:
            //MessageBox( hwnd, "Wcisnąłeś przycisk 2", "Test", MB_ICONINFORMATION );
            break;
           
        case ID_PRZYCISK_CANCEL:
            //MessageBox( hwnd, "Wcisnąłeś Cancel", "Test", MB_ICONINFORMATION );
            exit( 0 );
            break;
           
            default:
            return DefWindowProc( hwnd, msg, wParam, lParam );
        }
        break;
       
    case WM_CLOSE:
        DestroyWindow( hwnd );
        break;
       
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
       
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
   
    return 0;
}
P-95732
den93
» 2013-11-08 22:40:57
HWND hText =...;
Definiowana globalnie i lokalnie, czyli nie modyfikujesz globalnej.
P-95736
cwanish
Temat założony przez niniejszego użytkownika
» 2013-11-08 22:54:49
Uczę się.
Nadal nie rozumiem co powinienem zmienić. Deklarację globalną hTekst dodałem ostatnio, bo w funkcji przycisku była "undeclared"...
Czy mógłbyś skompilować i sam to zmienić?
P-95738
pekfos
» 2013-11-08 22:57:05
Powinieneś usunąć lokalną definicję hText, która przesłania globalne hText.
P-95739
« 1 » 2
  Strona 1 z 2 Następna strona