VC将自定义画图区域保存为BMP文件
2007-08-05 23:56
351 查看
//引用函数部分
CFileDialog dlg(false,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
_T("位图文件(*.bmp)|*.bmp|"),NULL);
if (dlg.DoModal()!= IDOK) return;
CString filename = dlg.GetFileName() + ".bmp";
SaveAsBmp(filename);
//保存图形的函数
void CGraDlg::SaveAsBmp(CString filename)
{
//定义图形大小
int iWidth = 620;
int iHeight = 450;
int iPixel = 16;
//图形格式参数
LPBITMAPINFO lpbmih = new BITMAPINFO;
lpbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpbmih->bmiHeader.biWidth = iWidth;
lpbmih->bmiHeader.biHeight = iHeight;
lpbmih->bmiHeader.biPlanes = 1;
lpbmih->bmiHeader.biBitCount = iPixel;
lpbmih->bmiHeader.biCompression = BI_RGB;
lpbmih->bmiHeader.biSizeImage = 0;
lpbmih->bmiHeader.biXPelsPerMeter = 0;
lpbmih->bmiHeader.biYPelsPerMeter = 0;
lpbmih->bmiHeader.biClrUsed = 0;
lpbmih->bmiHeader.biClrImportant = 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);
//Draw2D();
//保存到文件并创建位图结构
BITMAPFILEHEADER bmfh;
ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER));
*((char *)&bmfh.bfType) = 'B';
*(((char *)&bmfh.bfType) + 1) = 'M';
bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmfh.bfSize = bmfh.bfOffBits + (iWidth * iHeight) * iPixel / 8;
// TCHAR szBMPFileName[128];
int iBMPBytes = iWidth * iHeight * iPixel / 8;
// strcpy(szBMPFileName,filename);
CFile file;
if(file.Open(filename,CFile::modeWrite | CFile::modeCreate))
{
file.Write(&bmfh,sizeof(BITMAPFILEHEADER));
file.Write(&(lpbmih->bmiHeader),sizeof(BITMAPINFOHEADER));
file.Write(pBits,iBMPBytes);
file.Close();
}
pMemDC->DeleteDC();
delete pMemDC; pMemDC = NULL;
delete pBitMap; pBitMap = NULL;
delete lpbmih; lpbmih = NULL;
}
void CGraDlg::DrawCurve(CDC *pDC, CRect rcClient)
{
//页面背景色
CBrush brushCtl;
brushCtl.CreateSolidBrush(RGB(255,255,205));
pDC->Rectangle(rcClient);
pDC->FillRect(rcClient,&brushCtl) ;
brushCtl.DeleteObject();
CPen cpen,*pPen;
cpen.CreatePen(PS_SOLID,2,RGB(0,0,255));
pPen=pDC->SelectObject(&cpen);
const int nOrgX=50;//原点
const int nOrgY=380;
const int nWidth=500;//坐标轴
const int nHeight=320;
int nPI=60;
//指定原点
pDC->SetViewportOrg(nOrgX,nOrgY);
pDC->SetTextColor(RGB(255,0,0));
//画原点处的突出部分
pDC->MoveTo(-8,0);
pDC->LineTo(0,0);
pDC->MoveTo(0,8);
pDC->LineTo(0,0);
//绘制横坐标
int n=0,nTmp=0;
CString sPIText[30];
CString cTmp;
for(int i=0;i<30;i++)
{
cTmp.Format(_T("%d"),i);
sPIText[i] = cTmp;
}
while(true)
{
pDC->LineTo(nPI*n,0);//画每一段
if(n)
pDC->LineTo(nPI*n,-5);//画刻度
pDC->MoveTo(nPI*n,0);
pDC->SetBkMode(TRANSPARENT);
pDC->TextOut(nPI*n-sPIText
.GetLength()*3,10,sPIText
);
n++;
nTmp=nTmp+nPI;
if(nTmp>=nWidth)
{
pDC->LineTo(nPI*n,0);
break;
}
}
//画箭头
pDC->LineTo(nPI*n-5,5);//画每一段
pDC->MoveTo(nPI*n,0);
pDC->LineTo(nPI*n-5,-5);//画每一段
for(int i=0;i<30;i++)
{
cTmp.Format(_T("%d"),i*2);
sPIText[i] = cTmp;
}
pDC->MoveTo(0,0);
n=0;
int k=0;
nPI=50;
//绘制纵坐标
while(true)
{
pDC->LineTo(0,nPI*n);
pDC->LineTo(5,nPI*n);
pDC->MoveTo(0,nPI*n);
pDC->SetBkMode(TRANSPARENT);
pDC->TextOut(-20,nPI*n-sPIText[k].GetLength()*3,sPIText[k]);
k++;
n--;
if(-nPI*n>nHeight)
{
pDC->LineTo(0,nPI*n);
break;
}
}
//画箭头
pDC->LineTo(5,nPI*n+5);//画每一段
pDC->MoveTo(0,nPI*n);
pDC->LineTo(-5,nPI*n+5);//画每一段
//画出图形
double rate,p;
for(p=min_p;p<max_p*60;p=p+1)
{
rate=0.8*pow(p,0.8);
pDC->MoveTo(int(p),-rate);
pDC->LineTo(int(p),-rate+1);
}
cpen.DeleteObject();
}
//绘制图形的函数
void CGraDlg::DrawCurve(CDC *pDC, CRect rcClient)
{
//页面背景色
CBrush brushCtl;
brushCtl.CreateSolidBrush(RGB(255,255,205));
pDC->Rectangle(rcClient);
pDC->FillRect(rcClient,&brushCtl) ;
brushCtl.DeleteObject();
CPen cpen,*pPen;
cpen.CreatePen(PS_SOLID,2,RGB(0,0,255));
pPen=pDC->SelectObject(&cpen);
const int nOrgX=50;//原点
const int nOrgY=380;
const int nWidth=500;//坐标轴
const int nHeight=320;
int nPI=60;
//指定原点
pDC->SetViewportOrg(nOrgX,nOrgY);
pDC->SetTextColor(RGB(255,0,0));
//画原点处的突出部分
pDC->MoveTo(-8,0);
pDC->LineTo(0,0);
pDC->MoveTo(0,8);
pDC->LineTo(0,0);
//绘制横坐标
int n=0,nTmp=0;
CString sPIText[30];
CString cTmp;
for(int i=0;i<30;i++)
{
cTmp.Format(_T("%d"),i);
sPIText[i] = cTmp;
}
while(true)
{
pDC->LineTo(nPI*n,0);//画每一段
if(n)
pDC->LineTo(nPI*n,-5);//画刻度
pDC->MoveTo(nPI*n,0);
pDC->SetBkMode(TRANSPARENT);
pDC->TextOut(nPI*n-sPIText
.GetLength()*3,10,sPIText
);
n++;
nTmp=nTmp+nPI;
if(nTmp>=nWidth)
{
pDC->LineTo(nPI*n,0);
break;
}
}
//画箭头
pDC->LineTo(nPI*n-5,5);//画每一段
pDC->MoveTo(nPI*n,0);
pDC->LineTo(nPI*n-5,-5);//画每一段
for(int i=0;i<30;i++)
{
cTmp.Format(_T("%d"),i*2);
sPIText[i] = cTmp;
}
pDC->MoveTo(0,0);
n=0;
int k=0;
nPI=50;
//绘制纵坐标
while(true)
{
pDC->LineTo(0,nPI*n);
pDC->LineTo(5,nPI*n);
pDC->MoveTo(0,nPI*n);
pDC->SetBkMode(TRANSPARENT);
pDC->TextOut(-20,nPI*n-sPIText[k].GetLength()*3,sPIText[k]);
k++;
n--;
if(-nPI*n>nHeight)
{
pDC->LineTo(0,nPI*n);
break;
}
}
//画箭头
pDC->LineTo(5,nPI*n+5);//画每一段
pDC->MoveTo(0,nPI*n);
pDC->LineTo(-5,nPI*n+5);//画每一段
//画出图形
double rate,p;
for(p=min_p;p<max_p*60;p=p+1)
{
rate=0.8*pow(p,0.8);
pDC->MoveTo(int(p),-rate);
pDC->LineTo(int(p),-rate+1);
}
cpen.DeleteObject();
}
CFileDialog dlg(false,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
_T("位图文件(*.bmp)|*.bmp|"),NULL);
if (dlg.DoModal()!= IDOK) return;
CString filename = dlg.GetFileName() + ".bmp";
SaveAsBmp(filename);
//保存图形的函数
void CGraDlg::SaveAsBmp(CString filename)
{
//定义图形大小
int iWidth = 620;
int iHeight = 450;
int iPixel = 16;
//图形格式参数
LPBITMAPINFO lpbmih = new BITMAPINFO;
lpbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpbmih->bmiHeader.biWidth = iWidth;
lpbmih->bmiHeader.biHeight = iHeight;
lpbmih->bmiHeader.biPlanes = 1;
lpbmih->bmiHeader.biBitCount = iPixel;
lpbmih->bmiHeader.biCompression = BI_RGB;
lpbmih->bmiHeader.biSizeImage = 0;
lpbmih->bmiHeader.biXPelsPerMeter = 0;
lpbmih->bmiHeader.biYPelsPerMeter = 0;
lpbmih->bmiHeader.biClrUsed = 0;
lpbmih->bmiHeader.biClrImportant = 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);
//Draw2D();
//保存到文件并创建位图结构
BITMAPFILEHEADER bmfh;
ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER));
*((char *)&bmfh.bfType) = 'B';
*(((char *)&bmfh.bfType) + 1) = 'M';
bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmfh.bfSize = bmfh.bfOffBits + (iWidth * iHeight) * iPixel / 8;
// TCHAR szBMPFileName[128];
int iBMPBytes = iWidth * iHeight * iPixel / 8;
// strcpy(szBMPFileName,filename);
CFile file;
if(file.Open(filename,CFile::modeWrite | CFile::modeCreate))
{
file.Write(&bmfh,sizeof(BITMAPFILEHEADER));
file.Write(&(lpbmih->bmiHeader),sizeof(BITMAPINFOHEADER));
file.Write(pBits,iBMPBytes);
file.Close();
}
pMemDC->DeleteDC();
delete pMemDC; pMemDC = NULL;
delete pBitMap; pBitMap = NULL;
delete lpbmih; lpbmih = NULL;
}
void CGraDlg::DrawCurve(CDC *pDC, CRect rcClient)
{
//页面背景色
CBrush brushCtl;
brushCtl.CreateSolidBrush(RGB(255,255,205));
pDC->Rectangle(rcClient);
pDC->FillRect(rcClient,&brushCtl) ;
brushCtl.DeleteObject();
CPen cpen,*pPen;
cpen.CreatePen(PS_SOLID,2,RGB(0,0,255));
pPen=pDC->SelectObject(&cpen);
const int nOrgX=50;//原点
const int nOrgY=380;
const int nWidth=500;//坐标轴
const int nHeight=320;
int nPI=60;
//指定原点
pDC->SetViewportOrg(nOrgX,nOrgY);
pDC->SetTextColor(RGB(255,0,0));
//画原点处的突出部分
pDC->MoveTo(-8,0);
pDC->LineTo(0,0);
pDC->MoveTo(0,8);
pDC->LineTo(0,0);
//绘制横坐标
int n=0,nTmp=0;
CString sPIText[30];
CString cTmp;
for(int i=0;i<30;i++)
{
cTmp.Format(_T("%d"),i);
sPIText[i] = cTmp;
}
while(true)
{
pDC->LineTo(nPI*n,0);//画每一段
if(n)
pDC->LineTo(nPI*n,-5);//画刻度
pDC->MoveTo(nPI*n,0);
pDC->SetBkMode(TRANSPARENT);
pDC->TextOut(nPI*n-sPIText
.GetLength()*3,10,sPIText
);
n++;
nTmp=nTmp+nPI;
if(nTmp>=nWidth)
{
pDC->LineTo(nPI*n,0);
break;
}
}
//画箭头
pDC->LineTo(nPI*n-5,5);//画每一段
pDC->MoveTo(nPI*n,0);
pDC->LineTo(nPI*n-5,-5);//画每一段
for(int i=0;i<30;i++)
{
cTmp.Format(_T("%d"),i*2);
sPIText[i] = cTmp;
}
pDC->MoveTo(0,0);
n=0;
int k=0;
nPI=50;
//绘制纵坐标
while(true)
{
pDC->LineTo(0,nPI*n);
pDC->LineTo(5,nPI*n);
pDC->MoveTo(0,nPI*n);
pDC->SetBkMode(TRANSPARENT);
pDC->TextOut(-20,nPI*n-sPIText[k].GetLength()*3,sPIText[k]);
k++;
n--;
if(-nPI*n>nHeight)
{
pDC->LineTo(0,nPI*n);
break;
}
}
//画箭头
pDC->LineTo(5,nPI*n+5);//画每一段
pDC->MoveTo(0,nPI*n);
pDC->LineTo(-5,nPI*n+5);//画每一段
//画出图形
double rate,p;
for(p=min_p;p<max_p*60;p=p+1)
{
rate=0.8*pow(p,0.8);
pDC->MoveTo(int(p),-rate);
pDC->LineTo(int(p),-rate+1);
}
cpen.DeleteObject();
}
//绘制图形的函数
void CGraDlg::DrawCurve(CDC *pDC, CRect rcClient)
{
//页面背景色
CBrush brushCtl;
brushCtl.CreateSolidBrush(RGB(255,255,205));
pDC->Rectangle(rcClient);
pDC->FillRect(rcClient,&brushCtl) ;
brushCtl.DeleteObject();
CPen cpen,*pPen;
cpen.CreatePen(PS_SOLID,2,RGB(0,0,255));
pPen=pDC->SelectObject(&cpen);
const int nOrgX=50;//原点
const int nOrgY=380;
const int nWidth=500;//坐标轴
const int nHeight=320;
int nPI=60;
//指定原点
pDC->SetViewportOrg(nOrgX,nOrgY);
pDC->SetTextColor(RGB(255,0,0));
//画原点处的突出部分
pDC->MoveTo(-8,0);
pDC->LineTo(0,0);
pDC->MoveTo(0,8);
pDC->LineTo(0,0);
//绘制横坐标
int n=0,nTmp=0;
CString sPIText[30];
CString cTmp;
for(int i=0;i<30;i++)
{
cTmp.Format(_T("%d"),i);
sPIText[i] = cTmp;
}
while(true)
{
pDC->LineTo(nPI*n,0);//画每一段
if(n)
pDC->LineTo(nPI*n,-5);//画刻度
pDC->MoveTo(nPI*n,0);
pDC->SetBkMode(TRANSPARENT);
pDC->TextOut(nPI*n-sPIText
.GetLength()*3,10,sPIText
);
n++;
nTmp=nTmp+nPI;
if(nTmp>=nWidth)
{
pDC->LineTo(nPI*n,0);
break;
}
}
//画箭头
pDC->LineTo(nPI*n-5,5);//画每一段
pDC->MoveTo(nPI*n,0);
pDC->LineTo(nPI*n-5,-5);//画每一段
for(int i=0;i<30;i++)
{
cTmp.Format(_T("%d"),i*2);
sPIText[i] = cTmp;
}
pDC->MoveTo(0,0);
n=0;
int k=0;
nPI=50;
//绘制纵坐标
while(true)
{
pDC->LineTo(0,nPI*n);
pDC->LineTo(5,nPI*n);
pDC->MoveTo(0,nPI*n);
pDC->SetBkMode(TRANSPARENT);
pDC->TextOut(-20,nPI*n-sPIText[k].GetLength()*3,sPIText[k]);
k++;
n--;
if(-nPI*n>nHeight)
{
pDC->LineTo(0,nPI*n);
break;
}
}
//画箭头
pDC->LineTo(5,nPI*n+5);//画每一段
pDC->MoveTo(0,nPI*n);
pDC->LineTo(-5,nPI*n+5);//画每一段
//画出图形
double rate,p;
for(p=min_p;p<max_p*60;p=p+1)
{
rate=0.8*pow(p,0.8);
pDC->MoveTo(int(p),-rate);
pDC->LineTo(int(p),-rate+1);
}
cpen.DeleteObject();
}
相关文章推荐
- CBitmap保存为Bmp文件 VC++ MFC实现
- GDI/GDI+(2): VC中,保存HBITMAP到bmp文件方法
- 一个截屏程序,最后以BMP文件的形式保存,VC代码
- VC抓屏并保存成BMP文件
- 截取屏幕指定区域保存为BMP文件
- 截取屏幕指定区域保存为BMP文件
- VC屏幕截图并保存为bmp文件
- VC屏幕截图并保存为bmp、jpg、png等格式文件
- VC屏幕截图并保存为bmp文件
- 【推荐】免费好用的拷屏工具、截图工具,支持热键、可选区域、可保存为jpg,bmp文件,可复制到剪贴板
- VC屏幕截图,保存为Bmp文件
- VC保存和显示数据库图像(BMP)
- 【VC应用】BMP文件读写
- VC菜单命令详解(文件打开、保存与关闭)
- 【框架-MFC】保存HBITMAP对象到*.bmp文件
- VC++中打开文件对话框和保存文件对话框
- C#后台画图保存为ipg/png的文件
- vc++如何将客户区存为bmp和VC实现自绘图形输出到bmp文件
- 读取bmp文件然后在重新保存为一新的bmp文件
- 自定义文件读写(打开、保存)对话框样式