`
netcome
  • 浏览: 466577 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多
void CTrainView::SaveAsBmp(CString filename)
{
		//定义图形大小
	    CRect clientRC;
		this->GetClientRect(clientRC);
		int iWidth = clientRC.Width();
		int iHeight = clientRC.Height();
		int iPixel = 16;
		//图形格式参数
		BITMAPINFO *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);
		//添加自绘图形
		OnDraw(pMemDC);
														//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 CTrainView::OnFileSaveAs()
{
	// TODO: 在此添加命令处理程序代码
		CFileDialog dlg(false,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "位图文件(*.bmp)|*.bmp|",NULL);
		if (dlg.DoModal()!= IDOK) return;
		CString filename = dlg.GetFileName() + ".bmp";
		SaveAsBmp(filename);
}
 
分享到:
评论

相关推荐

    VC.rar_CView_vc 打印

    积累的VC编程小技巧之打印相关的一些详细的变成说明,是用来改变消息路由的。用了这段代码之后,CView中的消息(菜单,控件,子窗口)将先被CMyShape类来处理。不知道你要的是不是这样的效果。

    VS2015--对话框内添加视图类(CView)代码

    VS2015环境下,在对话框(CDialog)中添加视图类(CView),完成绘图功能!VS2010也可使用!

    VC图标处理与工具栏制作软件

    包含两个处理软件:图标编辑设计(对图片进行处理从而获得.ico .bmp .png等标准图标图片)和真彩工具栏的制作,简单易用,效果也很好。

    滚动窗口的实现兼容DC实现图形的保存和再现

    如何让CDC上输出的文字、图形具有保持功能,集合类CPtrArray的使用,CPaintDC与CClientDC的区别与应用,OnPaint与OnDraw在CView中的关系及实现内幕,滚动窗口的实现,坐标空间,映射方式,设备坐标与逻辑坐标的转换...

    viewdemo D:\Smart\vc\viewdemoD:\Smart\vc\viewdemo

    vc sdi cview demo vc sdi cview demo vc sdi cview demo vc sdi cview demo vc sdi cview demo vc sdi cview demo

    VC之美化界面篇本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者。读者最好具有以下VC基础:

    有了Windows,一切都好办了,Windows将诸如按钮、菜单、工具栏等等这些通用界面的绘制及动作都交给了系统,程序员就不用花心思再画那些按钮了,可以将更多的精力放在程序的功能实现方面。 所有的标准界面元素都被...

    VC 实例 工具栏与状态栏

    VC 实例 工具栏与状态栏

    VC学习大纲 VC学习讲义

    如何让CDC上输出的文字、图形具有保持功能,元文件设备描述表的使用,CpaintDC与CClientDC的区别与应用,OnPaint与Ondraw在CView中的关系及实现内幕,集合类CObArray的使用,滚动窗口的实现,设备坐标与逻辑坐标的...

    类似VC6.0界面的代码例子(两种种方式)

    最近要做个项目,要使用类似VC6.0一样的界面。找了找,总结了一下。压缩包里有两种实现方式。其实界面类似vs2010的。其实如果大家愿意使用vs2010的,在MFC生产向导中是自带VS2010界面的程序的。都是CDockbar的派生类...

    Dialog上的CView类

    自己写个View类,"搬"到对话框上,在对话框上实现View类

    CVIEW 免进中文系统 3.4 繁体版

    需要倚天15,24字型才能显示中文字, kcfont.zip (900k) (从国乔中文转的),请解压放到c:\et3

    vc 抓屏程序:截取当前屏幕核心代码.rar

    vc 抓屏程序,截取当前屏幕核心代码,为了操作和显示方便,这里为其增加了一套窗体,你只需在启动程序后在窗体的空白处点击右键,即可将当前屏幕的内容截取下来,并显示在窗体中,与QQ抓图十分相似,但要像QQ截图...

    从VC项目的菜单资源构造弹出式菜单

    读取VC项目中的菜单资源,构造一个完全相同的弹出式菜单。步骤如下: (1)使用CMenu::LoadMenu载入在资源模板里创建的主菜单; (2)定义空的弹出式菜单,将...从菜单资源和工具栏位图中建立自绘弹出式菜单很快上载。

    计算机图形学 种子填充算法 MFC、VC

    dc.TextOut(1,5,"请为每个区选种子,务必在图形内"); CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); int i; for(i=0;p[i+1].x!=-1;i++) { dc.MoveTo(p[i].x,p[i].y); dc.LineTo(p[i+1].x,p[i+1].y)...

    Cview软件,可直接打开CV测试原始数据

    可直接将输力强测试的CV数据打开并进行相应的处理,可直接将输力强测试的CV数据打开并进行相应的处理,

    VC 6.0 定制分割条(分隔条)的样式及大小.rar

    VC 6.0 定制分割条,也就是窗体的分隔条,将窗口分隔成若干个部分,用来显示不同的内容,该窗格视图为CStaticSplitWnd4View,该窗格大小不能通过拖动改变,不过我们可以通过菜单命令动态改变大小,窗格视图为CView2,...

    CVIEW显示灰度图示例

    CVIEW显示灰度图示例,代码在https://blog.csdn.net/liji_digital/article/details/84502750 有解释

    cview前端UI框架

    PC端vue项目引用; 自定义UI框架; 轻量级; 可打包cdn方式引入; 分页、消息弹窗、抽屉、按钮、按钮集和、空数据、自定义表格......

    计算机图形学 V从图形编程

    计算机图形学 VC图形编程 绘制点 绘制点 32位的COLORREF类型值来确定图形颜色值,其结构为0x00bbggrr, bb:代表蓝色值,范围从00到FF; gg:代表绿色值,范围从00到FF; rr:代表红色值,范围从00到FF; 还可以用RGB...

    《VC++深入详解》第11章 图形的保存和重绘

    如何让CDC上输出的文字和图形具有保持功能,集合类CPtrArray的使用,CPaintDC与CClientDC的区别与应用,OnPaint与OnDraw在CView中的关系及实现内幕,滚动窗口的实现,坐标空间、映射方式、设备坐标与逻辑坐标的转换...

Global site tag (gtag.js) - Google Analytics