WINAPI Programmierung



  • Hallo,

    ich bin gerade dabei WINAPI zu lernen und habe ein Problem, ich kann Text eingeben und ausgeben, jetzt wollte ich mir einen kleinen Taschenrechner programmieren, aber wie konvertiere ich die Strings in eine Integer, Float usw. und wieder zurück. Ich habe soweit nichts im internet gefunden "kann auch daran liegen das ich nicht wusste nach was ich suchen soll". In meinem Buch das ich gerade lese steht auch, dass man das nicht mehr von Handprogrammiert sondern, dass es da besondere Programme gibt mit denen man das Fenster zusammen klicken kann.
    Hier ist mein Code:
    (Ich habe mit den Sachen die ich im Internet gefunden habe experimentiert)

    #include <stdlib.h>
    #include <stdio.h>
    
    #include <windows.h>
    
    // Prototypen
    //
    LRESULT CALLBACK WindowProc (HWND hWnd, UINT message,
                                 WPARAM wParam, LPARAM lParam);
    
    HWND ErstelleHauptfenster (HINSTANCE hInst);
    void ErstelleSteuerelemente (HWND hWnd, HINSTANCE hInst);
    
    // IDs der Child-Fenster
    //
    #define ID_STATICTEXT      4000
    #define ID_EDITBOX_1         4001
    #define ID_EDITBOX_2		4002
    #define ID_ERG		4003
    #define ID_BTN_UEBERNEHMEN 4004
    #define ID_BTN_BEENDEN     4005
    
    // Globale Variablen
    // Don't do this at home!
    //
    HWND hText;        // Handle für den statischen Text
    HWND hEditBox1;     // Handle für die Editbox
    HWND hEditBox2;
    HWND hErg;
    HWND hUebernehmen; // Handle für Button "Übernehmen"
    HWND hBeenden;     // Handle für Button "Beenden"
    HWND hHilfe;
    
    // Hauptprogramm
    //
    int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst,
                        LPSTR lpcmdline, int ncmdshow)
    {
      HWND hWnd;   // Fenster-Handle
      MSG message; // Nachricht
    
      // Hauptfenster erstellen
      hWnd = ErstelleHauptfenster (hInst);
    
      // Prüfen, ob alles glatt ging
      if (hWnd == NULL)
        return (0);
    
      // Alle Steuerelemente erstellen
      ErstelleSteuerelemente (hWnd, hInst);
    
      // Der "Herzschlag" des Programms
      // Hier werden alle Nachrichten abgeholt,
      // übersetzt und weitergeleitet
      //
      while (GetMessage (&message, NULL, 0, 0) )
      {
        TranslateMessage (&message);
        DispatchMessage  (&message);
    
      }
    
      // Programm beenden
      return (int)(message.wParam);
    
    } // WinMain
    
    // Erstelle Hauptfenster
    //
    // Hauptfenster erstellen und Handle zurückliefern
    //
    HWND ErstelleHauptfenster (HINSTANCE hInst)
    {
      HWND        hWnd;        // Fenster-Handle
      WNDCLASSEX  windowclass; // Nachricht
    
      // Der Klassenname des Fensters ist frei wählbar
      const char szClassName[] = "Zweites Fenster";
    
      // Struktur mit gewünschten Eigenschaften füllen
      //
    
      // Größe der Struktur zwischenspeichern
      windowclass.cbSize = sizeof (WNDCLASSEX);
    
      // Fenster soll beim Verschieben neu gezeichnet werden
      windowclass.style = CS_HREDRAW | CS_VREDRAW;
    
      // Zeiger auf Callback-Funktion
      windowclass.lpfnWndProc = WindowProc;
    
      // Keine erweiterten Einstellungen
      windowclass.cbClsExtra = 0;
      windowclass.cbWndExtra = 0;
    
      // Instanz speichern
      windowclass.hInstance = hInst;
    
      // Icons und Cursor festlegen
      windowclass.hIcon   = LoadIcon (NULL, IDI_APPLICATION);
      windowclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
      windowclass.hCursor = LoadCursor (NULL, IDC_ARROW);
    
      // Hintergrundfarbe festlegen
      windowclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND+1;
    
      // Ein Menü brauchen wir nicht
      windowclass.lpszMenuName = NULL;
    
      // Klassenname angeben
      windowclass.lpszClassName = szClassName;
    
      // Fensterklasse registrieren
      if (!RegisterClassEx (&windowclass) )
        return (NULL);
    
      // Das Fenster erzeugen
      hWnd = CreateWindowEx (NULL,
                             szClassName,
                             "Plus Rechner",
                             WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                             CW_USEDEFAULT, CW_USEDEFAULT,
                             300, 135,
                             NULL,
                             NULL,
                             hInst,
                             NULL);
    
      // Fensterhandle zurückgeben
      return (hWnd);
    
    } // ErstelleHauptfenster
    
    // ErstelleSteuerelemente
    //
    // Alle Steuerelemente erstellen
    //
    void ErstelleSteuerelemente (HWND hWnd, HINSTANCE hInst)
    {
      // Statischen Text als Child-Fenster erstellen
      //
      hText = CreateWindow ("STATIC",
                            "Zahlen Rechner",
                            WS_VISIBLE | WS_CHILD | ES_CENTER,
                            0, 0,
                            300, 20,
                            hWnd,
                            (HMENU)ID_STATICTEXT,
                            hInst,
                            NULL);
    
      hErg = CreateWindow ("STATIC",
                            "Ergebnis",
                            WS_VISIBLE | WS_CHILD | ES_CENTER,
                            190, 20,
                            60, 20,
                            hWnd,
                            (HMENU)ID_ERG,
                            hInst,
                            NULL);
    
      // Editbox als Child-Fenster erstellen
      //
      hEditBox1 = CreateWindow ("EDIT",
                               "Zahl_1",
                               WS_VISIBLE | WS_CHILD | WS_BORDER,
                               40, 20,
                               60, 20,
                               hWnd,
                               (HMENU)ID_EDITBOX_1,
                               hInst,
                               NULL);
    
      hEditBox2 = CreateWindow ("EDIT",
                               "Zahl_2",
                               WS_VISIBLE | WS_CHILD | WS_BORDER,
                               120, 20,
                              60, 20,
                               hWnd,
                               (HMENU)ID_EDITBOX_2,
                               hInst,
                               NULL);
      // "Übernehmen"-Button als Child-Fenster erstellen
      //
      hUebernehmen = CreateWindow ("BUTTON",
                               "Rechnen",
                               BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
                               20, 50,
                               95, 40,
                               hWnd,
                               (HMENU)ID_BTN_UEBERNEHMEN,
                               hInst,
                               NULL);
    
      // "Beenden"-Button als Child-Fenster erstellen
      //
      hBeenden = CreateWindow ("BUTTON",
                               "Beenden",
                               BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
                               175, 50,
                               95, 40,
                               hWnd,
                               (HMENU)ID_BTN_BEENDEN,
                               hInst,
                               NULL);
    
    } // ErstelleSteuerelemente
    
    // Callback-Funktion zur Nachrichtenverarbeitung
    //
    LRESULT CALLBACK WindowProc (HWND hWnd, UINT message,
                                 WPARAM wParam, LPARAM lParam)
    {
      // Messages auswerten
      switch (message)
      {
        // Fenster schließen? (Auch Alt-F4)
        case WM_DESTROY:
        {
          // Nachricht zum Beenden schicken
          PostQuitMessage (0);
          return (0);
    
        }
    
        // Ab hier die Nachrichten unserer Child-Fenster bearbeiten
        case WM_COMMAND:
        {
          switch (wParam)
          {
            // Wurde "Übernehmen" angeklickt?
            case ID_BTN_UEBERNEHMEN:
    		{
              TCHAR szText[256];
    		  TCHAR szText1[256];
    		  int erg;
    		  int zahl1;
    		  int zahl2;
              // Text aus der Editbox holen
              GetWindowText (hEditBox1, szText, 256);
    		  GetWindowText (hEditBox2, szText1, 256);
    		  zahl1 = _ttoi(szText);
    		  zahl2 = _ttoi(szText1);
    		  erg = (zahl1 + zahl2);
    		  //erg = static_cast<int> (szText1 + szText);
              // Diesen Text in das Label schreiben und
    		  wsprintf(hErg,TEXT("%i"),erg);
    		  SetWindowText (hErg, erg);
    
              return (0);
    
            }
    
            // Wurde "Beenden" angeklickt?
            case ID_BTN_BEENDEN:
            {
              int Resultat; // Rückgabewert der Messagebox
    
              // Messagebox für Sicherheitsabfrage
              Resultat = MessageBox (hWnd, "Wirklich beenden?",
                                     "Programm beenden",
                                     MB_YESNO | MB_ICONQUESTION);
    
              // Wurde "Ja" angeklickt?
              if (Resultat == IDYES)
              {
                // Ja, also Programm beenden
                PostQuitMessage (0);
                return (0);
    
              }
    
              // Nein, also ganz normal weiter
              return (0);
    
            }
          } break;
        } break;
      }
    
      // Die Nachricht wurde nicht von uns verarbeitet, also
      // von Windows verarbeiten lassen
      return (DefWindowProc (hWnd, message, wParam, lParam) );
    
    } // WindowProc
    


  • (Falsches Forum..)
    Ich nehme mal an, es geht dabei (auch) um diesen Code-Teil?

    GetWindowText (hEditBox1, szText, 256); 
              GetWindowText (hEditBox2, szText1, 256); 
              zahl1 = _ttoi(szText); 
              zahl2 = _ttoi(szText1); 
              erg = (zahl1 + zahl2);
    

    Ich mache es immer so:

    Für float Zahlen:

    char szText[256], szText1[256]; 
    float zahl1, zahl2, erg;
    
    SendMessage(hEditBox1, WM_GETTEXT, sizeof(szText), (ULONG)szText);
    SendMessage(hEditBox2, WM_GETTEXT, sizeof(szText1), (ULONG)szText1);
    zahl1 = atof(szText); 
    zahl2 = atof(szText1);
    erg = zahl1 + zahl2;
    

    Für ganze Zahlen:

    char szText[256], szText1[256];
    int zahl1, zahl2, erg;
    
    SendMessage(hEditBox1, WM_GETTEXT, sizeof(szText), (ULONG)szText);
    SendMessage(hEditBox2, WM_GETTEXT, sizeof(szText1), (ULONG)szText1);
    zahl1 = atoi(szText); 
    zahl2 = atoi(szText1);
    erg = zahl1 + zahl2;
    

    Als Bettlektüre empfehle ich:
    http://www.cplusplus.com/reference/clibrary/cstdlib/

    Gruß,
    DC



  • Boar danke für die schnelle hilfe ^^
    werde es gleich mal ausprobieren!!!!



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten