Opengl erstellen mehrer Fenster



  • Hi@all

    Ich will in einen Programm beliebig viele Fenster initalisieren
    Für jedes Fenster erzeuge ich mit Createthread einen neuen Thread
    Dieser ruft eine funktion:

    DWORD WINAPI CAVLTree_OpenGl::make_winapp(LPVOID dummy) {
    	HINSTANCE hi = 0;
    	char string[] = "Avl Tree OpenGl Ausgabe";
    
    	/* started WinApplikation */
    	//MEMORY_BASIC_INFORMATION mbi;
    	//CAVLTree_OpenGl * pthis = ((CAVLTree_OpenGl*)dummy);
    	//VirtualQuery( (PVOID)(make_winapp),&mbi,sizeof(mbi));
    	//hi = (HINSTANCE)mbi.AllocationBase;
    	pthis->WinMain(hi, main_HInc, string, SW_MAXIMIZE);
    	CloseHandle(pthis->m_hnd);
    	pthis->m_hnd = NULL;
    
    	return 0;
    }
    WPARAM WINAPI CAVLTree_OpenGl::WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd){
    	WNDCLASSEX windowClass;  // Variable meiner Wnd Klasse
    	MSG		msg;			 // message
    	bool done = false;		 // flag fr message loop(wenn app fertig(WM_QUIT)
    
    //	MEMORY_BASIC_INFORMATION mbi;
    //	VirtualQuery(this->WinMain,&mbi,sizeof(mbi));
    //	hInstance = (HINSTANCE)mbi.AllocationBase;
    
    	/* ATTRIBUTE DER windowClass */
    	windowClass.cbSize = sizeof(WNDCLASSEX);		// gr�se der WND struktur
    	windowClass.style = CS_VREDRAW | CS_HREDRAW;	// Neuzeichnen
    	windowClass.lpfnWndProc = (WNDPROC)WndProc;		// Funktions Zeiger definieren
    	windowClass.cbClsExtra = 0;						// keine Extra Bytes
    	windowClass.cbWndExtra = 0; 
    	windowClass.hInstance = hInstance;				// hInstance dieser Applikation denken!!!!!!
    	windowClass.hIcon = LoadIcon(0, IDI_APPLICATION);// standard icon
    	windowClass.hCursor = LoadCursor(0, IDC_ARROW); // standard WND Cursor laden
    	windowClass.hbrBackground = 0;					// kein Hintergrund brush	
    	windowClass.lpszMenuName = 0;					// kein Men
    	windowClass.lpszClassName = "Meine Klasse!";	// Name der WND Klasse
    	windowClass.hIconSm = LoadIcon(0, IDI_WINLOGO);	// kleines icon
    
    	// registriere diese Klasse (gib adr. an windows)
    	// ACHTUNG nur fir WNDCLASSEX nicht fr die alte WNDCLASS
    	if (!RegisterClassEx(&windowClass))
    		return 0; 
    
    	/* ERSTELLEN DES FENSTERS */
    	m_hwnd = CreateWindowEx(NULL, 
    		"Meine Klasse!", 
    		"Avl Baum Opengl Ausgabe", 
    		WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_SYSMENU | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
    		100, 100,		// xy Koordinaten
    		400, 400,		// h�e, breite
    		NULL,			// Anhaltspunkt to parent
    		NULL,			// Anhaltspunkt zum menue
    		hInstance,		// applikations instance
    		NULL);			// keine extra parameter
    
    	/* wurde Fenster ohne Probleme erstellt */
    	if (!m_hwnd)
    		return 0;
    
    	done = false;
    
    	/* Message Loop und rendering */
    	while (GetMessage(&msg,m_hwnd,0,0)) {
    
    		TranslateMessage(&msg); // bersetze msg
    		DispatchMessage(&msg);  // msg abfertigen und Windows schicke
    
    		render();
    	}
    
    	return msg.wParam;
    }
    

    if (!RegisterClassEx(&windowClass)) wenn ich ein weiter fenster initalisieren will bekomme ich 0 zurück

    Brauc Ich für jedes fenster einen andere hInstanc und eine ander WndProc ??



  • spjoe schrieb:

    if (!RegisterClassEx(&windowClass)) wenn ich ein weiter fenster initalisieren will bekomme ich 0 zurück

    Brauc Ich für jedes fenster einen andere hInstanc und eine ander WndProc ??

    Nein! Du darfst bei Win32 nur 1x pro Prozess RegisterClassEx(&windowClass) mit dem selben Namen(windowClass.lpszClassName) aufrufen. Da du ja pro Fenster in der Fenster Klasse nichts veränderst, musst du nur RegisterClassEx nur einmal aufrufen und kannst dann so viele Fenster damit erzeugen, wie du willst!!!



  • Vielen dank jetz funzt alles 🙂


Anmelden zum Antworten