2x WndProc
-
Hallo,
ich wollte mal fragen ob jemand ein kurzes Code Beispiel hat für ein Programm mit zwei Fenstern und jeweils einer eigenen Nachrichten verarbeitung, so das die Fenster unabhängig von einander Agieren können??Schonmal vielen Dank im Voraus
-
Einfach zwei Klassen mit unterschiedlichen Fensterprozeduren erstellen.
-
Das Habe ich versucht, leider ist mein Ansatz nicht erfolgreich, deswegen wollte ich um ein Beispiel bitten, damit ich meinen Fehler suchen kann, ich glaube nämlich nur das was fehlt.
-
Du könntest ja auch einfach mal deinen Ansatz erläutern, dann könnte man dir zeigen was du falsch machst...
-
Würde das vielleicht helfen? (Habe es stark vereinfacht):
Einfach kompilieren, ausführen und in eines der beiden angezeigten Fenster klicken. Dann kommt eine MessageBox und sagt dir welche WndProc aufgerufen wurde:#define IDM_EXIT 105 #include <windows.h> #include <tchar.h> LRESULT CALLBACK WndProc1(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK WndProc2(HWND, UINT, WPARAM, LPARAM); int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc1; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = NULL; wcex.hCursor = NULL; wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = NULL; wcex.lpszClassName = L"Fenster_1"; wcex.hIconSm = NULL; RegisterClassEx(&wcex); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc2; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = NULL; wcex.hCursor = NULL; wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = NULL; wcex.lpszClassName = L"Fenster_2"; wcex.hIconSm = NULL; RegisterClassEx(&wcex); HWND handle_fenster_1 = CreateWindow(L"Fenster_1", L"Fenster 1", WS_OVERLAPPEDWINDOW, 50, 50, 200, 100, NULL, NULL, hInstance, NULL); HWND handle_fenster_2 = CreateWindow(L"Fenster_2", L"Fenster 2", WS_OVERLAPPEDWINDOW, 300, 50, 200, 100, NULL, NULL, hInstance, NULL); ShowWindow(handle_fenster_1, nCmdShow); UpdateWindow(handle_fenster_1); ShowWindow(handle_fenster_2, nCmdShow); UpdateWindow(handle_fenster_2); HACCEL hAccelTable = LoadAccelerators(hInstance, L"Tabellen_Name"); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; } LRESULT CALLBACK WndProc1(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; switch (message) { case WM_COMMAND: { wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); switch (wmId) { case IDM_EXIT: { DestroyWindow(hWnd); break; } default: { return DefWindowProc(hWnd, message, wParam, lParam); } } break; } case WM_LBUTTONDOWN: { MessageBox(NULL,L"WndProc1",L"",MB_OK); } case WM_PAINT: { hdc = BeginPaint(hWnd, &ps); // TODO: Hier den Zeichnungscode hinzufügen. EndPaint(hWnd, &ps); break; } case WM_DESTROY: { PostQuitMessage(0); break; } default: { return DefWindowProc(hWnd, message, wParam, lParam); } } return 0; } LRESULT CALLBACK WndProc2(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; switch (message) { case WM_COMMAND: { wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); switch (wmId) { case IDM_EXIT: { DestroyWindow(hWnd); break; } default: { return DefWindowProc(hWnd, message, wParam, lParam); } } break; } case WM_LBUTTONDOWN: { MessageBox(NULL,L"WndProc2",L"",MB_OK); } case WM_PAINT: { hdc = BeginPaint(hWnd, &ps); // TODO: Hier den Zeichnungscode hinzufügen. EndPaint(hWnd, &ps); break; } case WM_DESTROY: { PostQuitMessage(0); break; } default: { return DefWindowProc(hWnd, message, wParam, lParam); } } return 0; }
-
Ich habe das nicht verstanden mit den zwei Fenstern und deren WndProcs. Bei Dialogen kann man das bequem mit moduslosen Dialogen machen. Dafür muss man die
Fensterhandles bereitstellen und mit diesen in WinMain die Warteschleife erweitern.