本人在XP下写的相同程序不会出现闪烁情况,放在vista下运行时,只要窗口大小改变,就严重闪烁。绘制内容就一个简单的glClear(GL_COLOR_BUFFER_BIT)(视的OnDraw下),使用了双缓冲。本人知道窗口大小改变时激发CView::Onsize()响应,闪烁也和CView::OnEraseBkgnd()有关。似乎vista下还有额外的运行机制会造成闪烁。另外,发现单窗口的程序没有这种闪烁,闪烁只出现在利用CSplitterWnd划分过窗口的程序中,那是不是这个切分窗口类导致的问题。望解!
相关代码如下:int LeftView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1; CClientDC dc(this);
PIXELFORMATDESCRIPTOR pfd;
memset(&pfd,0,sizeof(PIXELFORMATDESCRIPTOR));
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW|
  PFD_SUPPORT_OPENGL|
          PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 24;
pfd.cDepthBits = 32;
int pixelFormat = ChoosePixelFormat(dc.m_hDC,&pfd);
SetPixelFormat(dc.m_hDC,pixelFormat,&pfd);
m_hRC = wglCreateContext(dc.m_hDC);
         
         return 0;
}void LeftView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy); CClientDC dc(this);
CCycloneDoc *pDoc = GetDocument();
wglMakeCurrent(dc.m_hDC,m_hRC);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
double d = 10;
         ratio = 1;
glOrtho(-cx/ratio,cx/ratio,-cy/ratio,cy/ratio,-d,d);
glMatrixMode(GL_MODELVIEW);
glViewport(0,0,cx,cy);
wglMakeCurrent(NULL,NULL);
}
BOOL LeftView::OnEraseBkgnd(CDC* pDC)
{
// return CView::OnEraseBkgnd(pDC);
return true;
}
void RightView::OnDraw(CDC* pDC)
{
wglMakeCurrent(pDC->m_hDC,m_hRC);
glClearColor(1.0,0.0,0.0,1.0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0,0.0,0.0);
glBegin(GL_LINE_STRIP);
glVertex3f(0,0,0);
glVertex3f(1,1,0);
glEnd();
SwapBuffers(pDC->m_hDC);
wglMakeCurrent(NULL,NULL);
}