工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > VC > 正文
用VC实现将自绘图形输出为bmp文件
[文章信息]
作者:江上飞鸟
时间:2005-02-08
出处:VCKBASE
责任编辑:方舟
[文章导读]
在用vc做程序时候,经常需要把输出的文本和图形保存到位图文件
advertisement
热点推荐
· 将Linux代码移植到Windows的简单方法
· 禁用Cookie功能的几种方法
· Imageready制作“摇钱树”小动画
· 谈谈Windows系统垃圾的清除
· PS色彩调整简明教程:替换颜色
[正文]
  本文源代码下载

  在用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;
 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);
 //保存到文件并创建位图结构
 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(szBMPFileName,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 CTestSaveBmpView::DrawCurve(CDC *pDC, CRect rcClient)
{
 //页面背景色
 CBrush brushCtl;
 brushCtl.CreateSolidBrush(RGB(255,255,255));
 pDC->Rectangle(rcClient);
 pDC->FillRect(rcClient,&brushCtl) ;
 brushCtl.DeleteObject();
 
 CPen pen;
 pen.CreatePen(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; i<100; i++) //曲线
 {
  double dbX2 = (xMax- xMin)*i/100 + xMin;
  double dbY2 = 600/dbX2 ;

  pDC->MoveTo(int(rcClient.left+(dbX1 - xMin)*rcClient.Width()/(xMax- xMin)),
  int(rcClient.bottom-(dbY1- yMin)*rcClient.Height()/(yMax- yMin)));
  pDC->LineTo(int(rcClient.left+(dbX2 - xMin)*rcClient.Width()/(xMax- xMin)),
  int(rcClient.bottom-(dbY2- yMin)*rcClient.Height()/(yMax- yMin)));

  dbX1=dbX2;
  dbY1=dbY2;
 }
 pDC->SelectObject(oldPen);
 pen.DeleteObject();
 oldPen = NULL;
}

//保存的实现
void CTestSaveBmpView::OnRButtonDown(UINT nFlags, CPoint point)
{

 CFileDialog dlg(false,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "位图文件(*.bmp)|*.bmp|",NULL);
 if (dlg.DoModal()!= IDOK) return;
 CString filename = dlg.GetFileName() + ".bmp";
 SaveAsBmp(filename);

 CView::OnRButtonDown(nFlags, point);
}

发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • 一步一步学习STL标准模板库
  • Visual C+6.0实现文本串的自由拆分
  • 利用Visual C++开发ASP图像处理组件
  • MFC程序员的WTL指南之工具条与状态条
  • Visual C++初学者指针学习指南
  • 手机游商频频坑人 五百元只买来玩具手机
  • 节后笔记本有望跌破3千 一味低价非取胜之道
  • 外观识别技术发展迅速 手机可识别你的脸
  • 北京联通后付费手机春节期间欠费不停机
  • 企业信息化:ERP应当与国情需要充分结合
  • CRM思想:贯穿网络建设 助推烟草行业发展
  • ERP+SCM的完美结合:让计划赶上“变化”
  • iTune首推华语歌下载 开辟音乐下载新市场
  • Advertisement

    天极无线


    奇妙科幻|美好风光|清风车影|漫画卡通|星座生肖|明星写真|动物世界
    老鼠爱大米
    挥着翅膀的女孩
    女人味
    栀子花开
    白月光
    刚刚好
    江南
    快乐崇拜
    亲爱的你怎么不在我身边
    小薇
    2002年的第一场雪
    有多少爱可以重来
    我的地盘
    七里香
    情人
     
    老鼠爱大米 老板电话
    冲动的惩罚 七里香
    我不是黄蓉 女生撒娇
    盛夏的果实 坚持到底
    孤单北半球 眉飞色舞
    挪威的森林 可爱女人
    最浪漫的事 老板电话

    CSEEK搜索