Problem bei OpenGL-Fenster Klasse



  • Hi,

    ich habe gerade ein Problem mit einer Klasse, die ein OpenGl-Fenster(abgeleitet von CWnd) darstellen soll.
    Diese Klasse wird in einem MFC-Programm benutzt um mehrere dieser Fenster darzustellen, u.a. wird auch ein weiterer Dialog geöffnet in dem auch die OpenGl-Klasse benutzt wird.
    Ich habe bisher einen Teil des OpenGl-Fensters in eine Diplayliste compiliert und dann bei Bedarf dargestellt. Da es nun aber Probleme mit dieser Liste gibt, wollte ich diese wieder abschaffen und die GL-Befehle direkt aufrufen. Leider friert seitdem das Programm ein sobald ich den zweiten Dialog mit der OpenGl-Klasse öffne(sowohl Modal als auch nicht Modal). sobald ich die Wegnahme der Displayliste wieder Rückgängig mache funktioniert wieder alles einwandfrei.

    Ich wäre für eine Erklärung dieser Begebenheit und die Korrektur meines Fehlers sehr dankbar. Brauche es dringend für meine Diplomarbeit.

    Hier nun erstmal die Klassendeklaration:

    class COglDiag : public CWnd
    {
    public:
    	COglDiag(bool rt);
    	void ClearDiag();
    	void Set_Start(bool single);
    	void Set_Time(double t);
    	void NewPoint(double value);
    	void SetTimeScale(double t);
    	void SetValueScale(double maxmin);
    	void mark_point(double time, double value);
    
    // Attribute
    public:
    
    // Operationen
    public:
    
    // Überschreibungen
    	// Vom Klassen-Assistenten generierte virtuelle Funktionsüberschreibungen
    	//{{AFX_VIRTUAL(COglDiag)
    	//}}AFX_VIRTUAL
    
    // Implementierung
    public:
    	virtual ~COglDiag();
    
    	// Generierte Nachrichtenzuordnungsfunktionen
    protected:
    	//{{AFX_MSG(COglDiag)
    	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    	afx_msg void OnPaint();
    	afx_msg void OnDestroy();
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    
    	HDC hdc;
    	HGLRC hglrc;
    	OglDiagFeat* p_prop;
    	bool start_diag, realtime;
    	void DrawAxes();
    	double last_value, nrt_last_time, nrt_akt_time, nrt_diag_start_time;
    
    	double transformt(double t);
    	double transformv(double v);
    	double GetEqualScale(double n);
    
    	double max_value, min_value;
    	CString time_name, time_unit, value_name, value_unit;
    
    #if 1
    	enum GLDisplayListNames
    	{
    		coord=1			
    	};
    #endif	
    };
    

    nun die entsprechende Prozedur in der die Diplaylist erzeugt bzw. aufgerufen wird:

    void COglDiag::DrawAxes()
    {
    	start_diag=true;
    
    #if 1
    	if (p_prop->scale_modified)
    	{
    		p_prop->scale_modified=false;
    
    		glDeleteLists(coord, 1);
    
    		glNewList(coord, GL_COMPILE_AND_EXECUTE);
    #endif
    			glColor3f(0.0, 0.0, 0.0);
    			glClear(GL_COLOR_BUFFER_BIT  | GL_DEPTH_BUFFER_BIT);
    
    			glLineWidth(2.0);
    			glBegin(GL_LINES);
    				glVertex2d(xt0, yv0-yv_max-0.05);
    				glVertex2d(xt0, yv0+yv_max+0.15);
    			glEnd();
    			glBegin(GL_TRIANGLES);
    				glVertex2d(xt0, yv0+yv_max+0.25);
    				glVertex2d(xt0-0.03, yv0+yv_max+0.05);
    				glVertex2d(xt0+0.03, yv0+yv_max+0.05);
    			glEnd();
    			glBegin(GL_LINES);
    				glVertex2d(xt0, yv0);
    				glVertex2d(xt_max+0.05, yv0);
    			glEnd();
    			glBegin(GL_TRIANGLES);
    				glVertex2d(xt_max+0.2, yv0);
    				glVertex2d(xt_max+0.05, yv0+0.05);
    				glVertex2d(xt_max+0.05, yv0-0.05);
    			glEnd();
    			glLineWidth(1.0);
    			for (int zz=1; zz<=10; zz++)
    			{
    				glBegin(GL_LINES);
    					glVertex2d(xt0+(double)zz/10*(xt_max-xt0), yv0);
    					double d;
    					if (zz % 2==0) d=yv0-0.1;
    					else d=yv0-0.05;
    					glVertex2d(xt0+(double)zz/10*(xt_max-xt0), d);
    				glEnd();
    			}
    			for (zz=0; zz<=8; zz++)
    			{
    				glBegin(GL_LINES);
    					glVertex2d(xt0, transformv((double)(-4+zz)/8*(max_value-min_value)));
    					double d;
    					if (zz % 2==0) d=xt0-0.05;
    					else d=xt0-0.025;
    					glVertex2d(d, transformv((double)(-4+zz)/8*(max_value-min_value)));
    				glEnd();
    			}
    #if 1
    		glEndList();
    
    	}
    	else glCallList(coord);
    #endif
    	p_prop->time_reset=false;
    }
    

    Diese Funktion wird natürlich nicht direkt aufgerufen. In den aufrufenden Funktionen gibt es dann auch wglMakeCurrent(hdc, hglrc) bzw. (NULL, NULL), Swapbuffers etc.
    Meiner Meinung nach sollte das Programm genau wie vorher funktionieren wenn die in den #if-Anweisungen stehenden Programmteile wegfallen.
    Leider ist dem wie gesagt nicht so.
    Hier noch die OnCreate Programmzeilen:

    int COglDiag::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
       if (CWnd::OnCreate(lpCreateStruct) == -1)
    		return -1;
    
       MySetPixelFormat(::GetDC(m_hWnd));
       hdc = ::GetDC(m_hWnd);
       hglrc = wglCreateContext(hdc);
       wglMakeCurrent(hdc, hglrc);
    
       glClearColor(1.0, 1.0, 1.0, 0);
       glColor3f(0.0, 0.0, 0.0);
    
       glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
       glClear(GL_COLOR_BUFFER_BIT);
       wglMakeCurrent(NULL, NULL) ; 
    
       return 0;
    }
    

    Vielen Dank schonmal im voraus.

    Gruß

    Sebastian



  • Ok, hab es selbst gelöst.


Anmelden zum Antworten