C++ MessageBox Problem
-
Hi Leute,
also ich Programmiere erst seit ein paar wochen mit C++ und hab nun ein kleines Programm geschrieben das ein Passwort aus einer *.dat Datei lädt und in einer selbsterzeugten Klasse speichert. Dann muss der User über zwei Edit-Boxen den richtigen Benutzernamen und das Passwort dazu eingeben. Wenn das Passwort richtig ist Loggt das Prog den Benutzer ein, ist es jedoch falsch soll eine MessageBox aufgerufen werden die dem Benutzer sagt das er das er einen falschen Benutzernamen oder ein falsches Passwort eingegeben hat. Das Problem ist nur wenn ich die MessageBox in der MessageLoop unter "WM_CREATE" schreibe taucht Sie sofort auf, wenn ich Sie jedoch unter "WM_COMMAND", wo das Klicken des Login Buttons registriert wird, aufrufe dan kommt die MessageBox erst nach einigen Sek. oder garnicht. Kann mir da einer weiterhelfen???
Anbei schicke ich den Code
#define STRICT #include <windows.h> #include <stdio.h> #include "resource.h" #include "Userdaten.h" const UINT PM_LOGEDIN = WM_APP + 1; const UINT PM_SHOWNAV = WM_APP + 2; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK NavProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK PassProc(HWND, UINT, WPARAM, LPARAM); int LoadPasswort(void); int Login(HWND, char*, char*); int LogedIn = 0; Userdaten User; Userdaten *Start = NULL; Userdaten *Temp; Userdaten *Zeiger; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { HWND hWnd; MSG msg; WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); wc.hbrBackground = (HBRUSH) CreateSolidBrush(RGB(252,250,198)); wc.lpszClassName = "Startfenster"; wc.lpszMenuName = "IDR_HALLO"; RegisterClass(&wc); wc.hbrBackground = (HBRUSH) CreateSolidBrush(RGB(252,240,150)); wc.lpfnWndProc = NavProc; wc.lpszClassName = "Navigation"; wc.lpszMenuName = "NULL"; RegisterClass(&wc); wc.hbrBackground = (HBRUSH) CreateSolidBrush(RGB(252,250,198)); wc.lpfnWndProc = PassProc; wc.lpszClassName = "Passwortabfrage"; wc.lpszMenuName = "NULL"; RegisterClass(&wc); hWnd = CreateWindow("Startfenster", "Orthotherapia - Verwaltung V 1.0", WS_OVERLAPPED | WS_SYSMENU| WS_MINIMIZEBOX, 0, 0, 800, 600, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, iCmdShow); UpdateWindow(hWnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hNav, hPass; HINSTANCE hInstance; switch (message) { case WM_CREATE: { hInstance = ((LPCREATESTRUCT) lParam) -> hInstance; hNav = CreateWindow("Navigation", "", WS_CHILD | WS_VISIBLE, 0, 0, 150, 575, hWnd, NULL, hInstance, NULL); if(LogedIn == 0) { hPass = CreateWindow("Passwortabfrage", "", WS_CHILD | WS_VISIBLE, 151, 0, 649, 575, hWnd, NULL, hInstance, NULL); } return 0; } case WM_PAINT: { UpdateWindow(hNav); UpdateWindow(hPass); return 0; } case PM_LOGEDIN: { SendMessage(hPass, WM_CLOSE, 0, 0); LogedIn = 1; SendMessage(hNav, PM_SHOWNAV, 0, 0); return 0; } case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hWnd, message, wParam, lParam); } LRESULT CALLBACK NavProc(HWND hNav, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_PAINT: { return 0; } case PM_SHOWNAV: { MessageBox(hNav, "", "", 0); return 0; } } return DefWindowProc(hNav, message, wParam, lParam); } LRESULT CALLBACK PassProc(HWND hPass, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hEdit1, hEdit2, hButton1; static HBITMAP hBitmap ; static BITMAP bitmap; static HINSTANCE hInstance; switch (message) { case WM_CREATE: { hInstance = ((LPCREATESTRUCT) lParam) -> hInstance; LoadPasswort(); hBitmap = (HBITMAP) LoadImage(hInstance, "Images/OrthoLogo.bmp", IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE | LR_CREATEDIBSECTION); GetObject (hBitmap, sizeof (BITMAP), &bitmap) ; hEdit1 = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", NULL, WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL, 50, 135, 120, 20, hPass, NULL, hInstance, NULL); SendMessage(hEdit1, WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),0); hEdit2 = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", NULL, WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL | ES_PASSWORD, 50, 180, 120, 20, hPass, NULL, hInstance, NULL); SendMessage(hEdit2, WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),0); hButton1 = CreateWindow("button", "Anmelden", WS_CHILD | WS_VISIBLE | WS_TABSTOP, 50, 210, 80, 20, hPass, NULL, hInstance, NULL); SendMessage(hButton1, WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),0); return 0; } case WM_COMMAND: { if (lParam == (LPARAM)hButton1) { if (HIWORD(wParam) == BN_CLICKED) { char *BufferEdit1; char *BufferEdit2; int iLength; iLength = GetWindowTextLength(hEdit1); BufferEdit1 = new char[iLength+1]; GetWindowText(hEdit1, BufferEdit1, iLength+1); iLength = GetWindowTextLength(hEdit2); BufferEdit2 = new char[iLength+1]; GetWindowText(hEdit2, BufferEdit2, iLength+1); if(Login(hPass, BufferEdit1, BufferEdit2) == 0) { SendMessage(GetParent(hPass), PM_LOGEDIN, GetWindowLong(hPass, 0), (LPARAM)hPass); } else { MessageBox(hPass, "Bitte geben Sie den richtigen Benutzernamen und das Passwort ein!!!", "", 0); } delete BufferEdit1; delete BufferEdit2; return 0; } } return 0; } case WM_PAINT: { HDC hDC, hDCMem; PAINTSTRUCT ps; RECT rect; GetClientRect(hPass, &rect); hDC = BeginPaint(hPass, &ps); { hDCMem = CreateCompatibleDC (hDC) ; SelectObject (hDCMem, hBitmap); SetBkMode(hDC, TRANSPARENT); SetTextColor(hDC, RGB(150,50,0)); rect.top = 10; rect.left =+ 50; rect.right = rect.right - 50; char szText[] = "Willkommen bei der Orthotherapia - Verwaltung"; DrawText(hDC, szText, strlen(szText), &rect,DT_SINGLELINE | DT_CENTER); SetTextColor(hDC, RGB(0,0,0)); rect.top = 80; char szText2[] = "Bitte geben Sie Ihren Benutzernamen und Ihr Passwort ein."; DrawText(hDC, szText2, strlen(szText2), &rect,DT_SINGLELINE); rect.top = 115; char szText3[] = "Benutzername:"; DrawText(hDC, szText3, strlen(szText3), &rect,DT_SINGLELINE); rect.top = 160; char szText4[] = "Passwort: (min. 6 Zeichen)"; DrawText(hDC, szText4, strlen(szText4), &rect,DT_SINGLELINE); BitBlt (hDC, 250, 120, bitmap.bmWidth, bitmap.bmHeight, hDCMem, 0, 0, SRCCOPY) ; } EndPaint(hPass, &ps); return 0; } } return DefWindowProc(hPass, message, wParam, lParam); } int LoadPasswort() { long iFileSize; int i=0; int Laenge; char *FileBuffer; char *FileBufferTemp; char *Username; char *Passwort; char *PosZeiger; char *Puffer; FILE *fz; if((fz = fopen("Benutzer.dat", "rb")) != NULL) { if(fz != NULL) { fseek(fz, 0, 2); iFileSize = ftell(fz); FileBuffer = new char[iFileSize+1]; fseek(fz, 0, SEEK_SET); fread(FileBuffer, 1, iFileSize, fz); fclose(fz); FileBuffer[iFileSize] = '\0'; } while(i == 0) { PosZeiger = strrchr(FileBuffer, ';'); if(strlen(PosZeiger) == strlen(FileBuffer)) { i=1; } PosZeiger++; Puffer = new char[strlen(PosZeiger)]; sprintf(Puffer, "%s", PosZeiger); PosZeiger = strchr(Puffer, '-'); PosZeiger++; Passwort = new char[strlen(PosZeiger)]; sprintf(Passwort, "%s", PosZeiger); Laenge = strlen(Puffer) - strlen(PosZeiger); Username = new char[Laenge]; strncpy(Username, Puffer, --Laenge); Username[Laenge] = '\0'; if(i == 0) { PosZeiger = strrchr(FileBuffer, ';'); PosZeiger++; Laenge = strlen(FileBuffer) - strlen(--PosZeiger); FileBufferTemp = new char[Laenge+1]; strncpy(FileBufferTemp, FileBuffer, Laenge); FileBufferTemp[Laenge] = '\0'; delete[] FileBuffer; FileBuffer = new char[Laenge+1]; strcpy(FileBuffer, FileBufferTemp); delete[] FileBufferTemp; } Zeiger = new Userdaten; Zeiger->SetzeUserdaten(Username, Passwort); if (Start == NULL) { Start = Zeiger; // Erstes Element in der Liste } else { Temp->NaechstenDatensatzSetzen(Zeiger); // Zusätzliches Element } Temp = Zeiger; } return 0; } else { return 1; } delete FileBuffer; delete FileBufferTemp; delete Username; delete Passwort; delete PosZeiger; delete Puffer; } int Login(HWND hWnd, char* Username, char* Passwort) { Temp = Start; while(Temp != NULL) { if(Temp->VergleicheUserdaten(Username, Passwort) == 0) { User.SetzeUserdaten(Temp->HoleUsername(), Temp->HolePasswort()); return 0; } Temp = Temp->NaechstenDatensatzHolen(); } return 1; }
mfg
Thunder
-
Die MessageBox kommt natürlich nur, wenn Login fehlschlägt
- aber du meintest wohl was anderes
-
Ja irgendwie schon*lol*
Das Problem besteht darin das wenn Login fehlschlägt trotzdem die MessageBox erst nach einigen Sec. oder Sogar garnicht kommt.
mfg
Thunder
-
Ic hab nur schnell mal drübergeschaut, aber etwas lässt mich doch erstarren:
case WM_PAINT: { UpdateWindow(hNav); UpdateWindow(hPass); return 0; }
Und dies hier:
case WM_PAINT: { return 0; }
Entweder schmeisst Du das raus, oder Du rufst ordentlich BeginPaint/ EndPaint auf. Aber so geht's nicht. Vielleicht hilft Dir die Korrektur sogar schon ein wenig bei Deinem Problem.
-
Sorry bin halt erst seit ein paar wochen dabei*seufz*
Was passt den an dem UpdateWindow nicht???
Hab das nur so geschrieben, das nicht jedesmal wenn ich ein anderes Fenster über meines schiebe, mein Fenster nur noch zur hälfte vorhanden ist.
Wie kann ich das besser lösen???
Kennt vieleicht wer gute deutschsprachige tuts oder Bücher
mfg
Thunder
-
Es geht darum, dass du in WM_PAINT nicht mit return 0; reagieren sollst, sondern indem du (oder du lässt es DefWindowProc machen) Begin-/EndPaint aufrufst. Ansonsten kann es nämlich leicht passieren, wird hier so sein, dass du in eine Endlosschleife gerätst
-
*lol* Habs gelöscht und funktioniert
man ich hoff ich kappier das irgendwann.
mfg und vielen Dank
Thunder