Dialog schließt ganzes Programm
-
Hallo,
ich versuche nun meine ersten Schritte in WinAPI für WindowsCE.
Nun bin ich dabei ein kleines Programm zu schreiben, welches einfach 3 Buttons enthält und bei Klick auf einen dieser Button einen neuen Dialog öffnet.
Das klappt auch soweit, nur wenn ich diesen neuen Dialog oben rechts auf dem X schliesse, wird das ganze Programm beendet.
Ich kann den Fehler einfach nicht finden, vielleicht seht ihr ihn ja.So erzeuge ich den Dialog
g_hwndScann = CreateDialog( g_hInst, MAKEINTRESOURCE(IDD_SCAN), hWnd, (DLGPROC)ScanProc );Und hier die Behandlung der Nachrichten:
LRESULT CALLBACK ScanProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) { switch (message) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: switch( LOWORD(wParam) ) { case IDOK: EndDialog( hDlg, LOWORD(wParam) ); return TRUE; case IDCLOSE: EndDialog( hDlg, LOWORD(wParam) ); return TRUE; default: break; } break; } return FALSE; }Ich kann da keine Fehler finden....
-
So kann man hier auch nichts sehen.
Das Problem sehe ich eher in der nachrichtenschleife. Denn das Beenden eines fensters beendet ja nicht die Nachrichtenschleife, außer es wird ein PostQuitMessage durchgeführt!Wie sieht denn die Nachrichtenschleife aus, die Du verwendest?
-
Die Nachrichtenschleife in der WinMain sieht so aus:
while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); }
-
Dann muss irgendwo in Deinem Programm ein PostQuitMessage vorkommen!
Ohne versenden dieser Nachricht wird die Nachrichtenschleife nicht verlassen!
-
Setz mach noch WM_DESTROY mit zu. Und dann ShowWindow(). Also so:
case WM_DESTROY: ShowWindow (hDlg, SW_HIDE); break; //oder return 0;Mfg Ominion
-
@Ominion: Hat leider keinen Erfolg gebracht.
@Martin Richter: Ja klar hab ich ein PostQuitMessage, und zwar beim Destroy des hauptfensters.Ich poste jetzt mal meinen kompletten Code hier, ich hoffe er sit nicht zu groß:
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { MSG msg; g_hInst = hInstance; if ( !InitInstance () ) { return -1; } while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } /* * InitInstance * * Erzeugt das Hauptfenster */ BOOL InitInstance() { WNDCLASS wc; TCHAR szTitle[MAX_LOADSTRING]; // Titelzeile TCHAR szWindowClass[MAX_LOADSTRING]; // Klassenname /* fenstertitel und Aplicationsnamen aus der Tabelle laden */ LoadString( g_hInst, IDC_COMBINATION, szWindowClass, MAX_LOADSTRING ); LoadString( g_hInst, IDS_APP_TITLE, szTitle, MAX_LOADSTRING ); /* Wenn es schon einmal im Hintergrund läuft, nach vorne holen */ hWindow = FindWindow( szWindowClass, szTitle ); if ( hWindow ) { SetForegroundWindow ( hWindow ); return 0; } /* Fenster registrieren */ (void)memset ( &wc, 0, sizeof ( WNDCLASS ) ); wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; wc.lpfnWndProc = WndProc; wc.hInstance = g_hInst; wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wc.lpszMenuName = 0; wc.lpszClassName = szWindowClass; if ( ! RegisterClass(&wc) ) { MessageBox ( NULL, TEXT ("RegisterClassEx failed"), TEXT ("Fatal Error" ), 64 ); return false; } /* Fenster erstellen */ hWindow = CreateWindow( szWindowClass, szTitle, WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, g_hInst, NULL); if (!hWindow) { return FALSE; } /* Und anzeigen */ ShowWindow(hWindow, SW_SHOW ); UpdateWindow(hWindow); return TRUE; } /* * WndProc * * Empfängt die Nachrichten aus dem Hauptfenster */ LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { int wmId, wmEvent; RECT rect; int x = 0; int y = 0; int cx = 0; int cy = 0; char buffer [ 256 +1 ]; TCHAR wbuffer [ 256 + 1]; SHINITDLGINFO shidi; GetWindowRect ( hWnd, &rect ); x = rect.left; y = rect.top; cx = rect.right - rect.left; cy = rect.bottom - rect.top; switch ( message ) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); /* Menüaufrufe */ switch (wmId) { case IDD_\1: DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)AboutProc); break; case IDD_SEND: MessageBox ( hWnd, TEXT("Datei senden"), TEXT(""), 64 ); break; case IDD_RECV: MessageBox ( hWnd, TEXT("Datei empfangen"), TEXT(""), 64 ); break; case IDD_SCANNER: //MessageBox ( hWnd, TEXT("Datei scannen"), TEXT(""), 64 ); g_hwndScann = CreateDialog( g_hInst, MAKEINTRESOURCE(IDD_SCAN), hWnd, (DLGPROC)ScanProc ); if ( g_hwndScann ) { ShowWindow(g_hwndScann, SW_SHOW); } else { MessageBox ( hWnd, TEXT("Scan dialog failed"), TEXT(""), 64 ); return 0; } break; case IDD_EXIT: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_CREATE: hSendFile = CreateWindow (TEXT("BUTTON"), TEXT("Datei senden"), WS_VISIBLE | BS_PUSHBUTTON | WS_BORDER | WS_CHILD, 0, 30, cx, 50, (HWND)hWnd, (HMENU)IDD_SEND, g_hInst, NULL ); hRecvFile = CreateWindow (TEXT("BUTTON"), TEXT("Datei empfangen"), WS_VISIBLE | BS_PUSHBUTTON | WS_BORDER | WS_CHILD, 0, 120, cx, 50, (HWND)hWnd, (HMENU)IDD_RECV, g_hInst, NULL ); hScan = CreateWindow (TEXT("BUTTON"), TEXT("Scannvorgang durchführen"), WS_VISIBLE | BS_PUSHBUTTON | WS_BORDER | WS_CHILD, 0, 200, cx, 50, (HWND)hWnd, (HMENU)IDD_SCANNER, g_hInst, NULL ); break; case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(hWnd, message, wParam, lParam); } return DefWindowProc(hWnd, message, wParam, lParam); } LRESULT CALLBACK ScanProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) { SHINITDLGINFO shidi; switch (message) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: switch( LOWORD(wParam) ) { case IDOK: EndDialog( hDlg, LOWORD(wParam) ); return TRUE; case IDCLOSE: EndDialog( hDlg, LOWORD(wParam) ); return TRUE; default: break; } break; case WM_DESTROY: ShowWindow ( hDlg, SW_HIDE ); break; } return FALSE; } LRESULT CALLBACK AboutProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK) { EndDialog(hDlg, LOWORD(wParam)); MessageBox ( hDlg, TEXT("ok gedrückt in about"), TEXT(""), 64 ); return TRUE; } break; } return FALSE; }Was mache ich da bloß falsch?
-
Du rufst bei WM_Command die DefWindowProc() auf. Bei Menüaufrufen ist das gar nicht nötig.
im switch(message) rufst Du ebenfalls im default-Zweig hinter den CreateWindowEx() die DefWindowProc auf. Das ist auch nicht nötig.
Die Standardbearbeitung sollte eigentlich AFAIK nur beim Abschluß der WndProc aufgerufen werden, wenn alles andere beendet ist. Setz doch bei den vorherigen Aufrufen einfach mal return(0)ein.
-
So,
auch das lider wieder ohne Erfolg.
Ich verstehe es nicht.
Er sollte doch bei dem Scan Dialog wenn ich auf das X klicke,
im ScanProc im Close landen.Wieso tut er es nicht?
-
Versuchs doch mal so: bei
case IDCLOSE: EndDialog( hDlg, IDCANCEL ); break;
-
Jetzt ist es mit klar. <handvordenkopfschlag>
Du hast ja einen nicht modalen Dialog erzeugt!
Den nicht Modalen Dialog darfst Du in keinem Fall mit EndDiaog beenden! Der nicht modale Dialog wird einfach zerstört mit DestroyWindow!
-
Oh ja,
das war es.

Jetzt klappt es, vielen Dank. Dann haben die das in dem Tutorial was ich da gefunden hatte, aber ebenso falsch gemacht. grml
-
Klaus23 schrieb:
Jetzt klappt es, vielen Dank. Dann haben die das in dem Tutorial was ich da gefunden hatte, aber ebenso falsch gemacht. grml
Vielleicht haben Die aber auch einen modalen Dialog erzeugt und Du hast einen nciht modalen draus gemacht... <duck&wech>