inzynier1979 Temat założony przez niniejszego użytkownika |
winapi-pobieranie zmiennej z kontrolki edit za pomoca przycisku » 2023-05-01 17:49:38 czesc od nie dawna zaczalem uczyc sie winapi mam problem z pobraniem danych z kontrolki do messageboxa wiem ze wartosc zmiennej wyswietlanej ma byc char // Załóżmy, że mamy kontrolkę edit o identyfikatorze ID_EDITCHILD1 HWND hText = GetDlgItem(hwnd, ID_EDITCHILD1); // pobierz uchwyt kontrolki edit
// Musimy utworzyć bufor znakowy, w którym zapiszemy tekst z kontrolki edit char bufor[256]; // wystarczy na 255 znaków i znak końca ciągu
// Musimy skopiować tekst z kontrolki edit do bufora za pomocą funkcji GetWindowText lub SendMessage GetWindowText(hText, bufor, 256); // skopiuj tekst z kontrolki edit do bufora
// Teraz możemy wyświetlić bufor w messagebox MessageBox(NULL, bufor, "Przykład", MB_OK); wyswietlka puste okienko kontrolka edit HWND hText = CreateWindowEx( 0, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 50, 50, 150, 20, hwnd ,ID_EDITCHILD1, hInstance, NULL ); siedze nad tym juz jakis czas nie moge tego rozpracowac prosze popraw kod i wyjasnij mi jak malemu dziecku?:-) |
|
DejaVu |
» 2023-05-01 19:34:34 Odpowiedź wygenerowana przez Chat GPT: Cześć! Z chęcią Ci pomogę z rozwiązaniem problemu.
Pierwszy kod, który podałeś jest prawidłowy i służy do pobrania tekstu z kontrolki edit i wyświetlenia go w oknie messagebox.
Zwróć uwagę na to, że w pierwszej linii kodu używasz funkcji GetDlgItem, aby pobrać uchwyt do kontrolki edit o określonym identyfikatorze ID_EDITCHILD1. Funkcja ta wyszukuje kontrolkę dziecka o określonym identyfikatorze w oknie hwnd.
Następnie, tworzysz bufor znakowy bufor, który jest wystarczająco duży, aby pomieścić 255 znaków i znak końca ciągu. Używasz funkcji GetWindowText, aby skopiować tekst z kontrolki edit do bufora. Ta funkcja pobiera uchwyt do kontrolki edit, bufor, do którego ma zostać skopiowany tekst oraz maksymalną długość tekstu, który chcesz skopiować.
W końcu, używasz funkcji MessageBox, aby wyświetlić zawartość bufora w oknie dialogowym messagebox. Funkcja ta pobiera uchwyt do okna nadrzędnego (w tym przypadku jest to NULL, co oznacza, że okno messagebox będzie oknem głównym), tekst, który ma być wyświetlony w oknie messagebox, oraz parametry, które określają, jakie przyciski mają być wyświetlane w oknie dialogowym.
Drugi kod, który podałeś, tworzy kontrolkę edit i przypisuje jej identyfikator ID_EDITCHILD1. Wykorzystuje funkcję CreateWindowEx, która tworzy okno o określonym stylu i umieszcza je w oknie nadrzędnym hwnd. Funkcja ta zwraca uchwyt do nowo utworzonej kontrolki edit. Używasz tego uchwytu w pierwszym kodzie do pobrania tekstu z kontrolki edit za pomocą funkcji GetWindowText.
Jeśli nadal masz problemy z kodem, daj mi znać, jakie dokładnie problemy napotykasz, a postaram się pomóc.
|
|
inzynier1979 Temat założony przez niniejszego użytkownika |
» 2023-05-02 15:01:24 czesc prosze pomoc mam zamiar dodac dwie zmienne pobrane z kontrolek edit i wyswietic w messagebox oto kontrolki: HWND hText = CreateWindowEx( WS_EX_CLIENTEDGE, _T( "EDIT" ), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 10, 10, 150, 20, hwnd,( HMENU ) ID_EDIT, hInstance, NULL ); HWND g_hPrzycisk = CreateWindowEx( 0, _T( "BUTTON" ), _T( "Przycisk" ), WS_CHILD | WS_VISIBLE, 80, 80, 150, 30, hwnd,( HMENU ) ID_PRZYCISK, hInstance, NULL ); HWND hText1 = CreateWindowEx( WS_EX_CLIENTEDGE, _T( "EDIT" ), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 45, 45, 150, 20, hwnd,( HMENU ) ID_EDIT1, hInstance, NULL );
//kod char buffer1[256], buffer2[256]; GetWindowText(hEdit1, buffer1, 256); GetWindowText(hEdit2, buffer2, 256); int num1 = std::stoi(buffer1); int num2 = std::stoi(buffer2); int sum = num1 + num2; std::string sumString = std::to_string(sum); MessageBox(NULL, sumString.c_str(), "Sum", MB_OK); kiedy uruchamiam kompiluje kiedy klikam na button zamyka sie okno i wyswietla terminate called after throwing an instance of 'std::invalid_argument' what(): stoi wpisuje wartosci klikam by obbliczc dodawanie znika okno zostaje okno dos z komukatem powtarzam terminate called after throwing an instance of 'std::invalid_argument' what(): stoi proeze wytlumacz mi dlaczego tak sie dzieje co robie zle i wogole |
|
DejaVu |
» 2023-05-02 15:05:48 Do takich prostych pytań polecam Ci używać Chat GPT. Będziesz dostawał odpowiedzi natychmiast. Może nie wszystkie odpowiedzi są poprawne, ale i tak możesz szybciej adresować swoje problemy. W kodzie, który podałeś, wywołujesz funkcję GetWindowText() dla kontrolki edit, ale używasz identyfikatora hEdit1 i hEdit2, które nie zostały zadeklarowane w kodzie. Zamiast tego, należy użyć identyfikatorów hText i hText1, które zostały zdefiniowane podczas tworzenia kontrolek. Ponadto, gdy konwertujesz zawartość kontrolki edit na liczbę za pomocą funkcji std::stoi(), musisz upewnić się, że zawartość kontrolki jest poprawną liczbą. Jeśli zawartość kontrolki nie jest poprawną liczbą, funkcja std::stoi() zwróci błąd std::invalid_argument. Aby rozwiązać ten problem, możesz dodać obsługę błędów, aby upewnić się, że zawartość kontrolki edit jest poprawną liczbą. Możesz użyć funkcji std::stringstream, aby przeprowadzić konwersję z tekstu na liczbę i obsłużyć błędy. Poniżej znajduje się przykładowy kod, który pokazuje, jak to zrobić: scss HWND hText = CreateWindowEx( WS_EX_CLIENTEDGE, _T( "EDIT" ), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 10, 10, 150, 20, hwnd,( HMENU ) ID_EDIT, hInstance, NULL ); HWND g_hPrzycisk = CreateWindowEx( 0, _T( "BUTTON" ), _T( "Przycisk" ), WS_CHILD | WS_VISIBLE, 80, 80, 150, 30, hwnd,( HMENU ) ID_PRZYCISK, hInstance, NULL ); HWND hText1 = CreateWindowEx( WS_EX_CLIENTEDGE, _T( "EDIT" ), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 45, 45, 150, 20, hwnd,( HMENU ) ID_EDIT1, hInstance, NULL );
char buffer1[ 256 ], buffer2[ 256 ]; GetWindowText( hText, buffer1, 256 ); GetWindowText( hText1, buffer2, 256 ); int num1, num2; std::stringstream ss1( buffer1 ), ss2( buffer2 ); if( ss1 >> num1 && ss2 >> num2 ) { int sum = num1 + num2; std::string sumString = std::to_string( sum ); MessageBox( NULL, sumString.c_str(), "Sum", MB_OK ); } else { MessageBox( NULL, "Invalid input", "Error", MB_OK ); } W tym kodzie, używamy std::stringstream, aby przekonwertować zawartość kontrolki edit na liczbę, a następnie sprawdzamy, czy konwersja przebiegła pomyślnie. Jeśli tak, obliczamy sumę i wyświetlamy ją w messageboxie. Jeśli konwersja się nie powiedzie, wyświetlamy messagebox z informacją o błędzie. |
|
inzynier1979 Temat założony przez niniejszego użytkownika |
» 2023-05-02 15:25:22 dziekuje za odpowiedz poszukam tego bota podales kod: char buffer1[ 256 ], buffer2[ 256 ]; GetWindowText( hText, buffer1, 256 ); GetWindowText( hText1, buffer2, 256 ); int num1, num2; std::stringstream ss1( buffer1 ), ss2( buffer2 ); if( ss1 >> num1 && ss2 >> num2 ) { int sum = num1 + num2; std::string sumString = std::to_string( sum ); MessageBox( NULL, sumString.c_str(), "Sum", MB_OK ); } else { MessageBox( NULL, "Invalid input", "Error", MB_OK ); } wkleilem podczas kopilacji wywala niestey blad : ||=== Build: Debug in mal2 (compiler: GNU GCC Compiler) ===| F:\codeblox\mal2\main.cpp||In function 'int WinMain(HINSTANCE, HINSTANCE, LPSTR, int)':| F:\codeblox\mal2\main.cpp|71|warning: unused variable 'hText' [-Wunused-variable]| F:\codeblox\mal2\main.cpp|72|warning: unused variable 'g_hPrzycisk' [-Wunused-variable]| F:\codeblox\mal2\main.cpp|73|warning: unused variable 'hText1' [-Wunused-variable]| F:\codeblox\mal2\main.cpp||In function 'LRESULT WindowProcedure(HWND, UINT, WPARAM, LPARAM)':| F:\codeblox\mal2\main.cpp|103|error: variable 'std::stringstream ss1' has initializer but incomplete type| F:\codeblox\mal2\main.cpp|103|error: variable 'std::stringstream ss2' has initializer but incomplete type| ||=== Build failed: 2 error(s), 3 warning(s) (0 minute(s), 4 second(s)) ===| co z tym zrobimy? |
|
DejaVu |
» 2023-05-02 15:27:16 Niemniej jednak poszukaj sobie tego ChatGPT to Ci będzie odpowiadał na takie pytania. |
|
inzynier1979 Temat założony przez niniejszego użytkownika |
» 2023-05-02 15:39:00 dziekuje nie moge zarejestrowac sie na stronie tego bota dzieki za kod wkleilem go tak mysallem ze bedzie do wpisania biblioteka kiedy wpisuje i klikam buttona wyswietla MessageBox( NULL, "Invalid input", "Error", MB_OK ); prosze pomoz |
|
inzynier1979 Temat założony przez niniejszego użytkownika |
» 2023-05-03 22:32:37 czesc moi drodzy licze na wasza pomoc oto kod:case ID_MYBUTTON: HWND hText = GetDlgItem(hwnd, IDC_EDIT1); // hwnd to uchwyt okna, IDC_EDIT1 to identyfikator kontrolki HWND hText1 = GetDlgItem(hwnd, IDC_EDIT2); // hwnd to uchwyt okna, IDC_EDIT2 to identyfikator kontrolki char buffer1[256]; char buffer2[256]; GetWindowText(hText, buffer1, 256); GetWindowText(hText1, buffer2, 256);
// konwersja tekstu na liczbê int liczba1 = atof(buffer1); int liczba2 = atof(buffer2);
// dodawanie liczb int suma = liczba1 / liczba2*liczba2 ;
// wyœwietlanie wyniku w MessageBox char wynik[256]; sprintf_s(wynik, "Wynik: %d", suma); MessageBox(hwnd, wynik, "Wynik", MB_OK); kiedy wpisuje dzialanie int suma = liczba1 / liczba2*liczba2 ; to zle dokonuje obiczen jak wpisuje w kontrolce idit1 i wpisuje kolejna liczbe w edit 2 klikam na buttona zamiast wyniku pojawia sie wartosc wpisana w edit 1 |
|
« 1 » 2 |