Wer macht mir eine kleine GUI für mein Programm?



  • Ich hoffe, dass passt hier rein, aber habe nicht wirklich ein Forum gefunden
    in das dies passen würde.

    Ich habe bisher noch nie mit einer GUI gearbeitet oder der WinAPI, sondern nur auf der Konsole.
    Nun bräuchte ich aber eine ganz kleine GUI für ein kleines Progrämmchen und suche
    einen netten Programmierer hier, der mir diese schnell schreiben könnte 🙂
    Sie braucht wirklich nicht viel, nur folgendes:
    1Feld links für eine Eingabe (sollte Platz für eine Zahl bis 999999 haben).
    1Feld rechts für die Ausgabe (sollte Platz für eine Zahl bis 999999 haben).
    Einen Button darunter (sollte mittig sein und "berechnen" drauftsehen).

    Nun das Programm muss wirklich nicht viel tun, es soll nur die Zahl in Feld1
    nehmen, meiner Funktion übergeben und das Ergebnis meiner Funktion in Feld2
    ausgeben.

    Die Funktion berechnet aus der eingegebenen Zahl das nächstkleinere vielfache
    von 24.Genaugenommen tut die Funktion alles, man bräuchte sich also wirklich
    nur um die GUI zu kümmern.

    Hier die Funktion, der Prototyp lautet wie folgt: long unsigned int (long unsigned int Zahl);

    long unsigned int vielfaches (long unsigned int eingabe);
    
    long unsigned int vielfaches (long unsigned int eingabe) {
        long unsigned int zahl = 0;
    
        //Wenn kleiner 24, Zahl zurückgeben
        if (eingabe < 24) return eingabe; 
    
        //So lange eingabe größer als 0 ist, das vielfache suchen
        while (eingabe > 0) {
        //Eingabe durch 24 Teilen, die Ganzzahl in zahl darauf mit 24 multiplizieren
       // Wenn Sie der Eingabe entspricht ist es ein vielfaches von 24
        zahl = eingabe/24;
        if (zahl * 24 == eingabe) return eingabe;
        eingabe--;
        }
    }
    

    Wäre wirklich super wenn mir da jemand helfen könnte, ich selbst hatte leider
    noch nicht die Zeit mich mit GUIs bzw. der WinAPI zu befassen.



  • Falls du VisualStudio o.ä. besitzt kannst du dir einfach einen Dialog als Ressource basteln. Diesen rufst du mit DialogBox auf. (siehe dazu auch: http://c-plusplus.net/forum/viewtopic.php?t=39395 )
    In DialogProc fängst du einfach den Buttonclickab, rufst GetDlgItemInt auf, um den Wert auszulesen, und setzt ihn mit SetDlgItemInt wieder.

    case WM_COMMAND:
      switch (LOWORD(wParam)) 
      { 
        case IDDESBERECHNENBUTTONS:
        {
          UINT zahl = GetDlgItemInt(hDlg,IDFELD1,NULL,FALSE);
          UINT erg  = vielfaches(zahl);
          SetDlgItemInt(hDlg,IDFELD1,erg,FALSE);
          return TRUE;
        }
      }
      break;
    

    PS: Im Beitrag aus den FAQ wird die Variable hDlg als hwnd bezeichnet



  • Ich habe kein Visual Studio oder ähnliches, habe bisher mit Dev C++ gearbeitet.
    Deine Hilfe ist zwar gut gemeint, aber ich verstehe davon ehrlich gesagt nichts.
    Da ich mich bisher eben noch nie mit grafischen Oberflächen auseinandergesetzt
    habe weiß ich auch gar nicht wie ich da vorgehen soll.Da ich zur Zeit noch am
    lernen der weiteren Grundlagen von C bin (Datenstrukturen,Algorithmen,...),habe
    ich auch noch nicht das Wissen das wirklich zu verstehen 😞
    Daher wäre ich eben sehr froh, wenn mir jemand das machen könnte und den Quellcode
    werde ich später auch einmal verstehen 🙂



  • Nur mal schnell zusammengezimmert - sieht daher nicht besonders aus 😉

    #include <windows.h>
    
    #define ID_INPUT	1
    #define ID_OUTPUT	2
    #define ID_BUTTON	3
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    long unsigned int vielfaches (long unsigned int eingabe); 
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
    {
       static TCHAR szAppName[] = TEXT ("Klassenname");
       HWND         hwnd;
       MSG          msg;
       WNDCLASSEX   wndclassex = {0};
    
       wndclassex.cbSize        = sizeof(WNDCLASSEX);
       wndclassex.style         = CS_HREDRAW | CS_VREDRAW;
       wndclassex.lpfnWndProc   = WndProc;
       wndclassex.cbClsExtra    = 0;
       wndclassex.cbWndExtra    = 0;
       wndclassex.hInstance     = hInstance;
       wndclassex.hIcon         = LoadIcon (NULL, IDI_APPLICATION);
       wndclassex.hCursor       = LoadCursor (NULL, IDC_ARROW);
       wndclassex.hbrBackground = (HBRUSH) GetStockObject (LTGRAY_BRUSH);
       wndclassex.lpszMenuName  = NULL;
       wndclassex.lpszClassName = szAppName;
       wndclassex.hIconSm       = wndclassex.hIcon;
    
       if (!RegisterClassEx (&wndclassex))
       {
          MessageBox (NULL, TEXT ("RegisterClassEx fehlgeschlagen!"), szAppName, MB_ICONERROR);
          return 0;
       }
    
       hwnd = CreateWindowEx (WS_EX_OVERLAPPEDWINDOW, // erweiterter Fensterstil
                      szAppName, // Name der Fensterklasse
                      TEXT ("Fenstertitel"), // Fenstertitel
                      WS_OVERLAPPEDWINDOW, // Fensterstil
                      CW_USEDEFAULT, // X-Position des Fensters                      
                      CW_USEDEFAULT, // Y-Position des Fensters       
                      320, // Fensterbreite                 
                      90, // Fensterhöhe                
                      NULL, // übergeordnetes Fenster
                      NULL, // Menü           
                      hInstance, // Programm-Kopiezähler (Programm-ID)            
                      NULL); // zusätzliche Parameter
    
       ShowWindow (hwnd, iCmdShow);
       UpdateWindow (hwnd);
    
       while (GetMessage (&msg, NULL, 0, 0))
       {
          TranslateMessage (&msg);
          DispatchMessage (&msg);
       }
       return msg.wParam;
    }
    
    // Die Hauptnachrichtenschleife
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
       switch (message)
       {
       case WM_CREATE:
          CreateWindow("EDIT","",WS_VISIBLE|WS_CHILD|WS_BORDER,20,20,80,20,hwnd,(HMENU)ID_INPUT,((LPCREATESTRUCT)lParam)->hInstance,0);
          CreateWindow("EDIT","",WS_VISIBLE|WS_CHILD|WS_BORDER,110,20,80,20,hwnd,(HMENU)ID_OUTPUT,((LPCREATESTRUCT)lParam)->hInstance,0);
          CreateWindow("BUTTON","Berechnen",WS_VISIBLE|WS_CHILD|WS_BORDER,210,20,80,20,hwnd,(HMENU)ID_BUTTON,((LPCREATESTRUCT)lParam)->hInstance,0);
          return (0);
    
       case WM_COMMAND: 
          switch (LOWORD(wParam))  
    	  {  
            case ID_BUTTON:
    		{
              UINT zahl = GetDlgItemInt(hwnd,ID_INPUT,NULL,FALSE); 
              UINT erg  = vielfaches(zahl); 
              SetDlgItemInt(hwnd,ID_OUTPUT,erg,FALSE); 
              return (0); 
    		} 
    	  }
    	  break;
    
       case WM_DESTROY:
          PostQuitMessage (0);
          return (0);
       }
    
       return DefWindowProc (hwnd, message, wParam, lParam);
    }
    
    long unsigned int vielfaches (long unsigned int eingabe) { 
        long unsigned int zahl = 0; 
    
        //Wenn kleiner 24, Zahl zurückgeben 
        if (eingabe < 24) return eingabe;  
    
        //So lange eingabe größer als 0 ist, das vielfache suchen 
        while (eingabe > 0) { 
        //Eingabe durch 24 Teilen, die Ganzzahl in zahl darauf mit 24 multiplizieren 
       // Wenn Sie der Eingabe entspricht ist es ein vielfaches von 24 
        zahl = eingabe/24; 
        if (zahl * 24 == eingabe) return eingabe; 
        eingabe--; 
        }
    }
    


  • ich würde die edit's noch auf ES_NUMBER setzen



  • Vielen Dank, ist wirklich nett von dir.
    Bekomme beim Linken, aber folgenden Fehler:

    [Linker error] undefined reference to `GetStockObject@4'



  • Gdi32.lib mitlinken



  • Wo finde ich die und wie linke ich die mit?
    mit #include <gdi32.lib> geht es nicht, er findet sie auch nicht.

    Finde in einem Unterverzeichnis eine libgdi32.a aber die kann ich nicht über
    #include <libgdi32.a> einbinden.



  • Wie das bei Dev C++ geht kann ich dir leider nicht sagen, da verschiebe ich dich mal 😉



  • Du kannst mich doch nicht einfach so abschieben 😉
    Hast du die Möglichkeit das Topic zu ändern?Ist jetzt irgendwie unpassend.

    Mein Problem mit Dev C++ :
    Ich habe mir die komplette Dev C++ Distribution heruntergeladen(die mit Compiler),
    wie kann ich die gdi32.lib in mein Programm linken?



  • Wenn du deinen ersten Beitrag editierst kannst du imho den Titel ändern 🙄



  • Da war ich aber nocht nicht registriert.



  • habe zwar auch keinen devcpp, aber irgendwo gibt es da glaub ich etwas mit

    Load Object files

    dann die lib mitlinken... aber liest einfach mal die hilfe zu deiner ide.. ist sicher ein faq mit dabei.



  • Perfekt, habe es in der Hilfe gefunden.Und das programm funktioniert einwandfrei 🙂
    Vielen Dank.


Anmelden zum Antworten