|
前两篇介绍了CAA实现截图的3种方式和视图内无关内容(结构树)的显示隐藏。此外,有时还需要对罗盘(CATI3DCompass)进行显隐设置,视图背景色(CATViewer:SetBackgroundColor)和模型的显示方式(CATViewer:SetViewMode)进行设置,这两点相信按照文章思路操作过的朋友们很快会找到设置方法,在此就不赘述了。今天想说一下截图之后的可能操作——图片保存和预览。
01 图片保存
图片的保存在截图过程中设置好指定的路径和格式就好。如:保存到C盘CATIA文件夹下,名称为pic.bmp
路径可设置为:
CATUnicodeString TmpFile ="C:\\catia\\pic.bmp";
今天重点补充一下:CATIA Viewer的截图(CaptureToFile)方法中图片保存路径问题:
第一个参数是图片格式,一个枚举类型,可选格式如下:
enum CatCaptureFormat {
catCaptureFormatCGM,
catCaptureFormatEMF,
catCaptureFormatTIFF,
catCaptureFormatTIFFGreyScale,
catCaptureFormatBMP,
catCaptureFormatJPEG
};
第二个参数:为图片路径,CATBSTR类型。
查看帮助文档中这个类:并没有可用方法
可能去除CAT前缀去搜索一下BSTR类型,了解一下它的用法:
如果对Office应用工具引用有印象的人,可能会发现这个类型,且在CAA开发引用VB接口时也会常常遇到,如CATIADrawingTable表格内容填写
关于BSTR的用法可以网上搜索一下进行知识扩展
参考:BSTR详解三 - BSTR使用注意事项
在CATIAViewer方式截图的代码展示中,用于如下方式进行转换
const CATBSTR bstrText=::SysAllocString(TmpFile);
pViewerVB->CaptureToFile(catCaptureFormatBMP,bstrText);
此外:CATUnicodeString自带与CATBSTR之间的转化:
o BuildFromBSTR public int BuildFromBSTR( const CATBSTR& iBSTR) o ConvertToBSTR public void ConvertToBSTR( CATBSTR* oBSTR) const
至此,又多了一种CAA中常用字符串之间的转化了
02 图片预览
图片预览操作时,图片来源可以直接在截图后将图片路径传递给图片预览操作方法,或者将图片保存在本地后进行读取筛选后进行预览,具体情况根据功能开发需要而定。图片预览方法可以调用本地的看图工具rundll32.exe。
当然,开发者也可以通过引用带预览功能的截图工具,集中处理截图操作和图片预览问题,如下图工具使用效果:(仅限手动截图)
BOOL AllenFunction::ScreenShot(const CString &strPicFile ,int ixStart,int iyStart,int Ix,int Iy)
{
CWnd *pDesktop = CWnd::GetDesktopWindow();
CDC *pdeskdc = pDesktop->GetDC();
CRect re;
//获取窗口的大小
pDesktop->GetClientRect(&re);
//屏幕长宽
// 显示器屏幕的宽和高
int ScreenWidth = re.Width();
int ScreenHeight =re.Height();
int X,Y;//计算截图区域宽高
if (ScreenWidth<=Ix)
{
X = ScreenWidth;
}else X = Ix;
if (ScreenHeight<=Iy)
{
Y=ScreenHeight;
}else Y=Iy;
1CBitmap bmp;
2bmp.CreateCompatibleBitmap(pdeskdc,X, Y);
3CDC memorydc; //创建一个兼容的内存画板
4memorydc.CreateCompatibleDC(pdeskdc);
5CBitmap *pold = memorydc.SelectObject(&bmp); //选中画笔
6memorydc.BitBlt(0, 0, X,Y, pdeskdc,ixStart, iyStart, SRCCOPY); //绘制图像
7memorydc.SelectObject(pold); //选中原来的画笔
8BITMAP bit;
9bmp.GetBitmap(&bit);
10DWORD size = bit.bmWidthBytes * bit.bmHeight; //定义 图像大小(单位:byte)
11LPSTR lpdata = (LPSTR)GlobalAlloc(GPTR, size);
12//后面是创建一个bmp文件的必须文件头
13BITMAPINFOHEADER pbitinfo;
14pbitinfo.biBitCount = 24;
15pbitinfo.biClrImportant = 0;
16pbitinfo.biCompression = BI_RGB;
17pbitinfo.biHeight = bit.bmHeight;
18pbitinfo.biPlanes = 1;
19pbitinfo.biSize = sizeof(BITMAPINFOHEADER);
20pbitinfo.biSizeImage = size;
21pbitinfo.biWidth = bit.bmWidth;
22pbitinfo.biXPelsPerMeter = 0;
23pbitinfo.biYPelsPerMeter = 0;
24GetDIBits(pdeskdc->m_hDC, bmp, 0, pbitinfo.biHeight, lpdata, (BITMAPINFO*)
25 &pbitinfo, DIB_RGB_COLORS);
26BITMAPFILEHEADER bfh;
27bfh.bfReserved1 = bfh.bfReserved2 = 0;
28bfh.bfType = ((WORD)('M' << 8) | 'B');
29bfh.bfSize = size + 54;
30bfh.bfOffBits = 54;
31//写入文件
32CFile file;
33if (file.Open((LPCTSTR)strPicFile, CFile::modeCreate | CFile::modeWrite))
34{
35 file.Write(&bfh, sizeof(BITMAPFILEHEADER));
36 file.Write(&pbitinfo, sizeof(BITMAPINFOHEADER));
37 file.Write(lpdata, size);
38 file.Close();
39}
40GlobalFree(lpdata);
41return TRUE;
}
大家在使用手动截图操作程序时可以去找个分享的截图工具代码根据自己需要修改下, 封装成自己的截图操作即可。
03 开发实践
以上基本可以解决在程序开发中单次截图、预览的完整功能了。但是,也有需要批量截图的需要,比如程序自动截取当前窗口中不同姿态的模型展示图,该如何实现呢?
留个疑问给大家,期待大家实践后的分享讨论。(提示:1.正确设置模型姿态,2.如何检测姿态调整到位后开始截图)。具体功能可参考我的这个小视频:
|
|