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

Problem z MessageBox i TextBox w WinApi

Ostatnio zmodyfikowano 2012-11-27 19:07
Autor Wiadomość
miadko
Temat założony przez niniejszego użytkownika
Problem z MessageBox i TextBox w WinApi
» 2012-11-24 23:11:24
Witajcie

Zaczynam dopiero programowanie w WinApi i ćwicze sobie różne rzeczy od niedawna, ale natknąłem się wczoraj na jeden problem i do dzisiaj nie mogę go rozwiązać. Chodzi o to, żeby wpisać sobie coś do TextBoxa i po naciśnięciu przycisku "Przeczytaj" pojawił się MessageBox, w którego treści pojawi się: Wpisałeś: (tekst). Próbowałem to zrobić, żeby tekst z TextBoxa stał się zmienną, którą potem w treści Messageboxa umieszczę obok jego stałego elementu "Wpisałeś".

Nie wiem jednak, jak zrobić, żeby stałą ze zmienną połączyć w MessageBox, oraz jak zrobić, żeby on w ogóle przeczytał, co wpisałem w TextBoxa. Zdaję sobie sprawę, że są to całkowite podstawy WinApi, ale nie mogę do tego dojść, jak to zrobić.

Program jest z błędem, nie kompiluje się. Błąd jest w funkcji MessageBox.
Możecie pomóc? :)

To mój kod programu:

C/C++
#include <windows.h>
#include <stdlib.h>                                   
#define ID_PRZYCISK3 503

LPSTR NazwaKlasy = "Klasa Okienka";
MSG Komunikat;
HWND gb_hPrzycisk;
TCHAR * Bufor;




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, "I jak ci sie podoba?", WS_OVERLAPPEDWINDOW | WS_SIZEBOX, 100, 100, 600, 400, NULL, NULL, hInstance, NULL );
   
    if( hwnd == NULL )
    {
        MessageBox( NULL, "Okno odmówiło przyjścia na świat!", "Ale kicha...", MB_ICONEXCLAMATION | MB_OK | MB_DEFBUTTON1 );
        return 1;
    }
    ////////////////////////
    // GŁOWNY KOD PROGRAMU//
    ////////////////////////
    HWND gb_hPrzycisk = CreateWindowEx( 0, "BUTTON", "Przeczytaj, co wpisałeś", WS_CHILD | WS_VISIBLE, 165, 182, 170, 30, hwnd,( HMENU ) ID_PRZYCISK3, hInstance, NULL );
    HWND pole_tekstowe_1 = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 9, 185, 150, 25, hwnd, NULL, NULL, NULL );
    SetWindowText( pole_tekstowe_1, "" );
    DWORD dlugosc = GetWindowTextLength( pole_tekstowe_1 );
    LPSTR Bufor =( LPSTR ) GlobalAlloc( GPTR, dlugosc + 1 );
    GetWindowText( pole_tekstowe_1, Bufor, dlugosc + 1 );
    HWND uStatic = CreateWindowEx( 0, "STATIC", NULL, WS_CHILD | WS_VISIBLE | SS_LEFT, 10, 160, 120, 20, hwnd, NULL, hInstance, NULL );
    SetWindowText( uStatic, "Wpisz se tu cos." );
   
    //////////////////////////////////
    // KONIEC GŁOWNEGO KODU PROGRAMU//
    //////////////////////////////////
   
    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_CLOSE:
        DestroyWindow( hwnd );
        break;
       
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
    case WM_COMMAND:
        {
            switch( wParam )
            {
               
            case ID_PRZYCISK3:
               
                {
                    MessageBox( NULL, "Wpisałeś: " Bufor, "Wpisałeś:", MB_OK );
                    GlobalFree( Bufor );
                }
               
            }
        }
        break;
       
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
   
    return 0;
}

Wielkie dzięki za pomoc (
P-69829
Savail
» 2012-11-25 00:03:12
Uchwyt do przycisku masz w lParam, należy go wyciągnąć w ten sposób:
HWND handle =( HWND ) lParam;
Aby pobrać tekst z kontrolki użyj: [MSDN] GetWindowText

W skrócie:
C/C++
case ID_PRZYCISK3:

{
    HWND handle =( HWND ) lParam;
    DWORD dlugosc = GetWindowTextLength( handle );
    LPSTR Bufor =( LPSTR ) GlobalAlloc( GPTR, dlugosc + 1 );
    GetWindowText( handle, Bufor, dlugosc + 1 );
    std::string message = "Wpisales: " +( std::string ) Bufor;
    MessageBox( NULL, message.c_str(), "Wpisałeś:", MB_OK );
    GlobalFree( Bufor );
}

Nie jestem pewien całkowitej poprawności kodu bo pisałem z głowy (częściowo :p)
P-69832
miadko
Temat założony przez niniejszego użytkownika
» 2012-11-25 13:25:37
Witajcie

Zrobiłem tak jak poradził savail, ale program się w wielu miejscach nie kompilował.
Przeanalizowałem więc kod, który zaproponował mi Savail i do niego dopisałem, poza funkcją int WINAPI WinMain ();
C/C++
#include <string> 
TCHAR * message;
using std::string;
Wszystko się ładnie skompilowało, ale jak nacisnąłem przycisk, żeby przeczytał to, co zostało wpisane w TextBox, przeczytał on to, co napisałem na tym samym przycisku.
Szukałem błędu, ale nie udało mi się go znaleźć...

Moglibyście jeszcze spróbować jakoś mi pomóc? Z góry wielkie dzięki.
 

To mój pełny kod po poprawkach:

C/C++
#include <windows.h>
#include <stdlib.h>
#include <string>                                  
#define ID_PRZYCISK3 503
using std::string;

LPSTR NazwaKlasy = "Klasa Okienka";
MSG Komunikat;
HWND gb_hPrzycisk;




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 | WS_SIZEBOX, 100, 100, 600, 400, NULL, NULL, hInstance, NULL );
   
    if( hwnd == NULL )
    {
        MessageBox( NULL, "Okno odmówiło przyjścia na świat!", "Ale kicha...", MB_ICONEXCLAMATION | MB_OK | MB_DEFBUTTON1 );
        return 1;
    }
    ////////////////////////
    // GŁOWNY KOD PROGRAMU//
    ////////////////////////
    HWND gb_hPrzycisk = CreateWindowEx( 0, "BUTTON", "Przeczytaj, co wpisałeś", WS_CHILD | WS_VISIBLE, 165, 182, 170, 30, hwnd,( HMENU ) ID_PRZYCISK3, hInstance, NULL );
    HWND pole_tekstowe_1 = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 9, 185, 150, 25, hwnd, NULL, NULL, NULL );
    SetWindowText( pole_tekstowe_1, "" );
    HWND uStatic = CreateWindowEx( 0, "STATIC", NULL, WS_CHILD | WS_VISIBLE | SS_LEFT, 10, 160, 120, 20, hwnd, NULL, hInstance, NULL );
    SetWindowText( uStatic, "Wpisz se tu cos." );
   
    //////////////////////////////////
    // KONIEC GŁOWNEGO KODU PROGRAMU//
    //////////////////////////////////
   
    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_CLOSE:
        DestroyWindow( hwnd );
        break;
       
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
    case WM_COMMAND:
        {
            switch( wParam )
            {
               
            case ID_PRZYCISK3:
               
                {
                    HWND handle =( HWND ) lParam;
                    DWORD dlugosc = GetWindowTextLength( handle );
                    LPSTR Bufor =( LPSTR ) GlobalAlloc( GPTR, dlugosc + 1 );
                    GetWindowText( handle, Bufor, dlugosc + 1 );
                    std::string message = "Wpisales: " +( std::string ) Bufor;
                    MessageBox( NULL, message.c_str(), "Wpisałeś:", MB_OK );
                    GlobalFree( Bufor );
                }
               
            }
        }
        break;
       
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
   
    return 0;
}
P-69844
Savail
» 2012-11-25 13:39:25
sory, moje niedopatrzenie... Użyj funkcji [MSDN] GetDlgItemText żeby wydobyć tekst z jakiejkolwiek kontrolki. Musisz znać tylko identyfikator tego pola tekstowego, czyli stworz globalny identyfikator tak jak to zrobiłeś z przyciskiem i podążaj wyjaśnieniami w linku ^^. Tą funkcję stosuje się podobnie jak tą co ci wcześniej podałem, tylko że w pierwszym parametrze musisz dać uchwyt okna rodzica czyli hwnd u ciebie
P-69846
miadko
Temat założony przez niniejszego użytkownika
» 2012-11-27 19:07:16
Witajcie

Teoretycznie nie powinno być problemu po radzie z funkcją GetDlgItemText podaną przez Savaila, ale mam wrażenie, że nie wszystko w podanej stronie zrozumiałem. Użyłem tej funkcji tak:
C/C++
UINT WINAPI GetDlgItemText( hwnd, ID_POLETEKSTOWE1, Bufor, 14 );
I tu juz miałem zagadkę, czy identyfikator kontrolki to ma być moje ID_POLETEKSTOWE1, czy 901 gdy na początku programu napisałem:
C/C++
#define ID_POLETEKSTOWE1 901
Wstawiłem to pod funkcją CreateWindowEx, ale pojawił się błąd w kompilatorze
initializer expression list treated as compound expression
.

Trzeba to gdzieś indziej wstawić, czy może jest jakiś bląd u mnie w funkcji GetDlgItemText?

Miałbym gorącą prośbę - mógłby ktoś poprawić mój kod programu tak, żeby... to działało, a ja zobaczę kod jak to się robi i się nauczę na całe zycie? :)
Z góry wielkie dzięki
P-69999
« 1 »
  Strona 1 z 1