Benutzer mit den meisten Antworten
Einlogfenster nimmt jede Eingabe als richtig?!

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