问题:如图所示的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);