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: #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 ) { 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 ); if( !RegisterClassEx( & wc ) ) { MessageBox( NULL, "Wysoka Komisja odmawia rejestracji tego okna!", "Niestety...", MB_ICONEXCLAMATION | MB_OK ); return 1; } 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; } 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." ); ShowWindow( hwnd, nCmdShow ); UpdateWindow( hwnd ); while( GetMessage( & Komunikat, NULL, 0, 0 ) ) { TranslateMessage( & Komunikat ); DispatchMessage( & Komunikat ); } return Komunikat.wParam; }
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 ( |
|
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] GetWindowTextW skrócie: 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) |
|
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 (); #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: #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 ) { 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 ); if( !RegisterClassEx( & wc ) ) { MessageBox( NULL, "Wysoka Komisja odmawia rejestracji tego okna!", "Niestety...", MB_ICONEXCLAMATION | MB_OK ); return 1; } 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; } 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." ); ShowWindow( hwnd, nCmdShow ); UpdateWindow( hwnd ); while( GetMessage( & Komunikat, NULL, 0, 0 ) ) { TranslateMessage( & Komunikat ); DispatchMessage( & Komunikat ); } return Komunikat.wParam; }
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; } |
|
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 |
|
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: 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: #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 |
|
« 1 » |