千纸鹤的天 2015-04-15 12:11 采纳率: 100%
浏览 1915
已采纳

从内存DC中获取截取桌的面图像用于纹理贴图时,获取的内容一直是空的怎么回事

我的程序是这样的,获取桌面图像,传到内存DC,在内存DC中取出图像,生成纹理(或其他处理操作,比如融合),进行纹理贴图。
我开始的时候写了两个小程序,一个是获取桌面图像并显示,已经成功;一个是从桌面的绝对路径载入一幅位图,并用于纹理贴图,也成功了。
现在想把两个程序合起来,不用从硬盘读取的位图贴图,改用从DC获取的位图贴图。但是程序运行效果就是贴出的图灰蒙蒙的白色。经过我自己的实验,发现如果放位图的指针地址里没有东西的话,就会出现这种效果。
说明我根本没从内存DC中将位图取出来,大神们快看看,这个改怎么解决,已经三天了,实在没招了。

    glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT );
    GLfloat ctrlpoints[4][4][3] = {
        {{-2.5,-3, 0.0},{-2,-1.5,0.0},
        {2,-1.5,0.0},{2.5,-3,0.0}},
        {{-3,-1.5,0.0},{-2,-0.3,0.0},
        {2,-0.3,0.0},{3,-1.5,0.0}},
        {{-3.5,0.0,0.0},{-2,0.9,0.0},

        {2,0.9,0.0},{3.5,0.0,0.0}},
        {{-4,1.5,0.0},{-2,2.1,0.0},
        {2,2.1,0.0},{4,1.5,0.0}}
    };
    GLfloat texpts[2][2][2] = {{{0.0, 0.0}, {1.0, 0.0}}, 
    {{0.0, 1.0}, {1.0, 1.0}}};
    glMap2f(GL_MAP2_VERTEX_3,0,1,3,4,0,1,12,4,&ctrlpoints[0][0][0]);
    glMap2f(GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 
        0, 1, 4, 2, &texpts[0][0][0]);
    glEnable(GL_MAP2_TEXTURE_COORD_2);
    glEnable(GL_MAP2_VERTEX_3);
    glMapGrid2f(20,0.0,1.0,20,0.0,1.0);
    glColor3f (0.0f, 0.0f, 0.0f);  
    //makeImage();
    RECT rcView;
    GetClientRect(&rcView);
    CDC *deskDC = CDC::FromHandle(::GetDC(NULL));//获取当前DC
    CDC memDC;
    memDC.CreateCompatibleDC(deskDC);//创建兼容DC
    CBitmap pDeskBmp ;
    CBitmap *pOldBmp;
    UINT uDeskBmpWidth = ::GetSystemMetrics(SM_CXSCREEN);//屏幕宽度
    UINT uDeskBmpHeight = ::GetSystemMetrics(SM_CYSCREEN);//屏幕高度
    pDeskBmp.CreateCompatibleBitmap(deskDC, uDeskBmpWidth, uDeskBmpHeight);//创建兼容位图
    pOldBmp = memDC.SelectObject(&pDeskBmp);//将兼容位图选入创建的DC中
    memDC.BitBlt(0, 0, uDeskBmpWidth, uDeskBmpHeight, deskDC, 0, 0, SRCCOPY);//将屏幕图像复制到内存DC中
    BITMAP bmp;
    pDeskBmp.GetBitmap(&bmp);
    bmp.bmBits=(char*)malloc((bmp.bmWidth)*(bmp.bmHeight)*(bmp.bmBitsPixel));

    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    //glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, imageWidth, imageHeight, 0,
    //             GL_BGR_EXT, GL_UNSIGNED_BYTE, data);
    gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, bmp.bmWidth, bmp.bmHeight, 
        GL_BGR_EXT, GL_UNSIGNED_BYTE, bmp.bmBits);//
    glEnable(GL_TEXTURE_2D);
    glEvalMesh2(GL_LINE, 0, 20, 0, 20);
    glFlush();



  • 写回答

1条回答 默认 最新

  • 千纸鹤的天 2015-04-16 07:14
    关注

    问题已经解决,bmp.bmBits=(char*)malloc((bmp.bmWidth)*(bmp.bmHeight)*(bmp.bmBitsPixel));这里虽然开辟了空间,但是里面是空的,
    ////char data = (char)malloc((bmp.bmWidth)*(bmp.bmHeight)*3);
    ////pOldBmp->GetBitmapBits((bmp.bmWidth)*(bmp.bmHeight)*3, data);
    这样开辟空间就能读到位图信息了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败