用实现将自绘图形输出为文件

凉菜 2021年09月06日

在用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);

}查看本文来源

海口治疗宫颈糜烂医院
荆门哪里有白癜风治疗医院
杭州看白癜风专科医院
友情链接: 最全的凯里美食攻略
3