none
Einlogfenster nimmt jede Eingabe als richtig?! RRS feed

  • Frage

  • Hallo erstmal,

    ich hab da mal ne Frage umgenau zusein zwei.

    erstens wollt ich mal fragen wie ich den hintergrund bei diesem einlogfenster ändern kann (also ein cooles bild von meiner festplatte). wie man die frabe ändert weiß ich schon.

    zweitens gibt es da ein kleines problem, ich will das wenn man in die beiden zeilen einen benutzernamen eingibt (denn ich mir aussuche) und ein passwort. Leider kann man bei mir alles eingeben und er sagt trotzdem es ist richtig und komischerweise kann ich nur einen buchstaben als benutzernamen und passowort wählen. Sonst sagt er mir Zuviele Zeichen in Konstante. obwohl char doch soweit ich gelesen habe doch 256 zeichen speichern kann.

    Hier ist der Quellcode dazu :





    #include <windows.h>
    #include <iostream>

    //


    #define ID_STATICTEXT      4000
    #define ID_EDITBOX         4001
    #define ID_BTN_EINLOGEN    4002
    #define ID_BTN_BEENDEN     4003
    #define ID_EDITBOX_2       4004
    char chBenutzername[256] = "Stefan";
    char chPasswort[256] = "flocx3d";





    HWND hText;        // Handle für den statischen Text
    HWND hEditBox;     // Handle für die Editbox
    HWND hEinlogen;    // Handle für Button "Einlogen"
    HWND hBeenden;     // Handle für Button "Beenden"
    HWND hText_2;      // Handle für Text 2
    HWND hEditbox_2;   // Handle für die Editbox 2
    HWND hText_3;

    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


    // Hauptprogramm
    //
    int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst,
                        LPSTR lpcmdline, int ncmdshow)
    {
      HWND hWnd;   // Fenster-Handle
      MSG message; // Nachricht

      // Hauptfenster erstellen
      hWnd = ErstelleHauptfenster (hInst);

     
      if (hWnd == NULL)
        return (0);

     
      ErstelleSteuerelemente (hWnd, hInst);

     
      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;

      // 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,
                             "BlueMoon",
                             WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                             CW_USEDEFAULT, CW_USEDEFAULT,
                             1024, 1280,
                             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",
                            "Benutzername:",
                            WS_VISIBLE | WS_CHILD | ES_CENTER,
                            555, 620,
                            300, 20,
                            hWnd,
                            (HMENU)ID_STATICTEXT,
                            hInst,
                            NULL);

      hText_2 = CreateWindow ("STATIC",
                              "        Passwort:",
                              WS_VISIBLE | WS_CHILD | ES_CENTER,
                              555, 650,
                              300, 20,
                              hWnd,
                             (HMENU)ID_STATICTEXT,
                              hInst,
                              NULL);

      hText_2 = CreateWindow ("STATIC",
                              "BlueMoon",
                              WS_VISIBLE | WS_CHILD | ES_CENTER,
                              0, 0,
                              600, 500,
                              hWnd,
                             (HMENU)ID_STATICTEXT,
                              hInst,
                              NULL);


      // Editbox als Child-Fenster erstellen
      //
      hEditBox = CreateWindow ("EDIT",
                                "",
                               WS_VISIBLE | WS_CHILD | WS_BORDER,
                               768, 620,
                               220, 20,
                               hWnd,
                               (HMENU)ID_EDITBOX,
                               hInst,
                               NULL);


       hEditbox_2 = CreateWindow ("EDIT",
                                "",
                               WS_VISIBLE | WS_CHILD | WS_BORDER,
                               768, 650,
                               220, 20,
                               hWnd,
                               (HMENU)ID_EDITBOX,
                               hInst,
                               NULL);

      // "Übernehmen"-Button als Child-Fenster erstellen
      //
      hEinlogen = CreateWindow ("BUTTON",
                               "Einlogen",
                               BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
                               768, 700,
                               95, 40,
                               hWnd,
                               (HMENU)ID_BTN_EINLOGEN,
                               hInst,
                               NULL);

      // "Beenden"-Button als Child-Fenster erstellen
      //
      hBeenden = CreateWindow ("BUTTON",
                               "Beenden",
                               BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
                               890, 700,
                               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)
          {
          
            case ID_BTN_EINLOGEN:
            {
             
                if ((chBenutzername[256] = 'S') && (chPasswort[256] = 'f'))
        {
                int Resultat_2; // Rückgabewert der Messagebox

              // Messagebox für Sicherheitsabfrage
              Resultat_2 = MessageBox (hWnd, "Eingaben sind richtig. Viel Spaß beim Spielen.",
                                     "Eingaben sind richtig.",
                                   MB_OK );        
     }     
             else
             {
                int Resultat_3; // Rückgabewert der Messagebox

              // Messagebox für Sicherheitsabfrage
              Resultat_3 = MessageBox (hWnd, "Eingaben sind falsch. Bitte probier es nochmal.",
                                     "Eingaben sind falsch.",
                                   MB_OK );        
             }

              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_ICONQUESTION | 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










    Vielen Dank schonmal

    Gruß Zerik13

    Mittwoch, 4. März 2009 17:32

Antworten

  • Hiho Zerik,

    ich programmiere zwar auch noch nicht allzulang (naja, 10 wochen ist wirklich kurz :P ), aber mir ist da etwas aufgefallen....

    Eine char-Variable hat eigentlich die Größe von einem Zeichen, nicht von einer Zeichenkette. Aber dafür hast du ja ein array mit der Größe 256 angelegt:

     

    char chBenutzername[256] = "Stefan";
    char chPasswort[256] = "flocx3d";
    

     

    Das bedeutet, dass dieses array 256 Zeichen aufnehmen kann (also in der Größe erzeugt wurde). Dabei werden die einzelnen Elemente des arrays dann mit chBenutzername[0] bis chBenutzername[255] angesprochen (ein array fängt nunmal mit dem Index bei 0 an ;) ).

    Weiter unten versuchst Du jetzt mit

     

    if ((chBenutzername[256] =
     'S') && (chPasswort[256] = 'f'))

     

    auf das 256te Element des arrays zuzugreifen (noch mal zur Erinnerung: Du hast zwar eine array-Größe von 256, aber der Index-Bereich liegt bei 0-255). Auch hast Du hier eigentlich gewollt (nehme ich jetzt mal an), dass dieses Zeichen gelesen wird. Jedoch hast Du hier eine Wertzuweisung benutzt und nicht einen Vergleich (Vergleichsoperation "==" || Wertzuweisung "=" )

    Damit versuchst Du, ausserhalb dieses arrays zuzugreifen, was natürlich zu einem Fehler führt.

    Wenn ich das richtig sehe, möchtest Du das erste Zeichen beider arrays vergleichen, also sollte diese Abfrage dann

     

    if ((chBenutzername[0] == 'S') && (chPasswort[0] == 'f'))

     

    heissen.

     

    Jetzt kommt aber das wesentliche ;)

    Ich sehe in deinem code nirgenswo eine Abfrage... Wo werden die eingegebenen char*-werte zum Auswerten benutzt? Du vergleichst die ersten beiden Elemente der arrays (die oben festgelegt wurden) mit dem ersten Buchstaben. Ich meine, Du kannst natürlich jetzt alles eingeben, was Du möchtest, jedoch vergleicht das Programm nicht Deine Eingabe mit dem array.

    Mit Deiner Abfrage

    if ((chBenutzername[0] == 'S') && (chPasswort[0] == 'f'))

    "schaust" Du ja nur nach ob die ersten Buchstaben gleich sind mit  'S' bzw. 'f'... und das sind sie ja ;)

    guckst Du :

    char chBenutzername[256] = "Stefan";
    char chPasswort[256] = "flocx3d";
    

    Bedeutet, dem Programm ist es egal was Du eingibst, das erste Zeichen in beiden arrays stimmt ja eh mit dem gewünschten (vorher definiertem) überein ;)

     

    Ich hoffe, dass ich wenigstens ein wenig weiterhelfen konnte, trotz der noch extrem wenigen Erfahrung ;)

     

    lg chryz

    • Als Antwort vorgeschlagen Martin Richter Dienstag, 13. April 2010 09:59
    • Als Antwort markiert Martin Richter Dienstag, 2. August 2011 06:59
    Dienstag, 13. April 2010 07:20