flicker in opengl window

Please support our C++ advertiser: Intel Parallel Studio Home
Reply

Join Date: Mar 2008
Posts: 19
Reputation: noraantonia is an unknown quantity at this point 
Solved Threads: 0
noraantonia noraantonia is offline Offline
Newbie Poster

flicker in opengl window

 
0
  #1
Apr 2nd, 2008
Using OpenGL in Visual C++: Part I #1 Jul 14th, 2004

Here is the example i also used to implement an opengl window ready for painting. But the problem is i still have flicker. How can i get rid of it ? pls help me...

here is my code :

// DiplomaView.cpp : implementation of the CDiplomaView class
//

#include "stdafx.h"
#include "Diploma.h"

#include "DiplomaDoc.h"
#include "DiplomaView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDiplomaView

IMPLEMENT_DYNCREATE(CDiplomaView, CView)

BEGIN_MESSAGE_MAP(CDiplomaView, CView)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_SIZE()
ON_WM_PAINT()
ON_WM_MOVE()
ON_WM_SHOWWINDOW()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
//{{AFX_MSG_MAP(CDiplomaView)
ON_COMMAND(ID_CUB, OnCub)
ON_COMMAND(ID_CON, OnCon)
ON_COMMAND(ID_CILINDRU, OnCilindru)
ON_COMMAND(ID_PIRAMIDA, OnPiramida)
ON_COMMAND(ID_SFERA, OnSfera)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDiplomaView construction/destruction

CDiplomaView::CDiplomaView()
{
// TODO: add construction code here
m_hGLContext = NULL;
m_GLPixelIndex = 0;
}

CDiplomaView::~CDiplomaView()
{
}

BOOL CDiplomaView:reCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs

cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN;

return CView:reCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CDiplomaView drawing

void CDiplomaView::OnDraw(CDC* pDC)
{
CDiplomaDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CDiplomaView diagnostics

#ifdef _DEBUG
void CDiplomaView::AssertValid() const
{
CView::AssertValid();
}

void CDiplomaView:ump(CDumpContext& dc) const
{
CView:ump(dc);
}

CDiplomaDoc* CDiplomaView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDiplomaDoc)));
return (CDiplomaDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CDiplomaView message handlers
BOOL CDiplomaView:etWindowPixelFormat(HDC hDC)
{

PIXELFORMATDESCRIPTOR pixelDesc;
pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pixelDesc.nVersion = 1;
pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER |
PFD_STEREO_DONTCARE;
pixelDesc.iPixelType = PFD_TYPE_RGBA;
pixelDesc.cColorBits = 24;
pixelDesc.cRedBits = 0;
pixelDesc.cRedShift = 0;
pixelDesc.cGreenBits = 0;
pixelDesc.cGreenShift = 0;
pixelDesc.cBlueBits = 0;
pixelDesc.cBlueShift = 0;
pixelDesc.cAlphaBits = 0;
pixelDesc.cAlphaShift = 0;
pixelDesc.cAccumBits = 0;
pixelDesc.cAccumRedBits = 0;
pixelDesc.cAccumGreenBits = 0;
pixelDesc.cAccumBlueBits = 0;
pixelDesc.cAccumAlphaBits = 0;
pixelDesc.cDepthBits =32;
pixelDesc.cStencilBits = 0;
pixelDesc.cAuxBuffers = 0;
pixelDesc.iLayerType = PFD_MAIN_PLANE;
pixelDesc.bReserved = 0;
pixelDesc.dwLayerMask = 0;
pixelDesc.dwVisibleMask = 0;
pixelDesc.dwDamageMask = 0;
m_GLPixelIndex = ChoosePixelFormat( hDC, &pixelDesc);
if (m_GLPixelIndex==0) // Let's choose a default index.
{
m_GLPixelIndex = 1;
MessageBox("ChoosePixelFormat failed");
if (DescribePixelFormat(hDC, m_GLPixelIndex,
sizeof(PIXELFORMATDESCRIPTOR), &pixelDesc)==0)
{
return FALSE;
}
}
if (SetPixelFormat( hDC, m_GLPixelIndex, &pixelDesc)==FALSE)
{
return FALSE;
}
return TRUE;
}


BOOL CDiplomaView::CreateViewGLContext(HDC hDC)
{
m_hGLContext = wglCreateContext(hDC);
if (m_hGLContext == NULL)
{
return FALSE;
}
if (wglMakeCurrent(hDC, m_hGLContext)==FALSE)
{
return FALSE;
}
return TRUE;
}



void CDiplomaView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
GLsizei width, height;
GLdouble aspect;
width = cx;
height = cy;
if (cy==0)
aspect = (GLdouble)width;
else
aspect = (GLdouble)width/(GLdouble)height;
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45, aspect, 1, 10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glDrawBuffer(GL_BACK);
glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
desenarecub=false;
desenarecon=false;
desenarecilindru=false;
desenarepiramida=false;
desenaresfera=false;
// TODO: Add your message handler code here
}


int CDiplomaView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

HWND hWnd = GetSafeHwnd();
HDC hDC = ::GetDC(hWnd);
if (SetWindowPixelFormat(hDC)==FALSE)
return 0;
if (CreateViewGLContext(hDC)==FALSE)
return 0;
return 0;
// TODO: Add your specialized creation code here

}


void CDiplomaView::OnDestroy()
{
CView::OnDestroy();
if(wglGetCurrentContext()!=NULL)
{
// make the rendering context not current
wglMakeCurrent(NULL, NULL) ;
}
if (m_hGLContext!=NULL)
{
wglDeleteContext(m_hGLContext);
m_hGLContext = NULL;
}
// Now the associated DC can be released.
CView::OnDestroy();

// TODO: Add your message handler code here

}

void CDiplomaView::OnPaint()
{

CPaintDC dc(this); // device context for painting
CDiplomaDoc* pDoc = GetDocument();

if (desenarecub)
{
pDoc->RenderSceneCub();
}

if (desenarecilindru)
{

pDoc->RenderSceneCilindru(raza1cilindru,raza2cilindru,inaltimecilindru);
}

if (desenarecon)
{
pDoc->RenderSceneCon(razacon,inaltimecon);
}

if (desenarepiramida)
{
pDoc->RenderScenePiramida();
}

if (desenaresfera)
{
pDoc->RenderSceneSfera(razasfera);
}


SwapBuffers(dc.m_ps.hdc);
// Do not call CView::OnPaint() for painting messages
}



void CDiplomaView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_LeftButtonDown = TRUE;
m_LeftDownPos = point;
CView::OnLButtonDown(nFlags, point);
}

void CDiplomaView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_LeftButtonDown = FALSE;
CView::OnLButtonUp(nFlags, point);
}

void CDiplomaView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (m_LeftButtonDown)
{
CDiplomaDoc* pDoc = GetDocument();
CSize rotate = m_LeftDownPos - point;
m_LeftDownPos = point;
pDoc->m_xRotate += rotate.cx/3;
pDoc->m_yRotate += rotate.cy/3;
InvalidateRect(NULL);
}
CView::OnMouseMove(nFlags, point);
}

void CDiplomaView::OnCub()
{
// TODO: Add your command handler code here

// device context for painting

repeta :
if(dlgCub.DoModal()==IDOK)
{
laturacub = (float) dlgCub.m_iLat;
if ((laturacub<=0) || (laturacub>10))
{
MessageBox("Introduceti o valoare intre 0 si 10","Eroare");
goto repeta;
}
desenarecub = true;
OnPaint();
}


}

void CDiplomaView::OnCon()
{
// TODO: Add your command handler code here
// int raza,inaltimea;

repeta :
if(dlgCon.DoModal()==IDOK)
{
razacon = (float) dlgCon.m_iR1;
inaltimecon = (float) dlgCon.m_iH;
if ((razacon<=0) || (razacon>10) || (inaltimecon<=0) || (inaltimecon>10))
{
MessageBox("Introduceti o valoare intre 0 si 10","Eroare");
goto repeta;
}
desenarecon = true;
OnPaint();
}


}

void CDiplomaView::OnCilindru()
{
// TODO: Add your command handler code here

repeta :
if(dlgCilindru.DoModal()==IDOK)
{
raza1cilindru = (float) dlgCilindru.m_iR1;
raza2cilindru = (float) dlgCilindru.m_iR2;
inaltimecilindru = (float) dlgCilindru.m_iH;

if ((raza1cilindru<=0) || (raza1cilindru>10) ||(raza2cilindru<=0) || (raza2cilindru>10))
{
MessageBox("Introduceti o valoare intre 0 si 10","Eroare");
goto repeta;
}
desenarecilindru = true;
OnPaint();
}
}

void CDiplomaView::OnPiramida()
{
// TODO: Add your command handler code here

repeta :
if(dlgPiramida.DoModal()==IDOK)
{
muchiepiramida = (float) dlgPiramida.m_iMuchia;
inaltimepiramida = (float) dlgPiramida.m_iH;

if ((muchiepiramida<=0) || (muchiepiramida>10) ||(inaltimepiramida<=0) || (inaltimepiramida>10))
{
MessageBox("Introduceti o valoare intre 0 si 10","Eroare");
goto repeta;
}
desenarepiramida=true;
OnPaint();
}
}



void CDiplomaView::OnSfera()
{
// TODO: Add your command handler code here

repeta :
if(dlgSfera.DoModal()==IDOK)
{
razasfera = (float) dlgSfera.m_iRaza;
if ((razasfera<=0) || (razasfera>10))
{
MessageBox("Introduceti o valoare intre 0 si 10","Eroare");
goto repeta;
}
desenaresfera=true;
OnPaint();
}

}
of course, in the document part i did all the drawing... why do i have the flicker ?
what can i do ?
Reply With Quote Quick reply to this message  
Reply

This thread is more than three months old.
Perhaps start a new thread instead?
Message:



Other Threads in the C++ Forum
Thread Tools Search this Thread



About Us | Contact Us | Advertise | DaniWeb | Acceptable Use Policy | RSS Feed

©2003 - 2009 DaniWeb® LLC