搜档网
当前位置:搜档网 › 数字图像处理MFC显示BMP图片

数字图像处理MFC显示BMP图片

数字图像处理MFC显示BMP图片
数字图像处理MFC显示BMP图片

【数字图像处理】一.MFC详解显示BMP格式图片

标签:图像处理BMP格式详解BMP图片显示MFC

2014-01-14 19:31 5250人阅读评论(8) 收藏举报分类:

MFC图像知识(11)数字图像处理(6)

本文主要是讲述《数字图像处理》系列栏目中的第一篇文章.主要详细介绍了BMP图片格式,同时使用C++和MFC显示BMP格式,主要结合自己的《数字图像处理》课程和以前的项目叙述讲解.

一.BMP图片格式定义

BMP文件格式是Windows操作系统推荐和支持的标准图像文件格式,是一种将内存或显示器的图像数据不经过压缩而直接按位存盘的文件格式,故称位图(bitmap),其扩展名为BMP.BMP图像通常有4个部分组成:位图文件头、位图信息头、颜色表、位图数据.如下图所示:

第一部分为位图文件头BITMAPFILEHEADER.位图文件头结构长度固定为14个字节,包含文件的类型、大小、位图文件保留字、位图数据距文件头的偏移量.其中WORD为无符号16位整数(2byte),DWORD为无符号32位整数(4byte).具体结构体定义如下:

//位图文件头

typedef struct tagBITMAPFILEHEADER {

WORD bfType; //位图文件的类型,必须为BM 0x424d 表示.bmp

DWORD bfSize; //位图文件的大小,以字节为单位包括该14字节

WORD bfReserved1; //位图文件保留字,必须为0

WORD bfReserved2; //位图文件保留字,必须为0

DWORD bfOffBits; //位图数据距文件头的偏移量,以字节为单位即前三部分和

} BITMAPFILEHEADER;

第二部分为位图信息头BITMAPINFOHEADER,该结构也固定为40个字节,用于说明位图的尺寸、宽高、像素、分辨率、颜色表等信息.具体结构定义如下:

//位图信息头

typedef struct tagBITMAPINFOHEADER {

DWORD biSize; //本结构所占用字节数 40字节

LONG biWidth; //位图的宽度,以像素为单位

LONG biHeight; //位图的高度,以像素为单位

WORD biPlanes; //目标设备的级别,必须为1

WORD biBitCount; //每个像素所需的位数,必须是1(双色)、

//4(16色)、8(256色)或24(真彩色)之一

DWORD biCompression; //位图压缩类型,必须是 0(BI_RGB不压缩)、

//1(BI_RLE8压缩类型)或2(BI_RLE压缩类型)之一

DWORD biSizeImage; //位图的大小,以字节为单位

LONG biXPelsPerMeter; //位图水平分辨率,每米像素数

LONG biYPelsPerMeter; //位图垂直分辨率,每米像素数

DWORD biClrUsed; //位图实际使用的颜色表中的颜色数

DWORD biClrImportant; //位图显示过程中重要的颜色数

} BITMAPINFOHEADER;

第三部分为颜色表或调色板(Palette).有些位图需要调色板,有些位图如真彩色图(biBitCount=24)不需要调色板,它们的BITMAPINFOHEADER后面直接是位图数据.调色板实际是一个数组,共有biClrUsed个元素(如果该值为零,则有2的biBitCount次幂个元素).数组中每个元素的类型是一个RGBQUAD结构,占4字节.定义如下:

//位图颜色表

typedef struct tagRGBQUAD

{

BYTE rgbBlue; //蓝色的亮度(值范围为0~255)

BYTE rgbGreen; //绿色的亮度(值范围为0~255)

BYTE rgbRed; //红色的亮度(值范围为0~255)

BYTE rgbReserved; //保留,必须为0

第四部分就是实际的图像数据.对于真彩色图(24位位图 biBitCount=24),图像数据就是实际的RGB值;对于用到调色板的位图,图像数据就是该像素颜色在调色板中的索引值.下面对2色、16色、256色和真彩色位图分别介绍:

(1).2色位图:当biBitCount=1时,用1位就可以表示该像素的颜色(0表示黑,1表示白),所以8个像素占1个字节;

(2).16色位图:当biBitCount=4时,用4为可以表示一个像素的颜色,所以2个像素占1个字节;

(3).256色位图:当biBitCount=8时,用1个字节表示1个像素,1个像素占1个字节;

(4).真彩色图:当biBitCount=24时,此时用3个字节表示1个像素,其中RGB各占1字节,由于没有颜色表,位图信息头后面是位图数据.

同时,注意以下几点:

1.由于Windows规定一个扫描所占的字节数必须是4的倍数(即以long为单位),不足的以0填充.同时注意下面公式,计算只含位图数据的大

小:biSizeImage=(((bi.biWidth*bi.biBitCount)+31)/(32*4))*bi.Height

在后面讲述获取文件的信息时会通过UE软件结合16进制数据进行详细讲解上面各个数据的具体含义. 2.BMP图片格式的数据是从下到上、从左到右读.即文件中最先读到的图像是最下面一行的左边第一个元素,即从左下角开始存储(0,0)点,从左下角到右上角存储数据.尤其是在图像几何变换平移、旋转时,我就犯过这样的错误,本想让图像从左下角向右上移动,结果刚好相反,后面也会通过实例加深大家的印象.

3.如果想使用C语言\C++显示图片,建议自定义个ImageStruct.h的头文件.包含BMP位图的位图文件头结构、位图信息头结构、位图颜色表3个结构,在实例变量操作.而使用MFC,因为在wingdi.h文件中系统已经定义了BMP图像的结构BITMAPFILEHEADER、BITMAPINFOHEADER,直接在View.h中用他俩实例定义即可.

二.显示BMP图片的基本步骤

在MFC工程XXXView.h类中添加成员函数void ShowBitmap(CDC* pDC,CString BmpName);通过自定义函数实现显示BMP格式图像,其中*pDC是CDC句柄,BmpName是图像文件名.具体步骤如下:

1.创建位图并调用函数LoadImage装载图标、光标或位图.

HBITMAP m_hBitmap;

m_hBitmap=(HBITMAP)LoadImage(HINSTANCE hinst,LPCTSTR lpszName,UINT uType,int cxDesired,int cyDesired,UINT fuLoad)

2.定义并创建一个内存设备环境DC,调用函数CreateCompatibleDC创建兼容的DC.

CDC dcBmp; dcBmp.CreateCompatibleDC(pDC) ;

3.定义BITMAP变量,调用函数GetBitmap将图片载入位图中,该定义是为后去图像的长宽等信息.

BITMAP m_bmp; m_bitmap.GetBitmap(&m_bmp);

4.调用函数SelectObject将位图选入兼容内存设备环境DC中.

dcBmp.SelectObject(&m_bitmap);

5.将兼容的DC中的位图填到当前DC中,调用函数BitBlt或strechBlt显示图像.

(1).BitBlt()该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境. pDC->BitBlt(0,0,m_bmp.bmWidth,m_bmp.bmHeight,&dcBmp,0,0,SRCCOPY);

(2).stretchBlt()该函数从源矩形中复制位图到目标矩形,必要是按目标设备设置的模式进行图像拉伸或

压缩.

pDC->StretchBlt(0,0,m_nDrawWidth,m_nDrawHeight,&dcBmp,0,0,m_bmp.bmWidth,m_bmp.bmHeight,SR

6.恢复临时DC的位图,删除CreateCompatibleDC得到的图片DC,删除内存中的位图及释放系统资源.

dcBmp.SelectObject(pbmpOld); DeleteObject(&m_bitmap); dcBmp.DeleteDC();

具体函数代码如下:

//****************显示BMP格式图片****************//

void CShowBMPView::ShowBitmap(CDC *pDC, CString BmpName)

{

//定义bitmap指针调用函数LoadImage装载位图

HBITMAP m_hBitmap;

m_hBitmap = (HBITMAP)

LoadImage(NULL,BmpName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_DEFAULTSIZE|LR_CREATEDIBSECTION);

/*************************************************************************/

/* 1.要装载OEM图像,则设此参数值为0 OBM_ OEM位图 OIC_OEM图标 OCR_OEM光标

/* 2.BmpName要装载图片的文件名

/* 3.装载图像类型:

/* IMAGE_BITMAP-装载位图 IMAGE_CURSOR-装载光标 IMAGE_ICON-装载图标

/* 4.指定图标或光标的像素宽度和长度以像素为单位

/* 5.加载选项:

/* IR_LOADFROMFILE-指明由lpszName指定文件中加载图像

/* IR_DEFAULTSIZE-指明使用图像默认大小

/* LR_CREATEDIBSECTION-当uType参数为IMAGE_BITMAP时,创建一个DIB项

/**************************************************************************/

if( m_bitmap.m_hObject )

{

m_bitmap.Detach(); //切断CWnd和窗口联系

}

m_bitmap.Attach(m_hBitmap); //将句柄HBITMAP m_hBitmap与CBitmap m_bitmap关联

//边界

CRect rect;

GetClientRect(&rect);

//图片显示(x,y)起始坐标

int m_showX=0;

int m_showY=0;

int m_nWindowWidth = rect.right - rect.left; //计算客户区宽度

int m_nWindowHeight = rect.bottom - rect.top; //计算客户区高度

//定义并创建一个内存设备环境DC

CDC dcBmp;

if( !dcBmp.CreateCompatibleDC(pDC) ) //创建兼容性的DC

return;

BITMAP m_bmp; //临时bmp图片变量

m_bitmap.GetBitmap(&m_bmp); //将图片载入位图中

CBitmap *pbmpOld = NULL;

dcBmp.SelectObject(&m_bitmap); //将位图选入临时内存设备环境

//图片显示调用函数stretchBlt

pDC->StretchBlt(0,0,m_bmp.bmWidth,m_bmp.bmHeight,&dcBmp,0,0,m_bmp.bmWidth,m_bmp.bm Height,SRCCOPY);

/*******************************************************************************/

/* BOOL StretchBlt(int x,int y,int nWidth,int nHeight,CDC* pSrcDC,

/* int xSrc,int ySrc,int nSrcWidth,int nSrcHeight,DWORD dwRop );

/* 1.参数x、y位图目标矩形左上角x、y的坐标值

/* 2.nWidth、nHeigth位图目标矩形的逻辑宽度和高度

/* 3.pSrcDC表示源设备CDC指针

/* 4.xSrc、ySrc表示位图源矩形的左上角的x、y逻辑坐标值

/* 5.dwRop表示显示位图的光栅操作方式 SRCCOPY用于直接将位图复制到目标环境中

/*******************************************************************************/

dcBmp.SelectObject(pbmpOld); //恢复临时DC的位图

DeleteObject(&m_bitmap); //删除内存中的位图

dcBmp.DeleteDC(); //删除CreateCompatibleDC得到的图片DC

}

补充:MFC中DC指device context,设备环境或设备描述表,它其实是GDI内部保存数据的一种数据结构.此结构中属性内容与特定输出设备相关,属性定义了GDI函数的工作细节.总之,使用GDI绘图函数,就需要一个DC句柄,MFC中把和DC 相关的封装成类.其中CDC是一个抽象基类,可以访问整个显示器和打印机.其中下面链接中的文章详细描述了CBitmap、HBitmap、Bitmap三者的区别与联系.https://www.sodocs.net/doc/c05910443.html,/ivan_ljf/article/details/8569130

三.MFC显示BMP图片

下面将详细讲解使用VS2012 MFC创建工程的具体步骤:

第一步:新建项目"MFC应用程序",项目名为ShowBMP,在应用程序类型中选择"单个文档",点击"确定".在右栏的"资源视图"中,点击"Menu->IDR_MAINFRAM"可以查看并修改菜单视图.

第二步:向CShowBMPView类添加成员变量和成员函数.在右栏的"类视图"右键CShowBMPView添加函数或直接在ShowBMPView.h中直接添加public成员变量和成员函数.添加代码如下:

public:

//成员变量

CString BmpName; //保存图像文件文件名

CString EntName; //保存图像文件扩展名

CBitmap m_bitmap; //创建位图对象

//成员函数

void ShowBitmap(CDC* pDC,CString BmpName); //用来显示指定位图bmp的函数

第三步:设置打开BMP图片函数."项目"->"类向导"->选择"类名"CShowBMPView->在命令对象ID中双击"ID_FILE_OPEN"->自动生成默认成员函数OnFileOpen,消息为COMMAND.双击成员函数(Member Functions)进入函数编辑.(VC++ 6.0中Ctrl+W可以实现建立类向导)

向添加成员函数CShowBMPView::OnFileOpen()添加如下代码,主要是生成打开图片的对话框,并获取图片路径及后缀.自定义四种格式为bmp gif jpg tiff,但目前只能打开bmp格式图片.

//**************文件打开****************//

void CShowBMPView::OnFileOpen()

{

//四种格式的文件:bmp gif jpg tiff

CString filter;

filter="所有文件(*.bmp,*.jpg,*.gif,*tiff)|*.bmp;*.jpg;*.gif;*.tiff|

BMP(*.bmp)|*.bmp| JPG(*.jpg)|*.jpg| GIF(*.gif)|*.gif| TIFF(*.tiff)|*.tiff||";

CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,filter,NULL);

//按下确定按钮 dlg.DoModal() 函数显示对话框

if( dlg.DoModal() == IDOK )

{

BmpName = dlg.GetPathName(); //获取文件路径名如D:\pic\abc.bmp

EntName = dlg.GetFileExt(); //获取文件扩展名

EntName.MakeLower(); //将文件扩展名转换为一个小写字符

Invalidate(); //调用该函数就会调用OnDraw重绘画图}

}

第四步:在ShowBMPView.cpp中编写void CShowBMPView::ShowBitmap(CDC *pDC, CString BmpName)函数,即“二.显示BMP图片基本步骤”.同时通过OnDraw()函数调用ShowBitmap()函数显示图片.代码如下:

//在OnDraw函数中调用ShowBitmap()实现图片的显示功能

void CShowBMPView::OnDraw(CDC* pDC)

{

CShowBMPDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

if (!pDoc)

return;

// TODO: 在此处为本机数据添加绘制代码

if( https://www.sodocs.net/doc/c05910443.html,pare(_T("bmp")) == 0 ) //bmp格式

{

ShowBitmap(pDC,BmpName); //显示图片

}

}

四.运行结果及总结

运行程序后,显示如下所示:其中可以看到自定义的打开对话框和显示图片.

最后,该文章主要是数字图像处理的基础知识,详细介绍了BMP图片格式和使用MFC如何读取BMP图片的相关知识.仅以此篇纪念自己的考研结束,新的开始.同时推荐大家阅读一位叫烟雨江南的作者的文章,个人感觉帮组很大.https://www.sodocs.net/doc/c05910443.html,/xiajun07061225/article/details/6633938 同时该项目免费下载网址:

https://www.sodocs.net/doc/c05910443.html,/detail/eastmount/6848841

希望该文章能够对大家有所帮助,同时如果文章中有错误或不足之处,还请大家海涵.

(By:Eastmount 2014-1-14 夜8点https://www.sodocs.net/doc/c05910443.html,/eastmount)

MFC用户界面设计

MFC用户界面设计 (2007-07-03 14:08:02) 转载 MFC用户界面设计一 (创建一个MFC工程的框架) 打开VC++6.0选择New,出现如下界面: 然后选中MFC AppWizard[exe] ,即我们将创建一个MFC的可执行文件,然后在Project Name下面的框中写入这个工程的名字,注意: 工程的名字不要是中文的,且不要太过于长(到底多长是长我也不知道),最好使用英语的单词来定义你所要实现的工程项目的名字。 Location你可以自定义你的创建的这个工程的存放地方。个人建议不要存放在C盘。以防病毒感染之后C盘打不开,你的工作就全没有了。并且最好建一个专用的C++工程的存放文件夹。不推荐使用中文文件夹和存储路路径较长的文件

夹。如:D:\xx\xxx\xxx\xxx\xxx\xxx\xxxx\xxxxxxx\xxx(这样至少自己找的时候都要烦死了)。 Platform只有选择Win32了。在完成了这些之后就可以点击OK了。已开始创建的6小步中的第一步。如下图所示。 可以看见。上面的标题栏显示的是 MFC AppWizard Step 1,这一步是规划一个MFC程序框架的最重要的一部,我们可以选择 1:Single Document(单文档)即创建的程序能在某个时间内装入和编辑一个文档,使用了所有四个基类(C WinApp CFrameWnd CDocument Cview,至于四个基类都是什么作用参考第二章中所述)。典型的对话框应用程序包括配置硬件设备的应用程序、屏幕保护程序和游戏程序等。 2:Multiple Documents (多文档)一次可以装载和编辑多个文档,并且不但使用了所有四个基类,还使用了CFrameWnd的两个派生类,即CMDIFrameWnd和CMDIChildWnd。

mfc界面图书管理系统

目录 1.设计目的 (1) 2.问题描述 (2) 3.需求分析 (2) 3.1 数据需求 (2) 3.2 基本功能需求 (2) 3.3 非功能性需求 (3) 4.概要设计 (3) 5.详细设计 (5) 5.4.1增加书籍 (20) 5.4.2 删除书籍 (21) 5.4.3 查询书籍 (21) 6.调试分析 (22) 7.使用说明 (23) 8.设计总结 (26) 9.参考文献 (27)

《数据结构》课程设计 图书管理 1.设计目的 “数据结构”是计算机科学与技术专业一门十分重要的专业技术基础课,计算机科学各领域及有关的应用软件都要使用到各种数据结构。对于从事计算机科学及其应用的科技工作者来说,数据结构与算法是必须透彻地掌握的重要基础。 学习数据结构与算法的最终目的是解决实际的应用问题,特别是非数值计算类型的应用问题。课程设计是加强学生实践能力的一个强有力手段。课程设计所安排的题目,在难度和深度方面都大于平时的上机训练,要求同学在完成设计和编写中小型软件的过程中,深化对数据结构与算法课程中基本概念、理论和方法的理解;训练综合运用所学知识处理实际问题的能力,强化面向对象的程序设计理念;使同学的程序设计与调试水平有一个明显的提高。 课程设计要求学生在完成程序设计的同时能够撰写比较规范的设计报告。严格实施课程设计这一环节,对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用。

2.问题描述 采用Visual C++编程语言开发工具和MFC,设计并实现图书管理系统。该系统实现了图书管理中的添加,查询,删除,全部查询,退出等功能,以及汇总图书清单,包括对书籍各项信息的汇总。 3.需求分析 3.1 数据需求 图书信息:书名,所属类型,作者,定价,出版日期以及ISBN。 3.2 基本功能需求 1.汇总图书清单,包括对书籍各项信息的汇总;(各项信息包括书名,所属类型,作者,定价,出版日期以及ISBN。) 2.对书籍信息的增、删、查、全部查询等功能。其中删除功能主要依靠第一无二的ISBN,查询功能可以依靠任何一种图书信息(即书名,所属类型,作者,定价,出版日期以及ISBN任意一种)。

MFC启动画面设计

MFC启动画面设计 玩过微软的Office的人都知道,每当打开Office软件,在它初始化的那段时间里,都会出现一个画面,这个画面就是启动画面。 所谓启动画面也就是Splash Screen,你也可以说它是“炫耀画面”。它常常用以显示公司的标志和版权等信息。 目标 用一张位图来作为启动画面,在进入程序时显示。 策略 在应用程序类的I n i t I n s t a n c e ()函数中,在最早时刻创建启动窗口。启动窗口用一个位图类显示在普通窗口中。 步骤 1.创建一个启动窗口类 1)用ClassWizard创建一个从一般CWnd类(当然也可以是CFrameWnd类)派 生的普通窗口类。如图所示:

2)添加Create()成员函数到该类,在该函数中装入启动窗口中显示的位图,以及 在屏幕中央创建该窗口。 void CWzdSplash::Create(UINT nBitmapID) { m_bitmap.LoadBitmap(nBitmapID); BITMAP bitmap; m_bitmap.GetBitmap(&bitmap); int x=(::GetSystemMetrics(SM_CXSCREEN)-bitmap.bmWidth)/2; int y=(::GetSystemMetrics(SM_CYSCREEN)-bitmap.bmHeight)/2; CRect rect(x,y,x+bitmap.bmWidth,y+bitmap.bmHeight); CreateEx(0,AfxRegisterWndClass(0),"",WS_POPUP|WS_VISIBLE|WS_BORDE R,rect,NULL,0); } 3)用ClassWizard添加一个WM_PAINT消息处理函数到该窗口类中,在这里用 BitBlt()把位图绘制到屏幕上。

C++ MFC界面读写USB HID设备数据程序

第一步:列举所有的HID设备: m_ctllHIDdevices.ResetContent(); //这是MFC里面一个list控件,用来显示所有的HID设备的,如果你没有界面,可以不需要此行 UpdateData(FALSE); //更新界面 CString temp; int Count = 0; //Total number of devices found DWORD strSize=0,requiredSize=0; BOOL result1,result2; ULONG DeviceInterfaceDetailDataSize; //定义一些变量,以后会用到 SP_DEVINFO_DA TA DeviceInfoData; SP_DEVICE_INTERFACE_DATA DeviceInterfaceData; PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData; //PSP_DEVICE_INTERFACE_DETAIL_DATA test; //第一步:获取deviceID GUID deviceId; HidD_GetHidGuid(&deviceId); //第二步:获取设备信息 HDEVINFO handle; handle = SetupDiGetClassDevs(&deviceId, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); //Get only HID devices //第三步:对所有的设备进行枚举 //SetupDiEnumDeviceInterfaces(); result1=false; //定义一些变量 result2=false; CString temp11=""; do { DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DA TA); result1 = SetupDiEnumDeviceInterfaces( handle, NULL, // IN PSP_DEVINFO_DA TA DeviceInfoData, OPTIONAL &deviceId, Count, &DeviceInterfaceData ); //获得设备详细数据(初步) SetupDiGetDeviceInterfaceDetail(handle,

MFC之编写一个简单的登录对话框

编写一个简单的登录对话框 大家好,我们利用MFC编写一个简单的登录对话框。主窗体是单文档界面。程序运行的时候,先弹出一个简单的登录对话框,输入用户名和密码后主窗体显示出来。 1、开打VC++6.0。点击文件,新建,点击工程中的MFC AppWizard(exe),在右边选择工程保存的位置,并且为工程取好名字。 2、点击确定后,选择单个文档,你可以一直点击下一步,直到完成,或者在这里直接点击完成即可,完成后界面如下。 3、点击工具栏中的“!”号试着编译运行一次,看是否有问题。如果没有问题,我们继续。点击左边的ResourceView,在Dialog上面鼠标右键单击弹出一弹出框,单击Insert Dialog。

4、在右边新增的对话框中,适当改变窗口大小,加入静态文本框和文本编辑框。 输入用户名:。然后回车

同样在下面的第二个静态文本框的属性标题改为:输入密码:。然后回车。 6、在第一个文本编辑框上右键单击,点击属性,把ID框中的IDC_EDIT1改为容易理解的名字,如:IDC_EDIT_NAME,注意前面的IDC_EDIT最好不要去掉,这样容易见名而知义。同样,对第二个文本编辑框的属性中的IDC_EDIT2改为:IDC_EDIT_PWD 7、在对话框上的任何空白的地方右键单击,点击建立类向导。

然后弹出 选择建立Create a new class,点击OK。 这是为这个对话框创建一个新的类。在Name中,为该对话框类取个名字:CDlg_login。下面的Base class以及Dialog ID不要随便改动。然后点击OK。这样新的类CDlg_login就与本对话框建立起了联系。

Visual C++ 2008 SP1 MFC (OFFICE界面)使用入门

图形画板2008设计文档 目录 1. 图形后台框架 1.1. 基本图形类框架如下: 2. 界面框架 2.1. 快捷菜单 2.2. 主菜单 2.3. 工具栏 3. 如何创建OFFICE风格的MFC工程 4. 如何在工具栏上面添加按钮 4.1. 添加菜单主项

4.2. 为菜单项添加事件 4.3. 添加Ribbon字符 4.4. 将按钮添加到工具栏 4.4.1. 创建主类别(CMFCRibbonCategory) 4.4.2. 创建面板(CMFCRibbonPanel) 4.4.3. 添加按钮(CMFCRibbonButton)到面板? ? 1. 图形后台框架 1.1. 基本图形类框架如下: 2. 界面框架

主用应用了Visual Studio 2008 SP1添加的新增强包,可以方面的创建出像OFFCIE2007的Ribbon界面。 Ribbon工具栏是在MainFrm.CPP中的void CMainFrame::InitializeRibbon()生成的 整个工具栏CMFCRibbonBar分为 2.1. 快捷菜单 2.2. 主菜单 主菜单按钮CMFCRibbonApplicationButton

主菜单CMFCRibbonMainPanel 2.3. 工具栏 主要分成3层结构: 第一层:分类(容器)CMFCRibbonCategory,如图中红色部分所示。

第二层:面板(容器)CMFCRibbonPanel ,如图中红色部分所示。 第三层:元素CMFCRibbonBaseElem,如图中红色部分所示。 先有一个整体的概念~ 3. 如何创建OFFICE风格的MFC工程 以下是创建Visual C++ 2008 SP1创建Office风格的MFC的步骤: 首先,新建项目,选择Visual C++ 中的MFC应用程序,输入名称,点击确定

MFC如何创建多按钮功能的界面

MFC如何创建多按钮功能的界面 最终的效果如下:点击按钮“方块”,弹出方块设置对话框,输入值然后点OK时,绘画方块图像;点击按钮“三角”,同样弹出三角设置对话框然后点OK时,绘画三角图像。

下面介绍制作步骤: 一、创建一图形显示界面 二、创建两图形显示界面 三、创建三图形显示界面 四、创建四图形显示界面 1.打开visual C++,点“文件”,“新建”,“MFC AppWizard(exe)”,“工程名称”,“位置”, “确定”“基本对话框”“完成” 2.得到如图: 按照我的习惯,“确定”“取消”和“TODO”全部删掉,如图: 3. 创建三个按钮和一个静态文本,分别命名“方块”“三角”“OK”。静态文本清空,其属性里“扩展样式”“静态边缘”打勾。他们的ID分别为:IDC_fang,IDC_san,IDC_OK,IDC_DRAW。如图:

4. 双击“方块”按钮,点“确定”,然后输入代码: void CTest425Dlg::Onfang() { // TODO: Add your control notification handler code here extern int flag; flag=1; } 其中变量flag的作用是用来标志,用来判断接下来点“OK”的时候,执行哪种操作。 因为是全局变量,所以加上了extern 同样,双击“三角”按钮,输入代码: void CTest425Dlg::Onsan() { // TODO: Add your control notification handler code here extern int flag; flag=2; } 当然,如果我们需要更多功能时,可以绘制更多的按钮,然后给他们flag=3,flag=4等等的赋值。 5. 双击“OK”按钮,输入代码前半段: void CTest425Dlg::OnOk() { // TODO: Add your control notification handler code here extern int flag; CWnd *pWnd=GetDlgItem(IDC_DRAW); CDC *pDC=pWnd->GetDC(); CBrush WhiteBrush; WhiteBrush.CreateSolidBrush(RGB(255,255,255)); CRect rect; pWnd->Invalidate(); pWnd->UpdateWindow(); pWnd->GetClientRect(&rect);

MFC界面设计

画直线:ye 在cview 中加入 private: CPoint m_point; //自己加的 在onlbutoondown 加入 m_point=point; //自己加的 在onlbuttonup 加入 HDC hdc; //自己加的hdc=::GetDC(m_hWnd); MoveToEx(hdc,m_point.x,m_point.y,NULL); LineTo(hdc,point.x,point.y); ::ReleaseDC(m_hWnd,hdc); //自己加的 完成功能 圆,直线,矩形的画法ye1 首先在菜单添加各种ID 然后定义一个变量m_way赋予不同的值 然后增加鼠标按下和弹起的函数处理根据m_way的值 按下:m_point=point;保存点的相关信息 弹起:CClientDC dc(this); CPen pen(m_linestyle1,m_linewidth,RGB(255,0,0)); dc.SelectObject(&pen); CBrush *pbrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); dc.SelectObject(pbrush); switch(m_way) { case 1: dc.SetPixel(point,RGB(255,0,0)); break; case 2: dc.MoveTo(m_point); dc.LineTo(point); break; case 3: dc.Rectangle(CRect(m_point,point)); break; case 4: dc.Ellipse(CRect(m_point,point)); break; } 再定义一个类: 实现设置不同的线宽和线形,在弹出框进行编写

mfc界面的通讯录管理系统

课程设计(论文) 题目:通讯录管理系统院(系):__________________ 专业班级: 姓名: 学号: 指导教师: 年月日

设计总说明 我的题目是“通讯录管理系统”,具有对联系人进行增删改查等功能,只有一个窗口,窗口左边是联系人的详细信息,右边是联系人姓名列表。窗口上列出所有的“通讯录管理系统”的操作。例如:增加联系人,删除联系人,插入联系人,按姓名查找联系人,按电话查找联系人等,界面简洁方便,功能齐全。 本程序利用MFC界面编程,运用对话框,控件等资源实现界面化的通讯录,使其不但具有美观的界面,同时方便了用户的操作。 关键字:通讯录,信息管理系统方便效率

目录 设计总说明 (2) 1.设计目的 (3) 2.问题描述 (4) 3.需求分析 (4) 3.1 数据需求 (4) 3.2 基本功能需求 (4) 3.3 非功能性需求 (4) 4.概要设计 (5) 4.1 数据结构 (5) 4.2 系统包含的函数 (5) 4.3 函数间的关系 (6) 4.4 系统功能模块图 (7) 5.详细设计 (8) 5.1 结构体的详细定义 (8) 5.2 系统函数详细介绍 (8) 5.3 系统功能模块介绍 (10) 5.4 具体模块设计 (10) 5.4.1增加联系人: (11) 5.4.2:插入联系人 (12) 5.4.3:删除联系人 (13) 5.4.4:保存联系人 (14) 5.4.5:查找联系人 (15) 5.4.6:其它辅助功能 (15)

6.调试分析 (16) 7.使用说明 (17) 8.设计总结 (20) 9.参考文献 (21)

MFC设计项目管理界面心得

我是背后那一束模糊的影子,只为衬托前面那个美丽…… 实现这个“简单”的管理系统其实不是那么简单!其中总结我所遇到的几个大问题:其一:对于一个界面型的管理系统,用我所熟悉的MFC实现,也不断的碰见控件操作和数据交换问题; 其二:数据库操作,对于MFC的CRecordset类来说,还是需要研究一下才能加入这个系统的使用中来的; 其三:生成项目报表,这就需要利用MFC来操作word,用MFC提供的库文件来形成word文档的报表; 下面就来一一介绍我克服这几个问题的过程吧! 第一个,控件操作与数据交换! 首先给大家看一下该系统所涉及的几个界面: 登陆界面

经营部管理主界面 综合部、生产部、总工办管理主界面类似

用户信息更改界面 项目信息查询界面

用户信息注册界面 该系统流程大致是:经营部接到项目,填写项目信息和项目安排,交由下一级总工办;总工办登陆显示该项目信息,填写项目安排后交由下一级生产部;生产部登陆显示该项目信息,填写项目安排后交由下一级综合部;综合部登陆显示该项目信息,填写项目安排后提交下一级返回经营部,此项目完成整个流程。经营部再次登陆,可填写新项目信息和安排。每个部门都可以查看之前所有项目的信息。 之前说的关于控件的操作问题主要就是由于经营部、综合部、生产部、总工办的管理界面相似度很大,我不想做四个Dialog,所以就想着这四个部门共用一个对话框。还有就是不同的用户登陆,所属部门不同,对这个界面的操作权限就不同,如上图所示,还有经营部可以编辑项目信息和安排,而其他3个部门的用户就只能编辑安排那一部分,而已经发送下一级的项目,都变为不可编辑状态。我在资源里加入一个综合部样式的对话框,想到控件有可以隐藏和禁用的操作,所以这个控件的问题应该不算太难…… 但是这个所谓的不太难,难度还不太小。 我用管理界面的对话框类ManagementMain 生成对话框:ManagementMain dlg; dlg.DoModal(); 这样的结果就是,我设计的对话框是怎样,它出来就是怎样……那要在哪里判断用户后做不同的显示呢?那我就给ManagementMain 添加一个成员变量,int m_flg; 然后再在构造函数里给它初始化m_flg=0; 如果是经营部登陆,那么ManagementMain dlg; dlg.m_flg=1;//隐藏部分控件dlg.DoModal(); 然后在构造函数里判断做不同的显示: if(m_flg==1)//为经营部登陆,则隐藏归档要求那两个控件,否则禁用项目信息的控件 { m_CtrFileRequire.ShowWindow(false); m_CtrFilingRequire.ShowWindow(false); } else { GetDlgItem(IDC_ProjectNum)->EnableWindow(FALSE); GetDlgItem(IDC_ProjectName)->EnableWindow(FALSE); GetDlgItem(IDC_ProjectAddr)->EnableWindow(FALSE); GetDlgItem(IDC_ClientAddr)->EnableWindow(FALSE); GetDlgItem(IDC_ClientPerson)->EnableWindow(FALSE);

MFC界面美化

SDI和MDI程序中对非客户区(标题栏、左右下边界)的美化 基本思路是重载CMainFrame类的DefWindowProc()函数,并判断消息为:WM_NCPAINT,WM_NCACTIV ATE,WM_NOTIFY的时候,调用自己的绘制窗口标题栏的函数。用GetSystemMetrics(SM_CSFRAME)和GetSystemMetrics(SM_CYFRAME)可以取得标题栏的左上角的坐标。最大化,最小化的按钮自己画,如果不是在标准的位置,一定要记录下他们的位置,并且在WM_NCLBUTTONDOWN消息处理函数中判断是否是点击了按钮,以做出相应的处理。系统图标也可以自己重新画。 主要任务有贴图(包括标题栏、左边界、右边界、下边界、系统图标、最大化、最小化、关闭按钮)、处理消息(屏蔽系统自带按钮、双击状态栏改变大小、鼠标停放在三个自绘按钮上时改变按钮图标、单击自绘按钮时作出相应反应)。 一、响应的消息及重载的函数 响应的消息及重载的函数都在CMainFrame类中。响应DefWindowProc函数,在其中判断消息是不是WM_NCPAINT、WM_MOVE、WM_NCACTIV ATE、WM_NOTIFY,若是则重画标题栏、左框架、右框架、下框架、最大化、最小化、关闭按钮(放在一个函数里)。 响应消息WM_NCHITTEST,使鼠标位于自绘按钮时返回相应hittest值,同时屏蔽自带按钮的鼠标事件。简言之,当鼠标位于自绘按钮时,让系统误以为鼠标位于相应按钮,而当鼠标位于系统自带按钮时,让系统误以为鼠标只是位于标题栏。自绘图标与之类似,不再赘述。 响应消息WM_NCMOUSEMOVE,判断光标是不是位于自绘最大化、最小化、关闭按钮区域,如是则重画相应的按钮。 响应消息WM_NCLBUTTONDOWN,判断单击左键时鼠标是否位于自绘制的最大化、最小化、关闭按钮或图标区域,如是则执行相应的按钮操作。 响应消息WM_NCLBUTTONDBCLK,使双击标题栏时窗口能最大化或还原。 二、主要函数 LRESULT CMainFrame::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam),在此函数内判断WM_NCPAINT、WM_MOVE、WM_NCACTIV ATE、WM_NOTIFY 消息,自绘框架。

MFC界面设计

MFC界面设计 前两天boss让写写界面,看程序看的头晕脑转,就在网上瞎搜搜,写些关于MFC的界面设计。 包括:窗体背景图、窗体大小、按钮背景图、控件透明、编辑框重影、exe图标、托盘程序。 下面逐一代码解析: 窗体背景图: 背景图,要在OnPaint() 函数中进行修改。窗体不再使用默认,在else中添加代码[cpp] view plaincopyprint? //改变窗体大小 MoveWindow(0,0,500,400,TRUE); //设置背景 CPaintDC dc(this); CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP2);//在资源里添加的位图名 CBrush brush; brush.CreatePatternBrush(&bitmap); CBrush* pOldBrush = dc.SelectObject(&brush); dc.Rectangle(0,0,600,400); //宽、长;

dc.SelectObject(pOldBrush); //CDialog::OnPaint(); 按钮背景图:[cpp] view plaincopyprint? CBitmapButton m_BitmapButton;//声明按钮位图对象实现代码:[cpp] view plaincopyprint? //按钮添加图片 m_BitmapButton.LoadBitmaps(IDB_BITMAP1);//位图名称 m_BitmapButton.SubclassDlgItem(IDC_BConn,this);//按钮ID,句柄 m_BitmapButton.SizeToContent();//把按钮设置成位图大小 控件透明: 重载OnCtlColor函数。 有的控件需要修改OwnerDraw属性为True。[cpp] view plaincopyprint? afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);//透明添加消息函数:[cpp] view plaincopyprint?

我整理的MFC界面美化

一,对话框背景为一幅位图 1.插入位图 打开VC6.0MFC程序,右击“Dialog”,打开“引入”,选择图片就可以引入一个位图了。 2.打开“ClassView”,再打开“CAbouttDlg()”函数,找到void CTuxingDlg::OnPaint()函数, 粘贴上 CPaintDC dc(this); CRect rect; GetClientRect(&rect); CDC dcMem; dcMem.CreateCompatibleDC(&dc); CBitmap bmpBackground; bmpBackground.LoadBitmap(IDB_BITMAP1); //IDB_BITMAP1是你自己的图对应的ID BITMAP bitmap; bmpBackground.GetBitmap(&bitmap); CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground); dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0, bitmap.bmWidth,bitmap.bmHeight,SRCCOPY); 二.在对话框上显示一幅位图 法一:把图片引入工程,其句柄名为IDB_BITMAP2;然后放一个静态控件或者图片控件到对话框上,将其句柄名设为IDC_SHOWBMP; 具体代码为在需要使用的地方(如按钮函数或OnInitDialog()或OnPaint()里等等)加入如下代码: CStatic *p =(CStatic *)GetDlgItem(IDC_SHOWBMP); HBITMAP hBitmap=::LoadBitmap(AfxGetResourceHandle(),MAKEINTRESOURCE(IDB_BITMAP2)); p->ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE); p->SetBitmap(hBitmap); 详解: CStatic *p =(CStatic *)GetDlgItem(IDC_SHOWBMP); //获得指向IDC_SHOWBMP的指针,并将其强制转换为CStatic*类型,并赋值给p HBITMAP hBitmap=::LoadBitmap(AfxGetResourceHandle(),MAKEINTRESOURCE(IDB_BITMAP2));

C _MFC快速超简单入门

C++MFC快速超简单入门学习 注意:红色字体为重要的信息,必须理解并记住。 在学习MFC之前,你必须对C++的“类和对象有一定的认识和理解,因为MFC就是C++完全的面向对象设计,它里面封装了好多类,我们只要调用就OK,就像C语言调用库函数一样,直接使用,这就是C++ 第一特性:封装性,第二性就是继承与派生, 这个在MFC中体现得淋淋至间(字打错了)。如果不懂,我再来解释一下,例:有一个商品类,class GOODS商品属性有名字,价格 它可作为一个基类,我可以派上出苹果类,class Apple:public GOODS.苹果属性出了继承了商品的属性名字,价格之外,还可派生出,颜色,等属性,继承与派生就是一个是另一个的子集,但是这个子集不仅包括父集的特征,还具有一些新的特性,懂了吧,这样。MFC其中重要的类是:CDialog对话框类,CEdit,(编辑框 类)CButton,(按钮类)CRadio(单选钮类),这些都是作为基类,由我们自己定义的类去派生它们。 好了,现在先了解一下什么是MFC吧,请看当前目录下的MFC入门知识的幻灯片1—20张,或大概的浏览一下当前目录下的其它连个word文件,后面的幻灯片我觉得没必要看了,因为是快速吗,节约时间,(首先看不懂没关系,)但但看完之后,必须掌握如下知识: 1.MFC是作什么用的?与以前我们写的C,C++语言有什 么不同。以及它的一些优点, 不同,以前的是控制台的界面不好看,不友好,操作不 方便,黑框框的一片。 MFC反之。 优点:可用极少的代码实现强大的功能, 2.关于MFC的一些术语,概念啊

3.你要知道MFC的对话框是由控件组成的,具有 哪些控件(例按钮:Button,单选钮:radio,Edit)例:要知道MFC的编程的原则,也就是宗旨理念吧,“消息映射,事件驱动“,这句话要记住并理解,很重要,真的。那到底是什么意思呢? 现实举例:一个人具备一种“感知“的能力,(也可称消息吧),当用火接近这个人时(发生的事件),就会(驱动)这个人做出反应,远离”火“, 用MFC举例:一个按钮有什么消息啊,我可以单击它,所以它具备单击的消息: 第一个就是左键单击的消息,第二个 就是双击的消息,见名思议就OK了。我单击这个按钮要产生某个事件, 我就可以第一步,先给按钮添加一个消息响应函数,意思就是当我单击按钮时,就调用那个函数,按钮时时刻刻都处于待命的状态, 假如添加的函数如下: void CDsDlg::OnButton1() { AfxMessageB ox(“我单击了这个按钮”);

MFC界面美化攻略

MFC界面美化攻略 资源文件: Bitmap:PS里输出24位windows的BMP图片Cursor:光标可以自绘 Wave: WMV格式的声音文件 ICON:这个网上可以转化 1.字体: 面板属性里更改 2.Edit控件文字颜色:添加CtlColor(),增添 if (IDC_STATIC == pWnd->GetDlgCtrlID())//判断正在绘制的是不是指定的控件 { pDC->SetTextColor(RGB(0, 0, 255));//设置它的文本显示 }

3.背景图片: 增添Paint()函数,else后修改为 //CDialogEx::OnPaint(); 这句话注释掉 CPaintDC dc(this); CRect rect; GetClientRect(&rect); CDC dcMem; dcMem.CreateCompatibleDC(&dc); CBitmap bmpBackground; bmpBackground.LoadBitmap(IDB_BITMAP1); BITMAP bitmap; bmpBackground.GetBitmap(&bitmap); CBitmap *pbmpOld = dcMem.SelectObject(&bmpBackground); dc.StretchBlt(0, 0, rect.Width(), rect.Height(), &dcMem,0, 0,bitmap.bmWidth, bitmap.bmHeight, SRCCOPY); 4.背景音乐: 添加头文件 #include

MFC中用户界面元素更新原理(UPDATE_COMMAND_UI)

大家在编程的过程中一定遇到过这种情况:需要根据某个变量的值来设定菜单项是否被选中,设置工具栏按钮是否被按下或者在状态栏中显示一些信息。MFC提供了一种机制来帮助我们完成这项工作:只要用ClassWizard给相应的菜单项或者工具栏按钮添加一个UPDATE_COMMAND_UI处理函数,在其中用CcmdUI::SetCheck等函数来设置这些用户界面元素的状态就可以了。但是MFC 是怎么实现这个功能的呢? 首先让我们来看看菜单状态更新的实现方法。首先要知道,当你点现了一个有子菜单的菜单项时(比如菜单栏上的“文件”),系统会向拥有这个菜单的窗口发送一个WM_INITMENUPOPUP,下面是MFC对这个消息的默认处理:void CFrameWnd::OnInitMenuPopup(CMenu* pMenu, UINT nIndex, BOOL bSysMenu){ //为了说明问题,我省略了很多代码 CCmdUI state; state.m_pMenu = pMenu; state.m_nIndexMax = pMenu->GetMenuItemCount(); for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax;state.m_nIndex++){ state.m_nID = pMenu->GetMenuItemID(state.m_nIndex); if (state.m_nID == (UINT)-1) { //m_nID==-1表示它下面还有popup menu(就那种带右箭头的菜单项), //它是不会自动deisable的 } else { state.m_pSubMenu = NULL; state.DoUpdate(this, m_bAutoMenuEnable && state.m_nID < 0xF000); }

VC之美化界面篇

VC之美化界面篇 本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者。读者最好具有以下VC基础: 1. 大致了解MFC框架的基本运作原理; 2. 熟悉Windows消息机制,熟悉MFC的消息映射和反射机制; 3. 熟悉OOP理论和技术; 本文根据笔者多年的开发经验,并结合简单的例子一一展开,希望对读者有所帮助。 正文 1. 美化界面之开题篇 相信使用过《金山毒霸》、《瑞星杀毒》软件的读者应该还记得它们的精美界面: 图1 瑞星杀毒软件的精美界面 程序的功能如何如何强大是一回事,它的用户界面则是另一回事。千万不要忽视程序的用户界面,因为它是给用户最初最直接的印象,丑陋的界面、不友好的风格肯定会影响用户对软件程序的使用。 “受之以鱼,不若授之以渔”,本教程并不会向你推荐《瑞星杀毒软件》精美界面的具体实现,而只是向你推荐一些常用的美化方法。 2. 美化界面之基础篇 美化界面需要先熟悉Windows下的绘图操作,并明白Windows的幕后绘图操作,才能有的放矢,知道哪些可以使用,知道哪些可以避免…… 2.1 Windows下的绘图操作 熟悉DOS的读者可能就知道:DOS下面的图形操作很方便,进入图形模式,整个屏幕就是你的了,你希望在哪画个点,那个地方就会出现一个点,红的、或者黄的,随你的便。你也可以花点时间画个按钮,画个你自己的菜单,等等…… Windows本身就是图形界面,所以Windows下面的绘图操作功能更丰富、简单。要了解Windows下的绘图操作,要实现Windows界面的美化,就必须了解MFC 封装的设备环境类和图形对象类。 2.1.1 设备环境类

Windows下的绘图操作说到底就是DC操作。DC(Device Context设备环境)对象是一个抽象的作图环境,可能是对应屏幕,也可能是对应打印机或其它。这个环境是设备无关的,所以你在对不同的设备输出时只需要使用不同的设备环境就行了,而作图方式可以完全不变。这也就是Windows的设备无关性。 MFC的CDC类封装了Windows API 中大部分的画图函数。CDC的常见操作函数包括: Drawing-Attribute Functions:绘图属性操作,如:设置透明模式 Mapping Functions:映射操作 Coordinate Functions:坐标操作 Clipping Functions:剪切操作 Line-Output Functions:画线操作 Simple Drawing Functions:简单绘图操作,如:绘制矩形框 Ellipse and Polygon Functions:椭圆/多边形操作 Text Functions:文字输出操作 Printer Escape Functions:打印操作 Scrolling Functions:滚动操作 *Bitmap Functions:位图操作 *Region Functions:区域操作 *Font Functions:字体操作 *Color and Color Palette Functions:颜色/调色板操作 其中,标注*项会用到相应的图形对象类,参见2.1.2内容。 2.1.2 图形对象类 设备环境不足以包含绘图功能所需的所有绘图特征,除了设备环境外,Windows还有其他一些图形对象用来储存绘图特征。这些附加的功能包括从画线的宽度和颜色到画文本时所用的字体。图形对象类封装了所有六个图形对象。 下面的表格列出了MFC的图形对象类: MFC类图形对象句柄图形对象目的 CBitmap HBITMAP 内存中的位图 CBrush HBRUSH 画刷特性—填充某个图形时所使用的颜色和模式 CFont HFONT 字体特性—写文本时所使用的字体 CPalette HPALETTE 调色板颜色 CPen HPEN 画笔特性—画轮廓时所使用的线的粗细 CRgn HRGN 区域特性—包括定义它的点 表1 图形对象类和它们封装的句柄 使用CDC和图形对象类,在Windows里绘图还算是很简单的。观察以下的画面:

相关主题