Zamiana int na string w okienku HWND

Odpowiedz Nowy wątek
2018-05-23 19:00
0

Witam!

Mam pytanie, tworzyłem okienko w WinApi, utworzyłem uchwyt HWND, i teraz mam problem, bo wartość którą wpisuje do mojego editext oznaczonego jako HA, nie mogę przypisać do funkcji obliczającej deltę w moim programie. I tutaj pojawia się pytanie, jakiej mam funkcji użyć, bo wiem że w C# istnieje funkcja która zamienia tekst wpisany do okienka na string i od razu można przypisać tą wartość do zmiennej np. "a" pojawia się pytanie czy w C++ istnieje również taka funkcja?

Pozostało 580 znaków

2018-05-25 00:40
0

Mam jeszcze jeden problem może ktoś mi pomoże go rozwiązać, stworzyłem taki oto przycisk:

 
case GENERATE_BUTTON:
 
            double a = 0;
            string as = to_string(a);
            char * cas = new char[as.length() + 1];
            strcpy_s(cas, as.length()+1, as.c_str());
            GetWindowTextA(hA, cas, as.length() + 1);
 
            double b = 0;
 
            std::string bs = std::to_string(b);
            char * cbs = new char[bs.length() + 1];
            strcpy_s(cbs, bs.length() + 1, bs.c_str());
 
            GetWindowTextA((HWND)hB, cbs, bs.length() + 1);
 
            double c = 0;
 
            std::string cs = std::to_string(c);
            char * ccs = new char[cs.length() + 1];
            strcpy_s(ccs, cs.length() + 1, cs.c_str());
 
            GetWindowTextA((HWND)hC, ccs, cs.length() + 1);
 
            double delta = 0;
 
            delta = licz(a, b, c);
 
            std::string ds = std::to_string(delta);
            char * cds = new char[ds.length() + 1];
            strcpy_s(cds, ds.length() + 1, ds.c_str());
 
            SetWindowTextA((HWND)hOut, cds);
 
        }
        break;
 

Co ciekawe po naciśnięciu liczy Delte, czyli jest efekt który chciałem otrzymać, ale właśnie mam problem że jest gdzieś błąd w kodzie że liczy deltę tylko dla lprzypisanych wartości czyli dla

double a =0; double b = 0; double c = 0;

Co muszę zmienić/dodać, żeby zmienić wartość z 0 na wartość którą pobiorę z okienka za pomocą GetWindowTextA?

Pozostało 580 znaków

2018-05-25 08:15
1
            double a = 0;
            string as = to_string(a);
            char * cas = new char[as.length() + 1];
            strcpy_s(cas, as.length()+1, as.c_str());
            GetWindowTextA(hA, cas, as.length() + 1);

Chyba nie rozumiesz co robisz:

  • tworzysz double'a o wartości 0
  • konwertujesz go na stringa
  • zupełnie niepotrzebnie alokujesz innego stringa i kopiujesz tam pierwszego stringa
  • pobierasz tekst kontrolki do tego drugiego stringa
  • nie zwalniasz pamięci zaalokowanej przez new co powoduje wyciek pamięci.

W którą stronę to ma być operacja? To ma być w końcu pobranie tekstu z kontrolki czy wpisanie do niej tekstu?

edytowany 1x, ostatnio: Azarien, 2018-05-25 08:16

Pozostało 580 znaków

2018-05-25 09:17
1

Co muszę zmienić/dodać, żeby zmienić wartość z 0 na wartość którą pobiorę z okienka za pomocą GetWindowTextA?

Tak jak pisałem Ci już w dwóch innych postach:
1. Przygotowujesz sobie tymczasowy bufor w postaci ciągu char.
2. Wrzucasz go do funkcji GetWindowText(), aby ta funkcja zapisała do niego ciąg tekstowy z okienka
3. Otrzymany ciąg char przechowuje obecnie to, co wpisałeś w okienku - musisz to teraz przekonwertować do typu float. Wykorzystaj do tego na przykład atof().

W tym momencie wartość zmiennej została zmieniona z inicjalizacyjnej wartości 0 na wartość wpisaną do okienka.

Pozostało 580 znaków

2018-05-26 01:15
0

Panowie dziękuję bardzo za pomoc, problem rozwiązany stworzyłem przycisk w pełni funkcjonalny nie ma z nim problemów ;) liczy wszystko ładnie, pomieszane bo trochę string, trochę char ale działa poniżej kod:

case GENERATE_BUTTON:
 
            double a;
            char bufor[100];
            GetWindowTextA(hA, bufor, 100);
            a = atof(bufor);
 
            double b;
            char bufor1[100];
            GetWindowTextA(hB, bufor1, 100);
            b = atof(bufor1);
 
            double c;
            char bufor2[100];
            GetWindowTextA(hC, bufor2, 100);
            c = atof(bufor2);
 
            double delta = 0;
            delta = licz(a, b, c);
            std::string ds = std::to_string(delta);
            char * cds = new char[ds.length() + 1];
            strcpy_s(cds, ds.length() + 1, ds.c_str());
            SetWindowTextA((HWND)hOut, cds);
 
            if (delta > 0)
            {
                double x1 = 0;
                x1 = jeden(delta, b, a);
                std::string xs = std::to_string(x1);
                char * cxs = new char[xs.length() + 1];
                strcpy_s(cxs, xs.length() + 1, xs.c_str());
                SetWindowTextA((HWND)hX, cxs);
 
                double x2 = 0;
                x2 = dwa(delta, b, a);
                std::string zs = std::to_string(x2);
                char * czs = new char[zs.length() + 1];
                strcpy_s(czs, zs.length() + 1, zs.c_str());
                SetWindowTextA((HWND)hX2, czs);         
            }
 
            if (delta == 0)
            {
                double x0 = 0;
                x0 = zero(b, a);
                std::string ys = std::to_string(x0);
                char * cys = new char[ys.length() + 1];
                strcpy_s(cys, ys.length() + 1, ys.c_str());
                SetWindowTextA((HWND)hX0, cys);
            }
 
            if (delta < 0)
            {
                MessageBox(hWnd, "Delta mniejsza od zera. \n Brak miejsc zerowych", "Uwaga!!!", MB_ICONINFORMATION);
            }
 
        }
        break;
 

A tak poza tematem panowie, wiecie w jaki sposób czyścić okienko wypełnione daną wartością, bo np. liczę X0 i jak robię drugą funkcje co liczy miejsca X1 i X2, to X0 się nie kasuje, kasuje się dopiero po wypełnieniu go inną wartością ;) :D.

I jeszcze jedno pytanie, ale to pewnie będę musiał otworzyć nowy temat, ale może miał ktoś z was styczność, to podpowiecie mi, za pomocą jakiej funkcji/biblioteki, będę mógł narysować wykres? Bo jeszcze do tej delty muszę narysować wykres, ale jestem zielony w tym temacie i nawet nie wiem czego się chwycić żeby się co nieco przyuczyć ;)

Jeszcze raz dziękuję za pomoc i cierpliwość ;)

Pozostało 580 znaków

2018-05-26 09:43
0
Krispi One napisał(a):
               std::string xs = std::to_string(x1);
               char * cxs = new char[xs.length() + 1];
               strcpy_s(cxs, xs.length() + 1, xs.c_str());
               SetWindowTextA((HWND)hX, cxs);

Ale po co kopiujesz tego stringa? Na dodatek gubisz pamięć, bo masz new a nie masz delete.

std::string xs = std::to_string(x1);
SetWindowTextA(hX, xs.c_str());
edytowany 1x, ostatnio: Azarien, 2018-05-26 09:43

Pozostało 580 znaków

2018-05-26 09:43
0

Cieknie z tego kodu jak przez sito:

char * czs = new char[zs.length() + 1];
strcpy_s(czs, zs.length() + 1, zs.c_str());
SetWindowTextA((HWND)hX2, czs);     

Po co ten new i strcpy? Tak:

SetWindowTextA((HWND)hX2, zs.c_str()); 

nie wystarczy?

Po co definiujesz bufor1 i bufor2, skoro możesz spokojnie wykorzystać bufor?

Pozostało 580 znaków

2018-05-26 17:33
0

Dziękuję bardzo panowie za porady, błędy poprawione już nie ma tych błędnych funkcji, jak i również korzystam z jednego buforu ;) poniżej kod, macie może jeszcze jakieś uwagi?

case GENERATE_BUTTON:
 
            double a;
            char bufor[100];
            GetWindowTextA(hA, bufor, 100);
            a = atof(bufor);
 
            double b;
            GetWindowTextA(hB, bufor, 100);
            b = atof(bufor);
 
            double c;
            GetWindowTextA(hC, bufor, 100);
            c = atof(bufor);
 
            double delta = 0;
            delta = licz(a, b, c);
            std::string ds = std::to_string(delta);
            SetWindowTextA((HWND)hOut, ds.c_str());
 
            if (delta > 0)
            {
                double x1 = 0;
                x1 = jeden(delta, b, a);
                std::string xs = std::to_string(x1);
                SetWindowTextA((HWND)hX, xs.c_str());
 
                double x2 = 0;
                x2 = dwa(delta, b, a);
                std::string zs = std::to_string(x2);
                SetWindowTextA((HWND)hX2, zs.c_str());          
            }
 
            if (delta == 0)
            {
                double x0 = 0;
                x0 = zero(b, a);
                std::string ys = std::to_string(x0);
                SetWindowTextA((HWND)hX0, ys.c_str());
            }
 
            if (delta < 0)
            {
                MessageBox(hWnd, "Delta mniejsza od zera. \n Brak miejsc zerowych", "Uwaga!!!", MB_ICONINFORMATION);
            }
 
        }
        break;

Pozostało 580 znaków

2018-05-27 10:17
0

Możesz nieco skrócić:

auto get_as_double = [] (HWND h) -> double {
        char bufor[100];
        GetWindowTextA(h, bufor, 100);
        return atof(bufor);
    };
 
double a = get_as_double(hA);
double b = get_as_double(hB);
double c = get_as_double(hC);
 
double delta = licz(a, b, c);
SetWindowTextA((HWND)hOut, std::to_string(delta).c_str());
 
if (delta > 0)
{
    double x1 = jeden(delta, b, a);
    SetWindowTextA((HWND)hX, std::to_string(x1).c_str());
 
    double x2 = dwa(delta, b, a);
    SetWindowTextA((HWND)hX2, std::to_string(x2).c_str());          
}
 
if (delta == 0)
{
    double x0 = zero(b, a);
    SetWindowTextA((HWND)hX0, std::to_string(x0).c_str());
}

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0