MFC 视图-OpenGL场景-CDialogBar三个界面保存为图片

本文介绍了如何将MFC中的OpenGL场景、View视图和CDialogBar内容保存为图片并拼合成一张图。通过使用BitBlt函数及glReadPixels函数分别处理View和OpenGL界面,再通过SnapScreen功能整合所有部分,最终形成完整的图像。
摘要由CSDN通过智能技术生成

这里写图片描述
问题:如图所示的OpenGL场景、View、CDialogBar三个界面的内容保存成图片然后拼合成一张图
思路:
分四步
一、View视图界面保存
利用BitBlt函数将界面拷贝到内存DC中

// 将MFC的某个view保存为图片
BOOL CImageIO::saveAsImage(CString imageFormat, CString savePath)
{
    if (hdc != NULL  && destRect != NULL)
    {
        HDC hmemDC = ::CreateCompatibleDC(hdc);
        hBmp = ::CreateCompatibleBitmap(hdc, destRect.Width(), destRect.Height());
        HANDLE hOld = ::SelectObject(hmemDC, hBmp);
        Graphics graphic(hmemDC);
        SelectObject(hmemDC, hBmp);
        // CDC类的BitBlt就是MFC下专门用来操作位图的,将两张位图分别导入到CBitmap做成内存DC后,一次BitBlt到设备DC上,就完成了图片的叠加,叠加效果,由BitBlt函数的光栅代码参数决定,详细看这个函数的帮助(内容不少),可以熟悉不同的叠加方式
        BitBlt(hmemDC, 0, 0, destRect.right, destRect.bottom, hdc, 0, 0, SRCCOPY);  

        //下面进行各种文字、图形、图片的绘制

        Bitmap bitmap(hBmp, NULL);
        CLSID clsID;
        //保存不同格式的(.jpg,bmp,png)的图片需要不同的CLSID, imageFormat为用户期望保存的图片格式
        if (_T("jpg") == imageFormat.MakeLower())
        {
            GetEncoderClsid(L"image/jpeg", &clsID);
        }
        else if (_T("bmp") == imageFormat.MakeLower())
        {
            GetEncoderClsid(L"image/bmp", &clsID);
        }
        else if (_T("png") == imageFormat.MakeLower())
        {
            GetEncoderClsid(L"image/png", &clsID);
        }

        // char*转WCHAR*
        char *p = (LPSTR)(LPCSTR)savePath;
        wstringstream wss;
        wss << p;

        bitmap.Save(wss.str().c_str(), &clsID, NULL);
        //bitmap.Save(L"D:\\ggg.jpg", &clsID, NULL);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值