大家好,
本人项目中采用VS2013+OpenGL绘图并对图形进行拷贝,先前一直在win7 32位机器上编写程序,前段时间将编写好的程序拷贝至win10 64位机器上,发现图形能够正常显示,但拷贝功能出现了问题,几经调试也无法解决。下面是以一个简单的测试程序描述该问题。
测试程序为一个基于对话框的工程,在主对话框中有一个自定义控件用于绘图,该控件旁边有一个按钮控件Copy,其响应函数OnBnClickedButtonCopy()中对自定义控件中的图形做拷贝。自定义控件CGraphCtrl中的OnPaint函数如下:
void CGraphCtrl::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
//MFC绘图
CRect rc;
GetClientRect(&rc);
dc.MoveTo(0, 0);
dc.LineTo(rc.right, rc.bottom);
dc.MoveTo(rc.right, 0);
dc.LineTo(0, rc.bottom);
//OpenGL绘图
wglMakeCurrent(m_hDC, m_hRC);
DrawGraph();
SwapBuffers(m_hDC);
wglMakeCurrent(m_hDC, NULL);
}
主对话框按钮控件Copy的响应函数如下:
void CUsingGlut32Dlg::OnBnClickedButtonCopy()
{
//m_GraphCtrl.WriteBmpToFile(hBitmap, _T("WriteBmpToFile.bmp"));
HBITMAP hBitmap = m_GraphCtrl.GetBmpHandle();
m_GraphCtrl.CopyBmpToClipBoard(hBitmap);
}
下面图形分别为程序在win7 32位机器上的运行效果和点击按钮Copy后剪贴板中的内容:
运行效果和拷贝都与期望相同。
下面为该程序在win10 64位机器上的运行效果和点击按钮Copy后剪贴板中的内容:
运行效果相同,但拷贝似乎只针对MFC绘图部分,而没有拷贝OpenGL所绘制的内容。
下面将程序中MFC绘图部分和OpenGL绘图部分的代码顺序做了交换,如下所示:
void CGraphCtrl::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
//OpenGL绘图
wglMakeCurrent(m_hDC, m_hRC);
DrawGraph();
SwapBuffers(m_hDC);
wglMakeCurrent(m_hDC, NULL);
//MFC绘图
CRect rc;
GetClientRect(&rc);
dc.MoveTo(0, 0);
dc.LineTo(rc.right, rc.bottom);
dc.MoveTo(rc.right, 0);
dc.LineTo(0, rc.bottom);
}
这次,程序在win7 32位机器上的运行效果和点击按钮Copy后剪贴板中的内容如下:
运行效果和拷贝也都与期望相同。
下面为该程序在win10 64位机器上的运行效果和点击按钮Copy后剪贴板中的内容:
运行效果没有显示OpenGL的内容,而且拷贝也是只针对MFC绘图部分,没有拷贝OpenGL所绘制的内容。
上述问题很让人难以理解,DC所绘内容在哪儿?RC所绘内容与DC不在同一个缓存里?显示的是后半段缓存里的内容,拷贝的是前半段缓存里的内容?OpenGL绘图结束后,调用SwapBuffers函数后,前后台缓存应该做了交换啊!难道是内存错位问题?OpenGL不兼容64位?希望那位老师或大侠能给出解释和解决方案。非常感谢!