rocket_liushaodong 2016-05-26 01:37 采纳率: 0%
浏览 1383
已结题

OpenGL绘图在32位和64位机器上的疑惑

大家好,
本人项目中采用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位?希望那位老师或大侠能给出解释和解决方案。非常感谢!

  • 写回答

2条回答

  • 普通网友 2016-10-04 18:36
    关注

    FC绘图
    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();

    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题