Witamy na forum PC Format Zapraszamy do REJESTRACJI


Użytkownicy przeglądający ten wątek: 1 gości

Proszę o pomoc[WinApi]

#1
Sad  Proszę o pomoc[WinApi]
Więc piszę w Api taki prosty kalkulator.
Niestety wywala ciągle jakieś fanaberie. Ucina liczby po przecinku, gdy nie napisze się liczby z przecinkiem(zamiast 3.0 wklepać 3) wyświetla błędny wynik itp.
Możliwe że to jakiś banał, bo z Winapi dopiero zaczynam ale cóż...

Kod:
#include <windows.h>
#include<string>
#include<sstream>
#include<windowsx.h>
#include<cmath>
std::string ab;
int test1,test1n1,test1n2,x,y;
long double test2,test2n1,test2n2;
bool a=1;
int typdzialania=0;
std::string figi;
char* slipy;
long double  liczba1,liczba2,liczba3;

HWND hwnd;
HWND okienkoTextowe,okienkoInf;
HWND buttonrownasie,buttondodac,buttonodjac,buttonprzez,buttonrazy,buttonsilnia,buttonpierwiastek,buttonpotega;
long double silnia(double arg)
{
       int aint=(int)arg,gil = 0,wuu= 1;
       while (gil < aint)
       {
          gil++;
          wuu = wuu * gil;
       }
    return (double)wuu;
}    
std::string OdciagnijTexta(HWND hWnd)
{

   char* bufffor=0;
   UINT dlugosc = GetWindowTextLength(hWnd);
   bufffor = new char [dlugosc];
   GetWindowText (hWnd, bufffor, dlugosc);
   std::string zwrot = bufffor;
   delete[] bufffor;
   bufffor=0;
   return zwrot;
}
std::string doublenastring(long double xyz)
{
            std::stringstream ss;
            ss <<xyz;
            std::string zwrott=ss.str();
            return zwrott;
}
long double stringnadouble(std::string argument)
{
      
       std::stringstream ss(argument);
       long double xin;
       ss >> xin;
       return xin;
}



LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

char szClassName[ ] = "WindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
                  
    MSG messages;            
    WNDCLASSEX wincl;      

    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      
    wincl.style = CS_DBLCLKS;                
    wincl.cbSize = sizeof (WNDCLASSEX);


    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_CROSS);
    wincl.lpszMenuName = NULL;                
    wincl.cbClsExtra = 0;                      
    wincl.cbWndExtra = 0;                    
  
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

  
    if (!RegisterClassEx (&wincl))
        return 0;

    hwnd = CreateWindowEx (0,szClassName,"Kalkulatorek", WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,400,300,HWND_DESKTOP,NULL,hThisInstance,NULL);
    okienkoTextowe = CreateWindowEx(0, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 50, 10, 300, 20, hwnd, NULL, hThisInstance, NULL);
    okienkoInf = CreateWindowEx(0, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 50, 120, 300, 70, hwnd, NULL, hThisInstance, NULL);
    buttonrownasie =  CreateWindowEx(0, "BUTTON", "=", WS_CHILD | WS_VISIBLE, 50, 50, 30, 30, hwnd, NULL, hThisInstance, NULL);
    buttondodac =  CreateWindowEx(0, "BUTTON", "+", WS_CHILD | WS_VISIBLE, 90, 50, 30, 30, hwnd, NULL, hThisInstance, NULL);
    buttonodjac =  CreateWindowEx(0, "BUTTON", "-", WS_CHILD | WS_VISIBLE, 130, 50, 30, 30, hwnd, NULL, hThisInstance, NULL);
    buttonrazy = CreateWindowEx(0, "BUTTON", "*", WS_CHILD | WS_VISIBLE, 170, 50, 30, 30, hwnd, NULL, hThisInstance, NULL);
    buttonprzez = CreateWindowEx(0, "BUTTON", "/", WS_CHILD | WS_VISIBLE, 210, 50, 30, 30, hwnd, NULL, hThisInstance, NULL);
    buttonpierwiastek = CreateWindowEx(0, "BUTTON", "#", WS_CHILD | WS_VISIBLE, 250, 50, 30, 30, hwnd, NULL, hThisInstance, NULL);
    buttonpotega = CreateWindowEx(0, "BUTTON", "^", WS_CHILD | WS_VISIBLE, 290, 50, 30, 30, hwnd, NULL, hThisInstance, NULL);
    buttonsilnia = CreateWindowEx(0, "BUTTON", "n!", WS_CHILD | WS_VISIBLE, 330, 50, 30, 30, hwnd, NULL, hThisInstance, NULL);
    ShowWindow (hwnd, nFunsterStil);

    while (GetMessage (&messages, NULL, 0, 0))
    {
        
        TranslateMessage(&messages);
      
        DispatchMessage(&messages);
    }
    return messages.wParam;
}

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

    switch (message)                  
    {  
        
        case WM_CREATE:
             if(a==1)
             SetWindowText(okienkoInf,"KalkulatorWINAPI 1.0");
             break;
        case WM_MOUSEMOVE:
             x=GET_X_LPARAM(lParam);
             y=GET_Y_LPARAM(lParam);
             if(x<80 and x>50 and y < 80 and y >50)
             {
                     SetWindowText(okienkoInf,"To przycisk równa się");
             }            
             break;
        case WM_COMMAND:
             if((HWND)lParam==buttonrownasie)
             {
              switch(typdzialania)
              {
                                  case 0:
                                  break;
                                  case 1:
                                  figi=OdciagnijTexta(okienkoTextowe);
                                  liczba2=stringnadouble(figi);
                                  liczba3=liczba1+liczba2;
                                  figi=doublenastring(liczba3);
                                  test2=liczba3;
                                  test1=(int)liczba3;
                                  liczba3=0.0;
                                  liczba3=test2+(long double)liczba3;
                                  if(test2==(long double)test1)
                                                          figi=figi+=".0";
                                  SetWindowText(okienkoTextowe,figi.c_str());
                                  break;
                                  case 2:
                                  figi=OdciagnijTexta(okienkoTextowe);
                                  liczba2=stringnadouble(figi);
                                  liczba3=liczba1-liczba2;
                                  figi=doublenastring(liczba3);
                                  test2=liczba3;
                                  test1=(int)liczba3;
                                  test2=(long double) liczba3;
                                  if(test2==(long double)test1)
                                                          figi=figi+=".0";
                                  SetWindowText(okienkoTextowe,figi.c_str());
                                   break;
                                   case 3:
                                  figi=OdciagnijTexta(okienkoTextowe);
                                  liczba2=stringnadouble(figi);
                                  liczba3=liczba1*liczba2;
                                  figi=doublenastring(liczba3);
                                  test2=liczba3;
                                  test1=(int)liczba3;
                                  test2=(long double) liczba3;
                                  if(test2==(long double)test1)
                                                          figi=figi+=".0";
                                  SetWindowText(okienkoTextowe,figi.c_str());
                                   break;
                                   case 4:
                                  figi=OdciagnijTexta(okienkoTextowe);
                                  liczba2=stringnadouble(figi);
                                  liczba3=liczba1/liczba2;
                                  figi=doublenastring(liczba3);
                                  test2=liczba3;
                                  test1=(int)liczba3;
                                  test2=(long double) liczba3;
                                  if(test2==(long double)test1)
                                                          figi=figi+=".0";
                                  SetWindowText(okienkoTextowe,figi.c_str());
                                   break;
                                  }
                                            
             }
             if((HWND)lParam==buttondodac)
             {
              figi=OdciagnijTexta(okienkoTextowe);
              ab=figi.c_str();
              liczba1= stringnadouble(figi);
              typdzialania=1;
              SetWindowText(okienkoTextowe,"");
             }
             if((HWND)lParam==buttonodjac)
             {
             figi=OdciagnijTexta(okienkoTextowe);
              ab=figi.c_str();
              liczba1= stringnadouble(ab);
              typdzialania=2;
              SetWindowText(okienkoTextowe,"");
             }
             if((HWND)lParam==buttonrazy)
             {
               figi=OdciagnijTexta(okienkoTextowe);
              ab=figi.c_str();
              liczba1= stringnadouble(ab);
              typdzialania=3;
              SetWindowText(okienkoTextowe,"");}
             if((HWND)lParam==buttonprzez)
             {
               figi=OdciagnijTexta(okienkoTextowe);
              std::string ab;
              ab=figi.c_str();
              liczba1= stringnadouble(ab);
              typdzialania=4;
              SetWindowText(okienkoTextowe,"");}
             if((HWND)lParam==buttonsilnia)
             {figi=OdciagnijTexta(okienkoTextowe);
              ab=figi.c_str();
              liczba1= stringnadouble(ab);
              liczba1=silnia(liczba1);
              figi=doublenastring(liczba1);
              SetWindowText(okienkoTextowe,figi.c_str());}
             if((HWND)lParam==buttonpierwiastek)
             {}
             if((HWND)lParam==buttonpotega)
             {}
             break;
        case WM_DESTROY:
            PostQuitMessage (0);      
            break;
        default:                      
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
#2
RE: Proszę o pomoc[WinApi]
Żadnyc błędów nie masz, po prostu masz dwie spacje postawione tam gdzie ich nie powinno być, skasuj je i będzie ok, w tych miejscach:

1.
HWND buttonrownasie,buttondodac,buttonodjac,buttonprzez,buttonrazy,buttonsilnia,butto tutajnpierwiastek,buttonpotega;


hwnd = CreateWindowEx (0,szClassName,"Kalkulatorek", WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,400,300,HWND_DESKTOP,NULL,hThisI tutajnstance,NULL);
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
#3
RE: Proszę o pomoc[WinApi]
dziękuję za uwagę, i przeczytanie mojego słabej jakości kodu, ale niestety to błędy formatowania na forum, a kompilator
w takim wypadku
wywaliłby zaraz komunikat o błędzie
"hThisI undeclared first use this function"
czy jakoś tak.

znajomy mówił że to jakiś problem z formatem wyświetlania, ale nie mam pojęcia o co mu chodziło.
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
#4
RE: Proszę o pomoc[WinApi]
Kod:
case WM_MOUSEMOVE:
             x=GET_X_LPARAM(lParam);
             y=GET_Y_LPARAM(lParam);
             [b]if(x<80&&x>50&&y<80&&y>50)[/b]
             {
                     SetWindowText(okienkoInf,"To przycisk równa się");
             }        
             break;

Ten warunek nigdy nie zajdzie, bo gdy myszka znajdzie się w tym miejscu będzie nad innym oknem(przyciskiem), więc komunikat trafi do tamtego okna, WM_MOUSEMOVE trafia tylko do okna nad którym aktualnie jest

Spróbuj użyć funkcji konwersji z cstdlib (atoi, atof, itd.), bo właśnie w konwersji tekstu na liczbę leży problem
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
#5
RE: Proszę o pomoc[WinApi]
zamień :
Kod:
std::string OdciagnijTexta(HWND hWnd)
{
   UINT dlugosc = GetWindowTextLength(hWnd) ;

}

na
Kod:
UINT dlugosc = GetWindowTextLength(hWnd) + 1;

i powinno być dobrze.
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
#6
RE: Proszę o pomoc[WinApi]
Wielkie dzięki. To był właśnie problem, widzę że znasz się na tym, podobnie jak Crayze, któremu też bardzo dziękuję , bo dowiedziałem się dlaczego to okienko z podpowiedziami ciągle nie chodzi.
Jeszcze małe pytanko. Gdzie tu się dodaje plusiki?
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
#7
RE: Proszę o pomoc[WinApi]
Chodzi Ci o reputację? Na tym forum tego nie ma.
 System operacyjny: linux_ubuntu Przeglądarka: firefox
Programy: Polecane / Nowe / Inne



Użytkownicy forum szukali:
winapi kalkulator z liczbami po przecinku

Podobne wątki (Proszę o pomoc[WinApi])
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  [C++ WinAPI] Kompresja bitmapy kikiw 0 5130 25.12.2014, 16:15
Ostatni post: kikiw
  [c,winapi]-Access voliation reading location i problem z BITMAPFILEHEADER sfx 3 3321 12.08.2014, 16:11
Ostatni post: Darekg11
  winapi-taki sam tekst w kolejnych zakładkach sfx 0 2963 27.07.2014, 20:28
Ostatni post: sfx

Skocz do:


Wybrane wątki (Proszę o pomoc[WinApi])
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
myBB Praca programisty soul1648 14 13188 29.04.2017 20:44
Ostatni post: Ajgor
  Nauka tworzenia aplikacji w Android Studio- książka do wyboru. raxer 2 7077 11.04.2017 15:12
Ostatni post: raxer
  Rekurencja, zrozumienie soul1648 1 6250 07.04.2017 20:22
Ostatni post: Szachista
  [Matlab] Gra "Papier kamień nożyce" samanta19 7 7240 07.04.2017 15:54
Ostatni post: Szachista
  Sprawdzenia zadłużenia u kontrahentów OxyGenE 12 2325 05.04.2017 07:38
Ostatni post: OxyGenE
  czy w java można napisać dowolny program ? anders33 7 7769 04.04.2017 22:03
Ostatni post: koneton
  Adresy, szesnastkowe dodawanie soul1648 5 6126 03.04.2017 23:21
Ostatni post: Ajgor
  [C++]pobieranie danych z comboBox Pleyzon223 1 6007 02.04.2017 09:35
Ostatni post: Szachista
  Wyszukiwanie w tablicy soul1648 3 6142 01.04.2017 14:26
Ostatni post: Ajgor
  [Visual Studio 2017] Problem z utworzeniem projektu draxen 2 2480 31.03.2017 23:20
Ostatni post: Ajgor
  Tutoriale: Tworzenie raportów z wykorzystaniem SQL. Cixi 3 6329 29.03.2017 08:23
Ostatni post: koneton
  [CMD - Tryb wsadowy] Skrypt tworzący drzewo katalogów na podstawie podanego pliku Ayumi 0 5891 29.03.2017 01:41
Ostatni post: Ayumi
  Help z wytłumaczenie | tablice wskażnikowe soul1648 21 15905 27.03.2017 11:28
Ostatni post: Szachista
  Wskażniki do tablic dwuelementowych soul1648 1 5506 25.03.2017 16:13
Ostatni post: Szachista
  Tablice dwuwymiarowe a wskażniki soul1648 4 5834 22.03.2017 21:58
Ostatni post: soul1648