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

[WinApi/C++] konwersja typów char/string na int/float i na odwrót

Ostatnio zmodyfikowano 2010-05-15 19:35
Autor Wiadomość
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:
C/C++
#include <windows.h>
#include<string>
#include<sstream>

#define ID_OBLICZANIE 501

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure( HWND, UINT, WPARAM, LPARAM );

/*  Make the class name into a global variable  */
char szClassName[] = "CodeBlocksWindowsApp";

HWND hwnd, a, b, c, obliczanie;

int WINAPI WinMain( HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow )
{
    //standardowy kod do inicjalizacji okna z dodaniem:
    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 ) /* handle the messages */
    {
    case WM_DESTROY:
        PostQuitMessage( 0 ); /* send a WM_QUIT to the message queue */
        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: /* for messages that we don't deal with */
        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:
C/C++
liczba =( float ) skladnik - '0';
daje ten sam wynik.

Z kolei:
C/C++
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**)'|
P-16829
malan
» 2010-05-14 23:27:34
Zainteresuj się funkcją GetWindowText :).
P-16831
DejaVu
» 2010-05-14 23:57:25
atof, atoi, sprintf, sscanf
P-16833
maniek099
Temat założony przez niniejszego użytkownika
» 2010-05-15 19:35:13
Dzięki, problem rozwiązany:

C/C++
case ID_OBLICZANIE:
DWORD dlugosc = GetWindowTextLength( a );
LPSTR Bufor =
( LPSTR ) GlobalAlloc( GPTR, dlugosc + 1 );
GetWindowText( a, Bufor, dlugosc + 1 );

FLOAT liczbaa,
liczbaa = liczbaa + 11; //np.
liczbaa = strtod( Bufor, NULL );

std::ostringstream ss;
ss << liczbaa;
LPCSTR wynik = ss.str().c_str();
MessageBox( hwnd, wynik, "Wynik", MB_ICONINFORMATION );
 
P-16870
« 1 »
  Strona 1 z 1