Fenster im Fenster?
-
hallo
habe hier ein kleines problem.
ich möchte in meinem hauptfenster zwei weitere kleine fenster haben. diese fenster sollen sich nur im hauptfenster bewegen lassen (so wie z.b. bei Excel).
habe dies auch mit dem unten stehenden programm erreicht, nur wenn ich das eine fenster über das andere bewegen und dann das untere beiseite ziehe, bekomme ich einen grafikfehler im fenster (das äußert sich so, dass ich reste vom ersten fenster im zweiten sehe).
weiterhin verstehe ich nicht warum, wenn ich eines der kleinen fenster anklicke, die obere leiste nicht blau wird (blau für aktives fenster), sondern grau bleibt?
thx slower
#include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK Child1Proc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK Child2Proc(HWND, UINT, WPARAM, LPARAM); const char szChild1Name[] = "Optionsmenü"; const char szChild2Name[] = "Simulation"; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("Klassenname"); HWND hwnd; MSG msg; WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon (NULL, IDI_APPLICATION); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) GetStockObject (GRAY_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = szAppName; wc.hIconSm = wc.hIcon; RegisterClassEx (&wc); wc.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH); wc.hIcon = NULL; wc.lpfnWndProc = Child1Proc; wc.lpszClassName = szChild1Name; RegisterClassEx(&wc); wc.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH); wc.hIcon = NULL; wc.lpfnWndProc = Child2Proc; wc.lpszClassName = szChild2Name; RegisterClassEx(&wc); hwnd = CreateWindowEx (WS_EX_OVERLAPPEDWINDOW, // erweiterter Fensterstil szAppName, // Name der Fensterklasse TEXT ("JigSim"), // Fenstertitel WS_OVERLAPPEDWINDOW, // Fensterstil 100, // X-Position des Fensters 60, // Y-Position des Fensters 850, // Fensterbreite 600, // Fensterhöhe NULL, // übergeordnetes Fenster NULL, // Menü hInstance, // Programm-Kopiezähler (Programm-ID) NULL); // zusätzliche Parameter 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) { HDC hdc; PAINTSTRUCT ps; HWND hButton; HWND hChild1; HWND hChild2; POINT point; switch (message) { case WM_CREATE: hChild1 = CreateWindow( szChild1Name, NULL, WS_CHILD | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, 600, 26, 200, 500, hwnd, NULL, ((LPCREATESTRUCT) lParam)->hInstance, NULL); hChild2 = CreateWindow( szChild2Name, NULL, WS_CHILD | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, 100, 100, 400, 300, hwnd, NULL, ((LPCREATESTRUCT) lParam)->hInstance, NULL); hButton = CreateWindow( "button", "Beenden", WS_CHILD | WS_VISIBLE |BS_PUSHBUTTON, 30, 30, 100, 30, hChild1, (HMENU)102, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); return (0); case WM_COMMAND: switch (LOWORD(wParam)) { case 102: PostQuitMessage (0); return (TRUE); default: break; } case WM_PAINT: hdc = BeginPaint (hwnd, &ps); //TextOut (hdc, 0, 0, "test", 27); EndPaint (hwnd, &ps); return (0); case WM_CONTEXTMENU: return 0; case WM_KEYDOWN: switch (wParam) { case VK_ESCAPE: PostQuitMessage (0); break ; } return 0 ; case WM_DESTROY: PostQuitMessage (0); return (0); } return DefWindowProc (hwnd, message, wParam, lParam); } LRESULT CALLBACK Child1Proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: switch (LOWORD(wParam)) { case 102: PostQuitMessage (0); return (TRUE); default: break; } case WM_SIZE: { return 0; } case WM_LBUTTONDOWN: { return 0; } case WM_PAINT: { HDC hDC; PAINTSTRUCT ps; hDC = BeginPaint(hwnd, &ps); EndPaint(hwnd, &ps); return 0; } } return DefWindowProc(hwnd, message, wParam, lParam); } LRESULT CALLBACK Child2Proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: switch (LOWORD(wParam)) { case 102: PostQuitMessage (0); return (TRUE); default: break; } case WM_SIZE: { return 0; } case WM_LBUTTONDOWN: { return 0; } case WM_PAINT: { HDC hDC; PAINTSTRUCT ps; hDC = BeginPaint(hwnd, &ps); EndPaint(hwnd, &ps); return 0; } } return DefWindowProc(hwnd, message, wParam, lParam); }
-
eigentlich sollte doch so die standart vorgehensweise bei einem Programm sein, wo fenster im fenster benötigt werden, oder?
viellecht ist diese anfängerfrage ja auch zu einfach, habe aber immernoch keine lösung
...
-
Ich weiß nicht genau, was du vorhast, aber schau dich mal hier um: Multiple Document Interface (MDI)
-
ja danke, das meine ich
habe jetzt folgendes versucht:
hChild1 = CreateWindowEx( WS_EX_MDICHILD, szChild1Name, NULL, WS_CHILD | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_SIZEBOX, 600, 26, 200, 500, hwnd, NULL, hInstance, NULL);
und
hChild1 = CreateMDIWindow( szChild1Name, NULL, WS_CHILD | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_SIZEBOX, 600, 26, 200, 500, hwnd, hInstance, NULL);
aber in beiden fällen wird das fenster nicht angezeigt, fehlt da noch was?
-
Using the Multiple Document Interface
Da findest du Beispiel-Code
-
slower schrieb:
aber in beiden fällen wird das fenster nicht angezeigt, fehlt da noch was?
bei den fenstern noch als style WS_VISIBLE angeben dann sieht man die auch
-
Du gucken hier: http://www.c-plusplus.net/forum/viewtopic.php?t=16727&highlight=mdi
... MDI ist sehr gut. Mach's einfach.
-
ok danke, jetzt gehts