maniek099 Temat założony przez niniejszego użytkownika |
[WinApi/C++] konwersja typów char/string na int/float i na odwrót » 2010-05-14 22:31:50 Otóż mam do napisania programik w winapi, który będzie zawierał trzy okienka tekstowe a,b,c i jeden przycisk po którego wciśnięciu ma się pobrać wartość podana w okienkach, obliczyć ma się delta i trzeba wyświetlić wynik jako komunikat. Sama konstrukcja okna jest prosta ale nie wiem jak prze konwertować typ znakowy (zmienna pobrana z okienka) na zmienna matematyczną (int albo float raczej bardziej) żeby można obliczenia było wykonać i wynik zamienić na string żeby wyświetlić to w okienku komunikatu. Mój kod: #include <windows.h> #include<string> #include<sstream>
#define ID_OBLICZANIE 501
LRESULT CALLBACK WindowProcedure( HWND, UINT, WPARAM, LPARAM );
char szClassName[] = "CodeBlocksWindowsApp";
HWND hwnd, a, b, c, obliczanie;
int WINAPI WinMain( HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow ) { a = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", "a", WS_CHILD | WS_VISIBLE | WS_BORDER, 20, 60, 50, 30, hwnd, NULL, hThisInstance, NULL ); b = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", "b", WS_CHILD | WS_VISIBLE | WS_BORDER, 80, 60, 50, 30, hwnd, NULL, hThisInstance, NULL ); c = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", "c", WS_CHILD | WS_VISIBLE | WS_BORDER, 140, 60, 50, 30, hwnd, NULL, hThisInstance, NULL ); obliczanie = CreateWindowEx( WS_EX_CLIENTEDGE, "BUTTON", "Obliczanie", WS_CHILD | WS_VISIBLE | WS_BORDER, 20, 100, 150, 30, hwnd,( HMENU ) ID_OBLICZANIE, hThisInstance, NULL ); }
LRESULT CALLBACK WindowProcedure( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) { case WM_DESTROY: PostQuitMessage( 0 ); break; case WM_COMMAND: switch( wParam ) { case ID_OBLICZANIE: INT liczba; CHAR skladnik = SendMessage( a, CB_GETCURSEL, 0, 0 ); liczba = skladnik - '0'; liczba = liczba + 12; std::ostringstream ss; ss << liczba; LPCSTR wynik = ss.str().c_str(); MessageBox( hwnd, wynik, "Wynik", MB_ICONINFORMATION ); break; } break; default: return DefWindowProc( hwnd, message, wParam, lParam ); } return 0; } Co jest złego w konwersjach? Za każdym razem co bym nie wpisał w okienko "a" wyświetla -36, a jak zmienię liczba=liczba+11; to wtedy wyświetla -37. Prosiłbym o jakieś funkcje konwersji ze znakowego na liczbę i na odwrót. Najlepiej na float ale jeśli nie będzie to na int. //EDIT: sposób: liczba =( float ) skladnik - '0';
daje ten sam wynik. Z kolei: liczba = strtod( skladnik, NULL );
daje błędy kompilatora: G:\CodeBlocks\Projekty\okno_kwadratowa\main.cpp|118|error: invalid conversion from `CHAR' to `const char*'|
G:\CodeBlocks\Projekty\okno_kwadratowa\main.cpp|118|error: initializing argument 1 of `double strtod(const char*, char**)'| |
maniek099 Temat założony przez niniejszego użytkownika |
» 2010-05-15 19:35:13 Dzięki, problem rozwiązany: case ID_OBLICZANIE: DWORD dlugosc = GetWindowTextLength( a ); LPSTR Bufor = ( LPSTR ) GlobalAlloc( GPTR, dlugosc + 1 ); GetWindowText( a, Bufor, dlugosc + 1 );
FLOAT liczbaa, liczbaa = liczbaa + 11; liczbaa = strtod( Bufor, NULL );
std::ostringstream ss; ss << liczbaa; LPCSTR wynik = ss.str().c_str(); MessageBox( hwnd, wynik, "Wynik", MB_ICONINFORMATION );
|