Visual C++第07章 图形、文本和位图
- 格式:doc
- 大小:559.50 KB
- 文档页数:42
实验1 Visual C++图形程序设计一、实验目的Visual C++是在Microsoft C的基础上发展而来的,随着计算机软、硬件技术的快速发展,如今Visual C++已成为集编辑、编译、运行、调试于一体功能强大的集成编程环境。
本章以Visual C++ 6.0为对象,主要介绍Visual C++集成编成环境的使用、图形设备接口和常用图形程序设计、鼠标编程以及菜单设计等基础,目的是通过对Visual C++的学习,掌握Visual C++图形程序设计的方法,为计算机图形学原理部分的算法实现提供程序工具和方法。
二、实验任务1.学习Visual C++图形程序设计的方法;2.掌握Visual C++集成编成环境的使用、图形设备接口和常用图形程序设计、鼠标编程、橡皮筋交互技术、画刷与画笔以及菜单设计等;三、基础知识和实验步骤3.1 Visual C++ 6.0应用程序开发方法介绍Visual C++ 6.0集成开发环境,以一个简单的实例介绍利用Visual C++应用程序工程建立方法和程序设计框架。
3.1.1 Visual C++的集成开发环境从开始菜单中启动Visual C++ 6.0,进入开发集成环境。
打开一个项目后,可以看到Visual C++ 6.0的开发环境由标题栏、工具栏、工作区窗口、源代码编辑窗口、输出窗口和状态栏组成,见图3.1所示。
标题栏用于显示应用程序名和所打开的文件名,标题栏的颜色可以表明对应窗口是否被激活。
菜单栏包括文件、编辑、显示、插入、工程、编译、工具、窗口和帮助九项主菜单,包含了从源代码的编辑、界面设计、程序调试和编译运行在内的所有功能。
工具栏列出了常用的菜单命令功能和对象方法。
工具栏的下面是两个窗口,一个是工作区窗口,用于列出工程中的各种对象,一个是源代码编辑窗口,用于各个对象的程序设计。
输出窗口显示项目建立过程中所产生的各种信息。
屏幕底端是状态栏,它给出当前操作或所选择命令的提示信息。
Visual C++中DDB与DIB位图编程全攻略1. 基本概念先来用通俗的语句讲解位图和调色板的概念。
我们知道,自然界中的所有颜色都可以由红、绿、蓝(R,G,B)三基色组合而成。
针对含有红、绿、蓝色成分的多少,可以对其分别分成0~255个等级,而红、绿、蓝的不同组合共有256×256×256种,因此约能表示1600万种颜色。
对于人眼而言,这已经是"真彩色"了。
对每个像素进行了(R,G,B)量化的图像就是位图,其在计算机中对应文件的扩展名一般为.bmp。
既然用R,G,B的量化值就可以直接记录一张位图的所有像素,那我们需要调色板干什么呢?首先,我们可以计算完全利用(R,G,B)组合来存储一个800×600的位图所需要的空间为:800×600×3 = 1440000(字节)=1.37M(字节)惊人的大!因此,调色板横空出世了,它的功能在于缓解位图文件存储空间过大的问题。
假设一个位图为16色,其像素总数为800×600。
我们只需要用4个bit就可以存储这个位图的每个像素在16种颜色中所处的等级,然后调色板提供了这16种等级对应的(R,G,B)值,这样,存储这个16色位图只需要:800×600×4/8 = 240000(字节)= 0.22 M(字节)额外的存储R,G,B表的开销(即调色板Palette,也称为颜色查找表LUT)仅仅为16×3=48字节。
存储空间被大为减少!常见的位图有单色、16色、256色、16位及24位真彩色5种,对于前三者(即不大于256色)都可以调色板方式进行存储,而对16位及24位真彩色以调色板进行存储是不划算的,它们直接按照R,G,B分量进行存储。
在此基础上我们来分析DDB位图(Device-dependent bitmap,与设备相关的位图)与DIB位图(Device-independent bitmap,与设备无关的位图)的概念以及二者的区别。
用Microsoft Visual C++显示位图图片的几种方法总结一,用控件框架作为装载位图的容器来显示位图用控件作为容器框架来显示位图是很多应用程序中都会遇到和用到的,因为它的方便可控制性1)、首先,我们先了解几个用到的函数:1、CWnd::GetDlgItemCWnd* GetDlgItem( int nID ) const;void CWnd::GetDlgItem( int nID, HWND* phWnd ) const;返回值:指向给定的控件或子窗口的指针。
如果没有控件具有nID给出的整数ID,则返回NULL。
返回的指针可能是临时的,不能被保存以供将来使用。
参数:nID 指定了要获取的控件或子窗口的标识符。
phWnd 指向子窗口的指针。
说明:这个函数获得对话框或其它窗口中指定控件或子窗口的指针。
返回的指针通常被强制转换为nID所标识的控件类型。
2、CWnd::GetDCCDC* GetDC( );返回值:如果调用成功,则返回CWnd客户区的设备环境;否则,返回NULL。
这个指针可能是临时的,不能被保存以供将来使用。
说明:这个函数获得一个指针,指向一个客户区的公用的、属于类的或者私有的设备环境,依赖于为CWnd指定的类风格。
对于公用的设备环境,GetDC每次获得设备环境时都给它赋予缺省值。
对于属于类的或者私有的设备环境,GetDC保持原来的属性不变。
在随后的图形设备接口(GDI)函数中可以使用设备环境以在客户区中绘图。
除非设备环境属于一个窗口类,否则在绘图之后必须调用ReleaseDC成员函数以释放设备环境。
由于在同一时刻只有五个公用设备环境可供使用,因此如果释放设备环境时失败,可能导致其它应用程序不能访问设备环境。
如果在注册窗口类的时候,在WNDCLASS的风格中指定了CS_CLASSDC,CS_OWNDC或CS_PARENTDC,则GetDC成员函数将返回属于CWnd类的设备环境。
第7章绘图、字体和位图Windows的GDI(设备图形接口),提供了绘图的基本工具,如:画点、线、多边形、位图以及文本输出等。
MFC的设备环境类CDC封装了全部的绘图函数,使得绘制的图形即可以显示,又可以打印。
7.1概述Visual C++的CDC(Device Context,设备环境)类是MFC中最重要的类之一,它封装了绘图所需要的操作,是用户编写图形和文字处理程序必不可少的。
当然,绘制图形和文字时还必须指定相应的设备环境。
设备环境是由Windows保存的一个数据结构,该结构包含应用程序向设备输出时所需要的信息。
1、设备环境类CDC设备环境是由Windows保存的一个数据结构,该结构包含应用程序向设备输出时所需要的信息,例如:图形是在屏幕上显示还是通过打印机输出。
为了能让用户使用一些特殊的设备环境,基类CDC还派生了以下各类:(1)CPaintDC类,此类比较特殊,它的构造函数和析构函数都是针对OnPaint进行的。
用户一旦获得相关的CDC指针,就可以将它当做任何设备环境(包括屏幕、打印机)指针来使用,CPaintDC类的构造函数会自动调用BeginPaint,而它的析构函数则会自动调用EndPaint。
(2)CClientDC和CWindowDCA、CClientDC只能在窗口的客户区(不包括边框、标题栏、选单栏以及状态栏)进行绘图,点(0,0)通常指的是客户区的左上角。
其构造函数调用GetDC,析构函数调用ReleaseDC函数B、CWindowDC允许在窗口的任意位置中进行绘图,点(0,0)指整个窗口的左上角。
其构造函数调用GetWindowDC,析构函数调用ReleaseDC函数。
(3)CMetaFileDC封装了在一个Windows图元文件中绘图的方法。
图元文件是一系列与设备无关的图片的集合,由于它对图像的保存比像素更精确,因而往往在要求较高的场合下使用,例如:AutoCAD的图像保存等。
目前的Windows已使用增强格式(enhanced-format)的32位图元文件来进行操作。
7.1.2坐标映射在讨论坐标之前,先看下列语句:pDC->Rectangle(CRect(0,0,200,200));这是在某个设备环境中绘制一个高为200个像素,宽也为200个像素的方块。
由于默认的映射模式是MM_TEXT,其逻辑坐标(在各种映射模式下的坐标)和设备坐标(显示设备或打印设备坐标系下的坐标)相等。
因此这个方块在1024*768的显示器上看起来要比在640*480的显示器上显得小一些,而且若将它打印在600dpi 精度的激光打印机上,这个方块就会显得更小了。
为了能保证打印的结果不受设备的影响,Windows定义了一些映射模式(如下所示):这些映射决定了设备坐标和逻辑坐标之间的关系。
映射模式含义MM_TEXT 每个逻辑单位等于一个设备像素,x向右为正,y向下为正MM_HIENGLISH 每个逻辑单位为0.001英寸,x向右为正,y向上为正MM_LOENGLISH 每个逻辑单位为0.01英寸,x向右为正,y向上为正MM_HIMETRIC 每个逻辑单位为0.01mm,x向右为正,y向上为正MM_LOMETRIC 每个逻辑单位为0.1mm,x向右为正,y向上为正MM_TWIPS每个逻辑单位为一个点的1/20(一个点是1/72英寸),x向右为正,y向上为正MM_ANISOTRPIC x,y 可变比例MM_ISOTROPIC x,y 等比例这样,我们就可以通过调用CDC::SetMapMode(int nMapMode)来设置相应的映射模式。
例如:若将映射模式设置为MM_LOMETRIC,那么不管在什么设备中调用上述语句,都将显示出20*20mm的方块。
而MM_ISOTROPIC映射模式下:纵横比总是1:1,也就是说,无论比例因子如何变化,圆总是圆的。
但,MM_ANISOTROPIC映射模式下,x和y的比例因子可以独立地变化,即圆可以被拉扁成椭圆形状。
在映射模式MM_ANISOTROPIC和MM_ISOTROPIC中,常常可以调用CDC::SetWindowExt(设置窗口大小)和CDC::SetViewportExt(设置视口大小)函数来设置所需要的比例因子。
“窗口”和“视口”的概念往往不易理解。
所谓“窗口”,可以理解是一种逻辑坐标下的窗口,而“视口”是我们实际看到的那个窗口,也就是设备坐标下的窗口,根据“窗口”和“视口”的大小就可以确定x和y的比例因子,它们的关系如下:x比例因子=视口x大小/窗口x大小y比例因子=视口y大小/窗口y大小例:将一个椭圆绘制在视窗中央,且当视图的大小发生改变时,椭圆的形状也会随之改变。
(301页)(通过设置窗口和视口大小来改变显示的比例)(1)建一个单文档应用程序,名为“椭圆的绘制”(2)在View类的OnDraw函数里加如下代码:void CMyView::OnDraw(CDC* pDC){//CMyDoc* pDoc = GetDocument();//ASSERT_V ALID(pDoc);CRect rectClient;//定义矩形对象GetClientRect(rectClient);//获得当前窗口的客户区大小pDC->SetMapMode(MM_ANISOTROPIC);//设置MM_ANISOTROPIC映射模式pDC->SetWindowExt(1000,1000);//设置窗口范围pDC->SetViewportExt(rectClient.right,-rectClient.bottom);//设置视口范围pDC->SetViewportOrg(rectClient.right/2,rectClient.bottom/2);//设置视口原点pDC->Ellipse(CRect(-500,-500,500,500));//椭圆的4个坐标点// TODO: add draw code for native data here}(3)编译运行,当你改变窗口大小,椭圆也随之改变。
7.1.3 CPoint、CSize和CRect在图形绘制操作中,常常需要使用MFC中的CPoint(点)、CSize(大小)和CRect(矩形)等简单数据类。
它们是对Windows的POINT、SIZE和RECT结构的封装,因此它们可以直接使用各自结构的数据成员,如下所示:(302--305)typedef struct tagPOINT{ LONG x; //点的x坐标LONG y; //点的y坐标}POINT;Typedef struct tagSIZE{ int cx; //水平大小(表示矩形的宽度)int cy; //垂直大小(表示矩形的高度)}SIZE;typedef struct tagRECT{ LONG left; //矩形左上角点的x坐标LONG top; //矩形左上角点的y坐标LONG right; //矩形右下角点的x坐标LONG bottom;//矩形右下角点的y坐标}RECT;1、CPoint,CSize和CRect类的构造函数CPoint类带参数的常用构造函数原型如下:CPoint(int initX,int initY);CPoint(POINT initPt);其中:initX和initY分别用于指定CPoint的成员x和y的值。
initPt用于指定一个POINT结构或CPoint对象来初始化CPoint的成员。
CSize类带参数的常用构造函数原型如下:CSize(int initCX,int initCY);CSize(SIZE initSize);其中:initCX和initCY用于分别设置CSize的cx和cy成员。
initSize用于指定一个SIZE结构或CSize对象来初始化CSize的成员。
CRect类带参数的常用构造函数原型如下:CRect(int l,int t,int r,int b);CRect(const RECT &srcRect);CRect(LPCRECT lpSrcRect);CRect(POINT point,SIZE size);CRect(POINT topLeft,POINT bottomRight);其中:l,t,r,b分别用于指定CRect的left,top,right和bottom成员的值。
srcRect和lpSrcRect分别用于用一个RECT结构或指针来初始化CRect的成员。
Point用于指定矩形的左上角位置。
Size用于指定矩形的长度和宽度。
topLeft和bottomRight 分别用于指定CRect的左上角和右下角的位置。
2、CRect类的常用操作由于一个CRect类对象包含用于定义矩形的左上角和右下角点的成员变量,因此在传递LPRECT、LPCRECT或RECT结构作为参数的任何地方,都可以使用CRect对象来代替。
当构造一个CRect 时,要使它符合规范。
也就是说,使其left小于right,top 小于bottom例如,若左上角为(20,20),而右下角为(10,10),那么定义的这个矩形就不符合规范。
一个不符合规范的矩形,CRect的许多成员函数都不会有正确的结果。
因此,常常使用CRect::NormalizeRect函数使一个不符合规范的矩形合乎规范。
CRect类的操作函数有很多,这里只介绍矩形的扩大、缩小以及2个矩形的“并”和“交”操作,更多的常用的成员函数如下所示:CRect类常用的成员函数成员函数功能说明int Width()const; 返回矩形的宽度int Height()const; 返回矩形的高度CSize Size()const; 返回矩形左下角的点坐标CPoint &BottomRight 返回矩形右下角的点坐标CPoint CenterPoing()const 返回CRect的中点坐标BOOL IsRectEmpty()const 如果一个矩形的宽度或高度是0或负值,则称这个矩形为空,返回TRUEBOOL IsRectNull()const; 如果一个矩形的上、左、下和右边的值都等于0,则返回TRUE BOOL PtInRect(POINT point)const;如果点point位于矩形中(包括点在矩形的边上)则返回TRUEvoid SetRect(int x1,int y1,int x2,int y2);将矩形的各边设为指定的值,左上角点为(x1,y1),右下角点为(x2,y2)void SetRectEmpty(); 将矩形的所有坐标设置为0void NormalizeRect();使矩形符合规范如:左上角为(10,10),右下角为(20,20)是规范的。