MFC保存图片或图形

合集下载

mfc编程用途

mfc编程用途

mfc编程用途
MFC(Microsoft Foundation Classes)是微软公司提供的一个用于 Windows 应用程序开发的类库和框架。

它将 Windows API 进行了封装,提供了一系列的类和函数,使得开发者可以更加方便地创建 Windows 应用程序。

以下是 MFC 编程的一些常见用途:
1. 用户界面开发:MFC 提供了丰富的 UI 组件和控件,如按钮、文本框、列表框等,开发者可以利用这些组件快速构建出美观的用户界面。

2. 图形和绘图:MFC 提供了绘图和图形操作的类和函数,开发者可以使用这些功能来绘制图形、显示图像以及实现动画效果。

3. 文件和数据库操作:MFC 提供了文件操作和数据库访问的类和函数,开发者可以使用这些功能来读取、写入文件,以及连接和操作数据库。

4. 网络编程:MFC 提供了网络通信相关的类和函数,开发者可以使用这些功能来创建网络应用程序,实现客户端/服务器通信。

5. 多线程编程:MFC 支持多线程编程,开发者可以使用它来创建并发执行的线程,提高程序的性能和响应能力。

6. 串口通信:MFC 提供了串口通信的类和函数,开发者可以使用这些功能来与外部设备进行串口通信。

7. 打印和打印预览:MFC 提供了打印和打印预览的功能,开发者可以利用这些功能来设计和实现打印相关的应用程序。

8. 动态链接库(DLL)开发:MFC 可以用于创建动态链接库,这些库可以被其他应用程序调用,实现代码的重用和模块化。

总之,MFC 编程提供了一个强大的工具集,使得开发者能够更加高效地创建 Windows 应用程序,并且减少了对底层 Windows API 的直接操作,提高了开发效率和代码的可维护性。

关于MFC的有些知识

关于MFC的有些知识

关于MFC的有些知识实验⼀1、在VC++中,⼯程与各种源⽂件之间是什么关系?解答:⼯程的实质是⼀些相互关联的源⽂件的集合,可以把项⽬理解成⼀个⼯作任务, 开发环境中,⼯程包含在⼯作区间中,⼀个⼯作区可以管理多个⼯程2、⼀个VC++⼯程下会有3个⽂件夹,这3个⽂件夹分别是什么?以.cpp为后缀的⽂件会添加到哪个⽂件夹中?以.h为后缀⽂件会添加到哪个⽂件夹中?解答:分别是head Files ,Sourse Files, Resourse Files ,.cpp放在Sourse ⽂件⾥⾯,.h放在Head Files⽂件⾥3,以win32 console application⼯程为例,简述⼯程的建⽴,⽂件的添加,⼯程的编译和链接及⼯程的执⾏过程。

解答:这个就是win32 console application⼯程的实例验证过程。

实验⼆1.简述Windows应⽤程序的特点。

解答:⼀.事件驱动的程序设计它是⼀种“被动”式程序设计⽅法,程序开始运⾏时,处于等待⽤户输⼊事件状态,然后取得事件并作出相应反应,处理完毕⼜返回并处于等待事件状态。

⼆. 消息循环与输⼊消息是⼀种报告有关事件发⽣的通知。

· 事件驱动是靠消息循环机制来实现的。

· Windows应⽤程序的消息来源有以下四种:(1)输⼊消息(2)控制消息(3)系统消息(4)⽤户消息三. 图形输出Windows程序的所有输出都是图形,字符也被作为图形来处理。

· GDI提供两种基本服务:创建图形输出和存储图象。

· 绘图函数分为三类:⼀是⽂字输出;⼆是⽮量图形函数,⽤于画线、圆等⼏何图形;三是光栅(位图)图形函数,⽤于绘制位图。

四. ⽤户界⾯对象⽤户界⾯对象:窗⼝边框系统菜单框标题栏菜单栏⼯具条客户区垂直滚动条和⽔平滚动条状态栏图标光标插⼊符对话框控件消息框五.资源共享· 常见的资源包括:设备上下⽂,画刷,画笔,字体,对话框控制,对话框,图标,定时器,插⼊符号,通信端⼝,电话线等。

mfc中picture control使用

mfc中picture control使用

mfc中picture control使用在MFC中,Picture Control是一个用于显示图片的用户界面控件。

它通常用于在应用程序中展示图像内容。

以下是使用MFC中的Picture Control控件的步骤:1、添加Picture Control控件:在Visual Studio的设计视图中,打开你的对话框资源。

在工具箱中,找到Picture Control 控件并将其拖动到对话框上。

2、关联Picture Control控件与变量:选中Picture Control控件,在属性窗口中找到IDC_STATIC对应的ID,然后将其改为一个唯一的ID,比如IDC_PICTURE。

同时,在Class View中为该控件添加一个对应的变量,类型选择为CStatic。

3、加载并显示图片:在代码中找到对应的消息处理函数(例如OnInitDialog),然后使用以下代码加载并显示图片:cpp// 加载图片资源HRSRC hResource = FindResource(AfxGetResourceHandle(),MAKEINTRESOURCE(IDB_PICTURE), RT_RC);HGLOBAL hGlobal = LoadResource(AfxGetResourceHandle(), hResource);// 获取图片数据的指针LPCTSTR lpData = (LPCTSTR)LockResource(hGlobal);// 计算图片大小DWORD dwSize = SizeofResource(AfxGetResourceHandle(), hResource);// 创建位图对象CBitmap bitmap;bitmap.CreateFromBase(lpData, dwSize, NULL, LR_CREATEDIBSECTION);// 获取Picture Control控件的句柄HWND hWndPicture = GetDlgItem(IDC_PICTURE);// 创建兼容的DC(设备上下文)对象CDC compatibleDC;compatibleDC.CreateCompatibleDC(&compatibleDC);// 创建位图对象兼容的位图CBitmap* pOldBitmap = compatibleDC.SelectObject(&bitmap);// 将位图绘制到Picture Control控件上BitBlt(hWndPicture, 0, 0, bitmap.GetWidth(), bitmap.GetHeight(), &compatibleDC, 0, 0, SRCCOPY);// 释放资源compatibleDC.SelectObject(pOldBitmap);FreeResource(hGlobal);上述代码假设你的图片资源已经添加到资源文件中,并且资源的ID为IDB_PICTURE。

MFC屏幕绘图

MFC屏幕绘图
其中 x、y 表示一个点的坐标值。 矩形 RECT 数据结构:
typedef struct tagRECT { LONG left; LONG top; LONG right; LONG bottom;
} RECT; 其中 left、top 表示矩形左上角的 x、y 坐标值,right、bottom 表示矩形右下角 的 x、y 坐标值。 表示矩形高宽的 SIZE 数据结构:
typedef struct tagSIZE { int cx; int cy;
} SIZE; 其中 cx、cy 表示矩形的宽度、高度值。 CPoint 类与 POINT 数据结构类似,它还包含了用来处理 CPoint 类和 POINT 结 构类型数据的成员函数。CPoint 类的对象可以用在任何使用 POINT 结构数据的 地方。CPoint 类与 SIZE 结构和 CSize 类可以互相使用,因为它们的数据结构是 一样的。
6
CSize( int initCX, int initCY );
CSize( SIZE initSize );
CSize( POINT initPt ); CSize( DWORD dwSize );
// cx 值放在 dwPoint 的低 16 位,cy 值放 在 dwPoint 的高 16 位)。
1
图 4-1 窗口内的客户区与非客户区
4.1.3、绘图类
MFC 提供了不同类型的设备描述表的类(绘图类):CDC、CPaintDC、CClientDC、 CWindowDC 和 CmetafileDC。其中 CDC 类是 MFC 绘图类的根类,其它的绘图类都是 CDC 类的派生类。CDC 类包含了绘图所需的所有成员函数。其它的派生类,除了 CmetafileDC 类之外,都仅仅是构造函数和析构函数的不同。

可视化编程入门mfc

可视化编程入门mfc

*
一个应用程序的执行就像一场舞台演出。应用程序对象是幕后人员(导演、剧务等),它们负责安排并指挥“演员”(窗口)上场,准备和调度各种演出“资源”(如菜单、工具栏、图标等)。从操作系统来看,具有“法人”地位的是应用程序对象而非窗口对象,应用程序可以占有CPU时间和内存空间,还可拥有演出所需的“资源”。
2.基于Microsoft MFC的编程方法
*
MFC是一个很大的类层次体系(MFC6.0中包含了200多个类),它由一个称为CObject的类作为根基类,其他类大部分从该类派生而来,其整个类体系可大致划分为: ■基类 ■应用程序框架类。 包括:应用程序类、命令类、文档/视窗类、框架窗口类、文档模板类等 ■可视对象类。 包括:窗口类、对话框类、控件类等 ■绘图类。 包括:绘图工具类、设备描述表类等。 ■简单数据类型类 ■通用类 包括:数组类、类表类、映像类 ■文件和数据库类 包括:文件I/O类、ODBC类、ADO类 ■Internet和网络工作类 包括:Win32 Internet类、Windows Socket类等 ■对象链接和嵌入(OLE, Object Lingking and Embedding)类 ■调试和异常类
*
冯耀霖
202X
VC++的可视化编程 入 门
本课程简要介绍Windows应用程序的形式和在VC++集成开发环境下使用MFC编写Windows应用程序的基本方法,以使同学们对面向对象的可视化(Visual)程序设计建立一个初步的概念并掌握一些基本方法,为深入学习和使用VC++和其他可视化编程工具打下基础。
*
当在对象上发生了某个事件并发出了相应的消息后,接收者对象就要响应并处理该消息。每个需要响应的消息要求对应一个处理该消息的程序——事件驱动程序。响应消息就是启动相应的事件驱动程序。Visual Studio中将响应消息的过程称为消息映射。

第15课 - MFC简介

第15课 - MFC简介

以传统的windows消息处理方式相同,以 WM_开头的消息,需要重载虚函数 PreTranslateMessage(MSG* pMsg); 使用消息映射,将相应的消息映射成函数,我们 只关心映射的结果函数即可。
Windows程序设计-基础教程
MFC对话框框架简介
15
对话框框架分析
Windows程序设计-基础教程
创建典型的对话框程序(示例)后,会出现如下 几个类: CTest18App:应用程序管理类 CTest18Dlg:对话框管理类 其中,后两个类是根据项目名称而定的,规则是 :C+项目名称+App(或Dlg)
CAboutDlg
Windows程序设计-基础教程
在MFC编程中,大部分对话框都需要一个类来对它 进行控制。并使用DoModal()的方法显示它,操 作步骤如下: CAboutDlg aboutDlg; aboutDlg.DoModal();
1)创建兼容DC 2)选入位图 3)执行BitBlt函数,将兼容DC中的图形拷贝 到当前设备环境中。 4)选出位图 5)删除位图
举例
Windows程序设计-基础教程
HBITMAP hOldbmp,hbmp = NULL; HDC hmdc =CreateCompatibleDC(hdc); hbmp = LoadBitmap(hInstance, MAKEINTRESOURCE(ID_BMP)); hOldbmp = (HBITMAP)::SelectObject(hmdc ,hbmp); ::BitBlt(hdc,0,0,200,200,hmdc, 0,0,SRCCOPY); ::SelectObject(hmdc,hOldbmp); DeleteDC(hmdc);

在MFC中使用OpenCV教程


典型例图 ExampleL.bmp、 ExampleQ.bmp
简要说明 仅适用于单连通区域, 不能处理多连通区域与孔边界
ExampleC.bmp、
适用各类二值图像,使用范围较宽
SteelBar.bmp、pic3.png 图像反相后也可进行处理,得到不同结果
ExampleD.bmp
为灰值形态学运算,波谷检测又称黑顶帽变换
三、用 DirectShow 编制的视频采集程序 采用 DirectShow 实现视频采集,其优点是支持高分辨率图像采集,最高分辨率由所用的摄像头决定, 如罗技 130 万像素 USB 摄像头 C300 最高分辨率可达 1280*1024,在 MPEG 模式下采集速度为每秒 15 帧。 使用时 CPU 的时间占用率在 15~30%之间。 通过多图像平均可以采集得到质量不错的图像,经过 4 幅图像平均采集所得图像的信噪比可提高一倍。 由于需要连续采集多帧图像,约需 0.25 秒,故适宜采集静态或缓慢移动对象的图像。 视频采集功能调用 OpenCV China 网站下载的软件 camerads 中的函数实现。
主要内容
下面列出 stdafx.h 尾部集中的几个头文件,程序结构由此可见一斑。
#include "CVMFC.h"
// 窗口管理
#include "cv.h" #include "highgui.h"
// OpenCV 头文件
#include "CameraDS.h" #include "CVDSCap.h"
图像反相后处理与另一方法直接处理等价
lena.jpg、fruits.jpg lena.jpg、fruits.jpg

在基于MFC的VC程序中缩放显示位图


缩小或放大显示位图的示例 代码如下 :
CRe t e t GeCl n R c( e t: c c : r t i t e t&r c) e p DC- t th t0 【 rc . i t( ・ r c. ih (, &d C mp t >Sr c Bl . 1 e t d h ) e t e ( . W Heg t ) co , l ・ l. b l f .mWi t , b l f .mHeg t S COP : 1 mpn o b dh mp n ob i h . RC Y)
B 图像格 式 。在 基于MF MP c的v 程序 中,可以通过调 用MF 的设备环 境类c c 成员函数B cl 或 成员函数sr cB t来 实现 c c D 的 i t BO tt l ch O
B 住 图的 缩 放 显 示 。 MP
关键词 B 位 图 MF v 程序 缩放 显示 MP C c B 格式是Wi o s 1 MP n w l部存储图像时采用 的默认 文件格式 ,是 d L 种与硬件设备无关 的图像文件格式 。由于B 格式是Wi o s MP n w 环 d 境中图像数据交换 的一种标准 ,因此 ,在Wi o s n w 环境 中运 行的图 d 形图像处理软 件都支持 B 格式。在基于MF 的V 程序 中显 示位 MP C C 图的最简单 方法是使 用V 系统提 供的图 片控 件 ,通过 设置控 件的 C 属性 即可在控 件中显示位图 。但该方法缺乏灵活性 , 所显 示的图片 的大小也有 一定 的限制 。本文 将讨 论使 用MF 类来 实现显 示位 图 C 的编程方法 。
CB t pb p; b . o d i p I B B T i ma m mpL a B t (D — I MAP : ma )

MFC利用图像数据在Picture控件中显示

MFC利用图像数据在Picture控件中显示2011-06-15 19:55:21| 分类:默认分类| 标签:mfc 数据数组显示|举报|字号大中小订阅在网上一直搜不到利用图像数据显示的代码,后来自己忙活了几天总算是搞定了。

CDC* pDC=GetDC(); //获得当前窗口句柄CRect rcBmp;GetDlgItem(IDC_IMAGEVIEW)->GetWindowRect(rcBmp); //IDC_IMAGEVIEW是picture控件IDScreenToClient(&rcBmp);BITMAPINFO *m_pBMI = (BITMAPINFO*)new BYTE[sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)];m_pBMI->bmiHeader.biBitCount = 24;// 24位图像数据结构,需要用3个BYTE的数据类型构造m_pBMI->bmiHeader.biClrImportant = 0;m_pBMI->bmiHeader.biCompression = 0;m_pBMI->bmiHeader.biHeight = -image_rawHeight; //负号使显示的图像不出现倒置情况,因为图像是自底向上填写的m_pBMI->bmiHeader.biClrUsed =256;//0;m_pBMI->bmiHeader.biPlanes = 1;m_pBMI->bmiHeader.biSize = 40;m_pBMI->bmiHeader.biSizeImage = image_rawHeight*image_rawWidth*3;//m_pBMI->bmiHeader.biWidth = image_rawWidth;m_pBMI->bmiHeader.biXPelsPerMeter = 0;m_pBMI->bmiHeader.biYPelsPerMeter =0;for(int i = 0; i<256;i++){m_pBMI->bmiColors[i].rgbBlue =i;m_pBMI->bmiColors[i].rgbGreen =i;m_pBMI->bmiColors[i].rgbRed =i;m_pBMI->bmiColors[i].rgbReserved = 0;}SetDIBitsToDevice(pDC->m_hDC,rcBmp.left,rcBmp.top,rcBmp.Width(),rcBmp.Height(),0,0,0,image_rawHeight,Gray,m_pBMI,DIB_RGB_COLORS); ////////struct Pixel{BYTE gray[3];};Pixel *Gray=new Pixel[numPixels];上述Gray的声明过程。

MFC入门


void GetCoord(int *L, int*T,int *R,int *B)
};
C++类中包含私有、公有和保护成员
C++ 类中可定义三种不同访问控制权限的成员。 class CRectFill:public CFigure
①私有 (private)成员: {
protected: 只有在类中说明的函数才能访问该类的私有成员, class CRectangle { CRectFill() { } 而在该类外的函数不可以访问私有成员; private : DECLARE_SERIAL(CRectFill)
C++支持多态性,C++允许一个相同的标识符或运算符 代表多个不同实现的函数,这就称标识符或运算符的 重载,用户可以根据需要定义标识符重载或运算符重 载。
class Point { public: int x; int y; Point( ) { x=0;y=0; } Point(int a,int b) { x=a; y=b; } ~Point( ) {}
构造函数
4、只要一个类定义了一个构造函数,不管这个
构造函数是否是带参数的构造函数,C++就不再
提供默认的构造函数。也就是说,如果为一个类
定义了一个带参数的构造函数,还想要无参数的 构造函数,则必须自己定义。
析构函数
1、当一个对象生命周期结束时,其所占有的内存空间就
要被回收,这个工作就由析构函数来完成。 2、析构函数是“反向”的构造函数,析构函数不允许有 返回值,更重要的是析构函数不允许带参数,并且一个 类中只能有一个析构函数。
this指针
this指针指向的是类还是对象本身呢?
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

这几个函数可以完全搞定,颜色你自己可以修改下 BOOL C**Dlg::SaveFILe(HBITMAP hBitmap, CString FileName) { int iBits; WORD wBitCount; DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0; BITMAP Bitmap; BITMAPFILEHEADER bmfHdr; BITMAPINFOHEADER bi; LPBITMAPINFOHEADER lpbi; HANDLE fh, hDib, hPal,hOldPal=NULL;

hDC = CreateDC("DISPLAY", NULL, NULL, NULL); iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES); DeleteDC(hDC); if (iBits <= 1) wBitCount = 1; else if (iBits <= 4) wBitCount = 4; else if (iBits <= 8) wBitCount = 8; else wBitCount = 24;

GetObject( hBitmap, sizeof( Bitmap ), ( LPSTR )&Bitmap ); bi.biSize = sizeof( BITMAPINFOHEADER ); bi.biWidth = Bitmap.bmWidth; bi.biHeight = Bitmap.bmHeight; bi.biPlanes = 1; bi.biBitCount = wBitCount; bi.biCompression = BI_RGB; bi.biSizeImage = 0; bi.biXPelsPerMeter = 0; bi.biYPelsPerMeter = 0; bi.biClrImportant = 0; bi.biClrUsed = 0;

dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight; hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER)); lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib); *lpbi = bi;

hPal = GetStockObject(DEFAULT_PALETTE); if (hPal) { hDC = ::GetDC(NULL); //hDC = m_pDc->GetSafeHdc(); hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE); RealizePalette(hDC); }

GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) +dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS);

if (hOldPal) { ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE); RealizePalette(hDC); ::ReleaseDC(NULL, hDC); }

fh = CreateFile(FileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);

if (fh == INVALID_HANDLE_VALUE) return FALSE; bmfHdr.bfType = 0x4D42; // "BM" dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize; bmfHdr.bfSize = dwDIBSize; bmfHdr.bfReserved1 = 0; bmfHdr.bfReserved2 = 0; bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize; WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);

WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL); GlobalUnlock(hDib); GlobalFree(hDib); CloseHandle(fh);

return TRUE; }

HBITMAP C**Dlg::CopyDCToBitmap(HDC hScrDC, LPRECT lpRect) { HDC hMemDC;

HBITMAP hBitmap,hOldBitmap; int nX, nY, nX2, nY2; // 选定区域坐标 int nWidth, nHeight; if ( IsRectEmpty( lpRect ) ) return NULL; nX= lpRect->left; nY= lpRect->top; nX2 = lpRect->right; nY2 = lpRect->bottom; nWidth = nX2 - nX; nHeight = nY2 - nY; //为屏幕设备描述表创建兼容的内存设备描述表 hMemDC= CreateCompatibleDC( hScrDC ); // 创建一个与屏幕设备描述表兼容的位图 hBitmap = CreateCompatibleBitmap( hScrDC, nWidth, nHeight ); // 把新位图选到内存设备描述表中 hOldBitmap = ( HBITMAP )SelectObject( hMemDC, hBitmap ); // 把屏幕设备描述表拷贝到内存设备描述表中 StretchBlt( hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, nWidth, nHeight, SRCCOPY ); //得到屏幕位图的句柄 hBitmap = ( HBITMAP )SelectObject( hMemDC, hOldBitmap ); //清除 DeleteDC( hMemDC ); DeleteObject( hOldBitmap ); //返回位图句柄 return hBitmap; }

void C**Dlg::OnbuildBitmap( ) { CDC *pdc=GetDC(); //---------------------------------------------------- // 下面是创建兼容DC和兼容DC使用的CBitmap,并规定兼容 // DC的绘图绘制在创建的CBitmap上。 // 经过这一句:MenDC.SelectObject(&bm);以后,不管使用 // MenDC绘制什么,实际上都是绘制在了CBitmap bm;这个内 // 存位图上了. //----------------------------------------------------

CDC MenDC; CBitmap bm; MenDC.CreateCompatibleDC( pdc ); bm.CreateCompatibleBitmap( pdc, WD+2, HT+2 ); //设定背景位图大小,最好是整个客户区大小 MenDC.SelectObject( &bm ); //---------------------------------------------------- // 下面使用MenDC绘制你想要的任何东西,这里只添加了一个文本 //----------------------------------------------------

MenDC.TextOut( 1, 1, "safds"); //MenDC.MoveTo //MenDC.Ellipse //所有绘图都在这个区间进行 //---------------------------------------------------- // 下面设定你要从CBitmap bm;上截取哪一部分。 //----------------------------------------------------

RECT rt; rt.left = 0; rt.right = cutWD+2; rt.top = 0; rt.bottom = cutHT+2;

//---------------------------------------------------- HBITMAP hBmp = CopyDCToBitmap( MenDC.GetSafeHdc(), &rt ); SaveBmp( hBmp, "MM.bmp" );

//---------------------------------------------------- bm.DeleteObject(); MenDC.DeleteDC(); ReleaseDC(pdc); }

相关文档
最新文档