用实现将自绘图形输出为文件
在用vc做程序时候,经常需要把输出的文本和图形保存到位图文件,当然可以有现成的控件来实现,但总不能如自己所愿,还是自己动手写吧!如下图:
一、实现方法
要把文本和图形保存到位图文件,只要对掌握位图结构有一定的了解,一切都ok呢。先必须要创建内存设备环境,然后内存设备环境创建的DIB区域,别忘了还要创建个CBitmap对象,CBitmap对象必须和DIB区域关联起来,把CBitmap对象选择到当前设备环境,然后在当前设备环境输出文本和图形就可以了。
二、具体实现代码如下
void CTestSaveBmpView::SaveAsBmp(CString filename)
{
//定义图形大小
int iWidth = 800;
int iHeight = 600;
int iPixel = 16;
//图形格式参数
LPBITMAPINFO lpbmih = new BITMAPINFO;
Size = sizeof(BITMAPINFOHEADER);
Width = iWidth;
Height = iHeight;
Planes = 1;
BitCount = iPixel;
Compression = BI_RGB;
SizeImage = 0;
XPelsPerMeter = 0;
YPelsPerMeter = 0;
ClrUsed = 0;
ClrImportant = 0;
//创建位图数据
HDC hdc,hdcMem;
HBITMAP hBitMap = NULL;
CBitmap *pBitMap = NULL;
CDC *pMemDC = NULL;
BYTE *pBits;
hdc = CreateIC(TEXT(\"DISPLAY\"),NULL,NULL,NULL);
hdcMem = CreateCompatibleDC(hdc);
hBitMap = CreateDIBSection(hdcMem,lpbmih,DIB_PAL_COLORS,(void **)pBits,NULL,0);
pBitMap = new CBitmap;
pBitMap-Attach(hBitMap);
pMemDC = new CDC;
pMemDC-Attach(hdcMem);
pMemDC-SelectObject(pBitMap);
//
CRect rc(0,0,iWidth,iHeight);
pMemDC-SetBkMode(TRANSPARENT);
//添加自绘图形
DrawCurve(pMemDC,rc);
//保存到文件并创建位图结构
BITMAPFILEHEADER bmfh;
ZeroMemory(bmfh,sizeof(BITMAPFILEHEADER));
*((char *)Type) = \'\'B\'\';
*(((char *)Type) + 1) = \'\'M\'\';
OffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
Size = OffBits + (iWidth * iHeight) * iPixel / 8;
TCHAR szBMPFileName[128];
int iBMPBytes = iWidth * iHeight * iPixel / 8;
strcpy(szBMPFileName,filename);
CFile file;
if(en(szBMPFileName,CFile::modeWrite | CFile::modeCreate))
{
ite(bmfh,sizeof(BITMAPFILEHEADER));
ite((lpbmih-bmiHeader),sizeof(BITMAPINFOHEADER));
ite(pBits,iBMPBytes);
招不来SEOer。 ose();
}
pMemDC-DeleteDC();
delete pMemDC; pMemDC = NULL;
delete pBitMap; pBitMap = NULL;
delete lpbmih; lpbmih = NULL;
}
//输出文本和图形
void CTestSaveBmpView::DrawCurve(CDC *pDC, CRect rcClient)
{
//页面背景色
CBrush brushCtl;
eateSolidBrush(RGB(255,255,255));
pDC-Rectangle(rcClient);
pDC-FillRect(rcClient,brushCtl) ;
leteObject();
CPen pen;
eatePen(PS_SOLID, 1, RGB(255,0,0));
CPen *oldPen = pDC-SelectObject(pen);
double xMin = 10.00f, xMax = 100.00f;
double yMin = 10.00f, yMax = 200.00f;
double dbX1 = (xMax- xMin)/100 + xMin;
double dbY1 = 600/dbX1 ;
for (int i=1; i100; i++) //曲线
{
double dbX2 = (xMax- xMin)*i/100 + xMin;
double dbY2 = 600/dbX2 ;
pDC-MoveTo(int(ft+(dbX1 - xMin)*dth()/(xMax- xMin)),
int(ttom-(dbY1- yMin)*ight()/(yMax- yMin)));
pDC-LineTo(int(ft+(dbX2 - xMin)*dth()/(xMax- xMin)),
int(ttom-(dbY2- yMin)*ight()/(yMax- yMin)));
dbX1=dbX2;
dbY1=dbY2;
}
pDC-SelectObject(oldPen);
leteObject();
oldPen = NULL;
}
//保存的实现
void CTestSaveBmpView::OnRButtonDown(UINT nFlags, CPoint point)
{
CFileDialog dlg(false,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, \"位图文件(*.bmp)|*.bmp|\",NULL);
if (Modal()!= IDOK) return;
CString filename = tFileName() + \".bmp\";
SaveAsBmp(filename);
CView::OnRButtonDown(nFlags, point);
}查看本文来源
海口治疗宫颈糜烂医院荆门哪里有白癜风治疗医院
杭州看白癜风专科医院
- 上一篇:用实现对超长数据库字段的操作的
- 下一篇:用实现小型矢量图形系统的开发物业
-
满天星鱼怎么养满天星鱼饲养方法位置
凉菜2022年06月13日
-
溅水鱼好养吗一定要注意为鱼缸加盖子位置
凉菜2022年06月13日
-
深圳海关查获多只活体龟位置
凉菜2022年06月13日
-
清除水族箱中藻类的三大方法位置
凉菜2022年06月13日
-
你需要知道的金毛犬的犬种特征有哪些位置
凉菜2022年06月13日
-
你适合养金毛犬吗位置
凉菜2022年06月13日