本人在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);
}
相关代码如下: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);
}
解决方案 »
- 关于VC读取Excel颜色的问题
- 急!VC6.0中右键没有类向导classview
- 请问怎么使用ShellExcute这个函数?它需要包含什么头文件?
- 如何在程序中修改dialog的标题?
- 请问哪里有vc6.0英文版本下载啊???最好是ftp下载地址
- vb.net
- 请问知道一个进程的句柄,怎么知道这个进程的整个路径!
- 我在主对话框上嵌了三个子对话框,想使其中的一个子对话框一开始就处于聚焦状态,请教各位了!!!
- winsock中怎么传音频,视频数据?
- 如何把int型值转化成CString型?
- MFC tab contorl实现类似于excel 的sheet的拖动和双击重命名
- 哪位大侠帮修改下makefile文件,先谢过了
搞的 N卡 A卡 全部重弄驱动 说是 在系统中 加入了一个用于显示 的软件层 只是用户感觉不到 不过我也没用过 问题多的很