Wie zur Hölle macht man ein neues Fenster auf
-
Hab die Frage schonmal gestellt, hab es aber nicht hingegriegt. Muss ich eine ganz neue WInMain machen oder nur ein Fenster registrieren( und wenn ja wo???)
Ach ja, wär wirklich nett wenn mir das mal jemand erklären könnte
-
Wenn es ein anderes Fenster sein soll, musst du dafür eine 2. Fensterklasse registrieren (z.B. gleich zu Beginn in WinMain) - also brauchst du nur eine zweite WndProc (natürlich mit anderem Namen)

-
meinst du so:
int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { HWND hwnd; /* This is the handle for our window */ MSG messages; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */ /* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof (WNDCLASSEX); /* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use Windows's default color as the background of the window */ wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; /* Register the window class, and if it fails quit the program */ if (!RegisterClassEx (&wincl)) return 0; /* The class is registered, let's create the program*/ hwnd = CreateWindowEx ( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ "Windows App", /* Title Text */ WS_OVERLAPPEDWINDOW, /* default window */ 150, /* Windows decides the position */ 175, /* where the window ends up on the screen */ 600, /* The programs width */ 400, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); /* Make the window visible on the screen */ ShowWindow (hwnd, nFunsterStil); HWND hwnd2 = CreateWindow // Fenster 2 ( szClassName, "Dies ist unser zweites kleines Fenster", WS_OVERLAPPEDWINDOW, 200, 200, 200, 50, hwnd, // Handle des Elternfensters (HMENU)99,//(HMENU)100, NULL, NULL ); ShowWindow (hwnd2, SW_SHOWNORMAL); UpdateWindow (hwnd2); /* Run the message loop. It will run until GetMessage() returns 0 */ while (GetMessage (&messages, NULL, 0, 0)) { /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); } /* The program return-value is 0 - The value that PostQuitMessage() gave */ return messages.wParam; }weil das nicht funktioniert
-
du hasst keine zweite fensterklasse registriert (RegisterClassEx(..)) sondern versuchst ein zweites fenster mit der selben klasse zu erstellen --> geht nicht.
was soll dieses zweite fenster denn machen?
-
Ich will darauf eine Liste von Möglichkeiten ausgeben, von denen sich der Benutzer eine aussuchen kann und dann auf OK klickt um das Fenster zu schließen.
Es reicht also, wenn ich
if (!RegisterClassEx (&wincl)) return 0;hinzufüge?
-
nicht ganz du musst eine zweite fensterklasse erzeugen
WNDCLASSEX wincl_1; WNDCLASSEX wincl_2;beide füllen und registrieren.
oder eine füllen, registrieren, alte überschreiben, registrieren.
-
Ich kriegst einfach nicht hin

Kannst du vielleicht mal Quellcode zeigen (wenns nicht zu lange dauert).
Ist es wichtig, wie die zweite WinPrc heist?
-
nein, du musst es nur eben entsprechend bei der 2. Fensterklasse in lpfnWndProc angeben. Also eigentlich nur lpszClassName und lpfnWndProc ändern und nochmal RegisterClassEx aufrufen

-
bsp (schnell zusammenkopiert und ungetestet müsst aber gehen
)wincl.hInstance = hThisInstance; wincl.lpszClassName = TEXT("MainWndClass"); wincl.lpfnWndProc = WindowProc; wincl.style = CS_HREDRAW | CS_VREDRAW; wincl.cbSize = sizeof(WNDCLASSEX); wincl.hIcon = LoadIcon(hThisInstance, MAKEINTRESOURCE(IDI_MAIN)); wincl.hIconSm = LoadIcon(hThisInstance, MAKEINTRESOURCE(IDI_MAIN)); wincl.hCursor = LoadCursor(NULL, IDC_ARROW); wincl.lpszMenuName = "MAINMENU"; wincl.cbClsExtra = 0; wincl.cbWndExtra = 0; wincl.hbrBackground = (HBRUSH)(COLOR_WINDOW); if(!RegisterClassEx(&wincl)) return -1; wincl.hInstance = hThisInstance; wincl.lpszClassName = TEXT("ClientWndClass"); wincl.lpfnWndProc = ClientWindowProc; wincl.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; wincl.cbSize = sizeof(WNDCLASSEX); wincl.hIcon = NULL; wincl.hIconSm = NULL; wincl.hCursor = LoadCursor(NULL, IDC_CROSS); wincl.lpszMenuName = NULL; wincl.cbClsExtra = 0; wincl.cbWndExtra = 0; wincl.hbrBackground = (HBRUSH)(COLOR_WINDOW); if(!RegisterClassEx(&wincl)) return -1; if(!(hwnd = CreateWindowEx( WS_EX_APPWINDOW, TEXT("MainWndClass"), TEXT("Title"), WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN |WS_VISIBLE, 25, 25, GetSystemMetrics(SM_CXSCREEN) - 50, GetSystemMetrics(SM_CYSCREEN) - 100, HWND_DESKTOP, NULL, hThisInstance, NULL))) { MessageBox( NULL, "Couldn't create Mainwindow", "Error", MB_OK | MB_ICONEXCLAMATION); return -1; } //... zweites fenster erstellen if(!(hwndClient = CreateWindowEx( WS_EX_CLIENTEDGE, TEXT("ClientWndClass") "", WS_CHILD | WS_VISIBLE, 0, 0, 200, 200, hwnd, (HMENU)IDC_IRGENDWAS, hThisInstance, NULL))) { MessageBox( NULL, "Couldn't create Clientwindow", "Error", MB_OK | MB_ICONEXCLAMATION); return -1; } // .. und weiter geht's
-
kannst du mir sagen warum er hier rummeckert? is alles so wie beim hauptwindow
-
nero-ex schrieb:
kannst du mir sagen warum er hier rummeckert? is alles so wie beim hauptwindow
connection refused

kopier die letzten zeilen vom compilier log
-
Kann das Bild nicht öffnen - poste doch bitte direkt den Fehler in Text-Form
-
sry, hats auf meinem notebook und bin dann off

hier jetzt funktionierender link:
-
nero-ex schrieb:
hier jetzt funktionierender link:
von wegen
-
ich gebs ja zu, ich bin irgendwie .... nicht so schlau

hab picture klein geschrieben (reine gewonheitssache )
-
du hast ein komma nach TEXT("ClientWndClass") vergessen. (ich übrigens auch
)
-
super, danke, das klappt schon mal. Wie bekommen ich es jetzt auch mit border und so? hab WS_OVERLAPPEDWINDOW angehängt, aber da konnte es nicht erstellt werden???
-
nero-ex schrieb:
Wie bekommen ich es jetzt auch mit border und so? hab WS_OVERLAPPEDWINDOW angehängt, aber da konnte es nicht erstellt werden???
Rahmen für was - es wäre besser du würdest immer die entsprechenden Textstellen posten und nicht nur einen Screenshot verlinken

-
nero-ex schrieb:
super, danke, das klappt schon mal. Wie bekommen ich es jetzt auch mit border und so? hab WS_OVERLAPPEDWINDOW angehängt, aber da konnte es nicht erstellt werden???
flenders schrieb:
Rahmen für was - es wäre besser du würdest immer die entsprechenden Textstellen posten und nicht nur einen Screenshot verlinken

mein reden

-
Das ist alles sehr komisch. Ich kann das Fenster nicht verschieben, es ist immer in der linken Ecke und der Cursor ändert sich in ein kreuz über dem Fenster.
-
nero-ex schrieb:
Das ist alles sehr komisch. Ich kann das Fenster nicht verschieben, es ist immer in der linken Ecke
also nochmal, probier einfach ein paar styles aus.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/WindowsUserInterface/Windowing/windows/WindowReference/WindowStyles.aspnero-ex schrieb:
der Cursor ändert sich in ein kreuz über dem Fenster.
wincl.hCursor = LoadCursor(NULL, IDC_CROSS);
