Leeres Child-Fenster im vollen Parent-Fenster. Wie geht das?
-
Hallo Leutz.
Ich habe folgendes Problem: Ich möchte ein Parent-Fenster erstellen, in dem man alles mögliche auswählen kann. Wenn ich dann mit auswählen fertig bin und alles starte, soll das Ergebniss im leeren Child-Fenster angezeigt werden. Mein Problem jetzt: wenn ich ein Child-Fenster erzeuge, bekommt es den Inhalt vom Parent-Fenster. Wie kann ich das umgehen? Ich sitze jetzt schon seit knapp 3 Stunden daran und auch Internetquellen haben mir nicht geholfen, also bitte: Helft mir!Mfg Ominion
PS: Bitte nicht irgend etwas antworten wie "Was hast du denn probiert", sondern einfach nur eine Lösung, einen Lösungsansatz, eine erklärende Site oder gar ganzen Code, danke.
-
Du musst dir für das Child eine neue Fensterklasse mit einer neuen WndProc registrieren, sonst verhält es sich genau wie dein Hauptfenster...
-
Das habe ich auch schon versucht, aber entweder kam gar kein Fenster oder das Fenster hatte schon wieder den gleichen Inhalt wie das Hauptfenster. Ich glaube das sah ungefähr so aus:
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK WndProc2 (HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain (HINSTANCE hI, HINSTANCE hPrI, PSTR szCmdLine, int iCmdShow) { char szName[] = "Hauptfenster"; char szName2[] = "Childfenster"; HBRUSH BkgColor = CreateSolidBrush ( RGB (0, 150, 250) ); hI = g_hInst; MSG msg; WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hI; wc.hIcon = LoadIcon (NULL, IDI_APPLICATION); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = BkgColor; wc.lpszMenuName = NULL; wc.lpszClassName = szName; RegisterClass (&wc); HWND hWnd1 = CreateWindow ( szName, "Multimediaplayer 0.3", WS_SYSMENU | WS_MINIMIZE | WS_MAXIMIZE, 300, 300, 473, 220, NULL, NULL, g_hInst, NULL ); ShowWindow (hWnd1, iCmdShow); UpdateWindow (hWnd1); wc.lpfnWndProc = WndProc2; wc.hbrBackground = BkgColor; wc.lpszMenuName = NULL; wc.lpszClassName = szName2; RegisterClass (&wc); HWND hWnd2 = CreateWindow ( szName2, NULL, WS_POPUP, 50, 50, 200, 150, hWnd1, NULL, g_hInst, NULL ); ShowWindow (hWnd2, SW_SHOW); UpdateWindow (hWnd2); while (GetMessage (&msg, NULL, NULL, NULL)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; }
Ich weiß nicht ob das auch relevant ist, aber ich habe dem Child-Fenster logischerweise auch das Handle vom Parent-Fenster gegeben. Das dürfte aber eigentlich nicht der Fehler sein.
Mfg Ominion
-
Ich verstehe dein Problem auch nicht. Was meinst du überhaupt mit gleichem Inhalt. Was du in einem Fenster zeichnest oder was für Controls du anlegst, machst du doch in der WndProc also was ist überhaupt mit gleichen Inhalt gemeint. Und ausserdem, wieso überschreibst du in deiner WinMain gleich als erstes die hInstance?
-
Also ich lege einen Button und ein Editfeld im Hauptfenster an. Wenn ich jetzt noch ein Childfenster dazu setzte, bekommt es genau den gleichen Inhalt wie das Hauptfenster. Das heißt also, dass das Childfenster auch einen Button und ein Editfeld bekommt, obwohl ich die in seiner WndProc gar nichts davon erstellt habe. Zu der Hinstance: Ich Subclasse die Hinstance g_hInst und sage in der WinMain dann, dass die die Hinstance hI genau das gleiche ist wie g_hInst. Hatte irgendeinen Vorteil, ich weiß gerade nur nicht mehr welchen.
Mfg Ominion
-
hInstance ist die Addresse an der das Modul im Prozessadressraum eingeblendet wird, was willst du denn da subclassen? Ich tippe mal daß du das ganze andersrum machen willst und den hInstance wert in der globalen g_hInst haben willst. Das macht man überlicherweise so. Dein anderes Problem kann ich immer noch ned nachvollziehen, zeig uns mal ein funktionierendes Beispiel, dann kann man auch sagen woran es liegt.
-
Wie meinst du das "ein funktionierendes Beispiel"? Also falls du einfach nur ein Prgramm meinst, wie ich es sonst auch immer mache, dann steht es oben. Aber meinetwegen zeig ich dir noch ein anderes kleines Progrämmchen:
#include <windows.h> #include <shlwapi.h> #pragma comment (lib, "shlwapi.lib") LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); HINSTANCE g_hInst; int WINAPI WinMain (HINSTANCE hI, HINSTANCE hPrI, PSTR szCmdLine, int iCmdShow) { char szName[] = "Hauptfenster"; HBRUSH BkgColor = CreateSolidBrush ( RGB (0, 150, 250) ); hI = g_hInst; MSG msg; WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hI; wc.hIcon = LoadIcon (NULL, IDI_APPLICATION); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = BkgColor; wc.lpszMenuName = NULL; wc.lpszClassName = szName; RegisterClass (&wc); HWND hWnd1 = CreateWindow ( szName, "Pathreader 1.0", WS_SYSMENU | WS_MINIMIZE | WS_MAXIMIZE, 300, 300, 473, 220, NULL, NULL, g_hInst, NULL ); ShowWindow (hWnd1, iCmdShow); UpdateWindow (hWnd1); while (GetMessage (&msg, NULL, NULL, NULL)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; } LRESULT CALLBACK WndProc (HWND hWnd1, UINT message, WPARAM wParam, LPARAM lParam) { char puffer[255]; static HWND hLevel; switch (message) { case WM_CREATE: GetModuleFileName (NULL, puffer, 255); PathRemoveFileSpec(puffer); hLevel = CreateWindow ("listbox", NULL, WS_VISIBLE | WS_CHILD, 0, 75, 473, 17, hWnd1, (HMENU)1, NULL, NULL); SendMessage (hLevel, LB_ADDSTRING, 25, (LPARAM) (LPTSTR)puffer); return 0; case WM_DESTROY: PostQuitMessage (0); return 0; } return DefWindowProc (hWnd1, message, wParam, lParam); }
Dieses Programm liest den Programmpfad aus und sendet ihn an eine ListBox.
Mfg Ominion
-
Hat den niemand einen Link oder ein konkretes Beispiel?
Mfg Ominion
-
Es ist uns nicht klar, was du eigentlich machst und du hast immer noch kein Beispiel präsentiert, was dein Problem genau wiederspiegelt. Wie man ein Fenster anlegt, wissen wir alle selber.
-
z.B waere die implementation der 2 winprocs interssant
-
Ominion schrieb:
Hat den niemand einen Link oder ein konkretes Beispiel?
Hier ein Link mit einem Child-Window-Tutorial.
http://www.win-api.de/tutorials.php?tutid=12
Die anderen Tutorials auf der Site sind auch nicht übel. Da gibt es zum Beispiel auch eines über "Text im Child":
-
Danke jetzt klappt es.
Mfg Ominion