图形图像基础知识

1 图形图像基础知识
  1.1 GDI:图形设备接口(GDI),表示的是一个抽象的接口。换句话说,也就是相当于一个关于图形显示的函数库。
  1.2 设备环境DC
       设备环境DC(Device Context 又称设备上下文,也称设备描述表)实际上就是一个关于如何绘制图形的方法的集合。用户在绘图之前,必须获取绘图
            窗口区域的一个设备环境DC。接着才能进行GDI函数的调用,执行适合于设备环境DC的命令。获取DC时,用户不必关心大多数的属性,因为windows
        初始化了一套完整的属性和对象集合,用户可以使用它们渲染显示。同时,为了创建自己应用程序的特定显示,还可以更改这些属性和对象。为了便
        于理解,请看下面的例子:Windows缺省的DC包括了一个黑色画笔,任何所绘制的线条都是黑色的。如果用户想绘制其他颜色的线条,必须用另一种所
        需颜色的画笔代替缺省的画笔。新颜色的画笔可在程序中建立并写入设备描述表。在Windows编程术语中,给DC提供新对象的操作被称为将绘图对象选
        取到DC中。另外,应该注意的是,Windows的设备环境是GDI的关键元素,它代表了不同的物理设备。分为4种类型:显示器型,打印机型,内存型和信息
        型。每种类型的设备环境都有各自的特定用途。
          ------------------------------------------------------------
              设备环境                        用途
      ------------------------------------------------------------    
             显示器型                 支持视频显示器上的绘图操作
             打印机型                 支持打印机和绘图仪上的绘图操作
             内存型                   支持位图上的绘图操作
             信息型                   支持设备数据的访问
      ------------------------------------------------------------
        
  1.3 设备环境类
      基类CDC包含了绘图所需要的所有成员函数(包括部分虚函数),并且除了CMetaFileDC类之外,所有派生类均只有构造函数和析构函数的定义有所不同。
      提出这些派生类的目的就是为了在不同的设备上进行显示。
          若用户(或应用程序框架)需要构造派生的设备环境类对象,就可以将CDC指针传给诸如OnDraw之类的函数。对于用屏幕进行显示来说,常用的CDC
       派生类有CClientDC和CWindowDC,而对于用其他的设备进行显示来说(如打印机或内存缓冲区),则可以直接构造一个基类CDC的对象。
               CDC类的派生类简介
       -------------------------------------------------------------------------------------------
           派生类名称                     说明
       --------------------------------------------------------------------------------------------
          CClientDC                  这是一个设备描述表,提供对窗口客户区域的图形访问。在窗口中画图时
                                      可使用此类DC,但对WM_PAINT Windows消息除外。
          CMetaFileDC                这个设备描述表代表Windows元文件,它包含一系列命令已重新产生图像。
                                      想要创建独立于设备的文件时可使用此类DC,用户可以回放这种文件来创建
                                      图像
          CPaintDC                   这是创建响应WM_PAINT Windows消息的设备描述表。应用程序可以使用此DC
                   更新Windows显示,通常在MFC应用程序的OnPaint()函数中使用。
          CWindowDC                  可以提供在整个窗口(包括客户区和非客户区)中画图的设备描述表。
       --------------------------------------------------------------------------------------------
       那么,这几种派生的DC类之间到底存在着什么区别呢?下面我们就通过比较,具体的介绍这几种DC类之间存在的差别:
        CWindowDC类与CPaintDC和CClinetDC类的区别的一个方面是:用CPaintDC类和CClientDC类的对象绘制图形时,绘制区只
       能是客户区,而不能在非客户区,而CWindowDC可以在非客户区进行图形绘制。那么,什么是客户区和非客户区呢?
       应用程序的标题栏、菜单栏、工具栏和状态栏是非客户区,中间区域为客户区。CWindowDC一般在框架窗口类中(CMainFrame)
       引用,在视图窗口中引用CWindowDC类时,由于视图类只能管理客户区,所以并不能在非客户区进行绘制。他们之间区别的另
       一个方面是:在CWindowDC绘图类下,坐标系是建立在整个屏幕上的,在像素坐标方式下,坐标原点在屏幕上的左上角,而在
       CPaintDC和CClientDC绘图类下,坐标系是建立在客户区上的,在像素坐标方式下,坐标原点在客户区的左上角。


      1.1.3.3 CDC类的具体应用
              显示器设备环境:CWnd::GetDC()、CWnd::GetDCEx()或CWnd::BeginPaint()的调用。应用程序就可以检取指定窗口的工作
           区的显示器设备环境的句柄,可以在后续的GDI函数中使用该显示器设备环境在窗口工作区中画图。在画图完之后,应用程序
           应该调用CWnd::ReleaseDC()和CWnd::EndPaint函数来释放设备句柄。
                对于打印机设备环境,应用程序是通过调用CWnd::CreateDC()函数来创建的。使用完毕后,应该调用CWnd::DeleteDC()
            函数来删除它。关于图形打印方面的知识,在后面的章节中将给出更详细的介绍。
                内存设备环境是通过调用CWnd::CreateCompatibleDC()函数来创建的,它将创建一个与指定设备有兼容颜色格式的位图,
            内存设备环境也常被称为兼容设备环境。
       GetDC()函数
           GetDC()函数用于获取指定窗口的工作区的显示器设备环境,其原型声明如下:
              CDC* CWnd::GetDC()
       ReleaseDC()函数
          ReleaseDC()用于释放一个设备环境,以便该设备环境可以被其他应用程序申请使用。其原型声明如下:
              int ReleaseDC(CDC* pDC)
            其中pDC为待释放的设备环境的指针。
       对于每个由GetWindowDC()成员函数和GetDC()成员函数所获取的设备环境,必须调用ReleaseDC()成员函数来释放。

       BeginPaint()函数
            BeginPaint函数为在指定的窗口中画图做准备工作,并且把与绘图有关的信息填写到PAINTSTRUCT结构中,其原型声明如下:
          CDC* CWnd::BeginPaint(LPPAINTSTRUCT lpPaint)
            其中lpPaint参数是指向PAINTSTRUCT结构的指针。若函数调用成功,则返回指定窗口的显示器设备环境的指针,否则返回NULL。
    PAINTSTRUCT结构包括了绘图操作有关的各种信息,它的定义如下:
               typedef struct tagPAINTSTRUCT{
                   HDC hdc;
                   BOOL  fErase;
                   RECT  rcPaint;
                   BOOL  fRestore;
                   BOOL fIncUpdate;
                   BYTE rgbReserved[16];
              }PAINTSTRUCT;
            在该结构中,hdc成员变量表示显示器设备环境句柄,fErase成员变量用于指定是否要檫除背景,而成员变量rcPaint则指定了需要绘图的
        屏幕矩形。其余成员变量保留给Windows内部使用。
            EndPaint()函数
        EndPaint()函数是用来结束指定窗口中的绘图过程,其原型声明如下:
           void EndPaint(LPPAINTSTRURCT lpPaint);
          其参数的含义与BeginPaint函数中的相同,返回值总是TRUE。
             注意,使用EndPaint()函数,可以只更新窗口工作区中的部分区域(由InvalidateRect()函数或InvalidateRgn()函数设定的,也可以在窗口
       改变尺寸,移动,滚动等影响工作区的操作之后,由系统设定更新区域。)这样一来,就比重画整个屏幕要快。因此BeginPaint()函数和EndPaint
     函数总是被用来响应WM_PAINT消息。
              selectObject()函数
          SelectObject()函数用于位图、画笔、画刷等GDI对象选入设备环境中,用新的对象替换同一类型的老对象。其原型声明如下:
                CPen* SelectObject(CPen* pPen);
                CBrush  SelectObject(CBrush* pBrush);
                virtual CFont* SelectObject(CFont* pFont);
                CBitmpa* SelectObject(CBitmap* pBitmap);
               int SelectObject(CRgn* pRgn);
             该函数把一个对象选入设备环境。CDC类专门为特定类型的GDI对象提供了5种版本,包括画笔、画刷、字体、位图、区域。新入选的对象
         将替代同一类型的先前对象。例如:若SelectObject()函数的pObject指向一个CPen对象,函数将以pObject指向的画笔替代当前的画笔,并
        成为当前画笔。具体使用方法可以参见后面的例子。
             另外,Windows系统中预定一些标准绘图工具(以宏的形式代替),需要使用成员函数SelectStockObject()进行调用,关于该函数的具体
         声明和使用方法,下一节中有详细的介绍。
              DeleteObject()函数
           DeleteObject()函数可以删除逻辑画笔、画刷、字体、位图、区域或调色板对象,并释放所有与该对象相关的系统资源,当对象被删除
         之后,则指定的对象句柄无效。其原型声明如下:
               BOOL DeleteObject(HGDIOBJ hObject);
             其中参数hObject为逻辑画笔、画刷、字体、位图、区域或调色板对象的句柄。如果函数调用成功,则返回非零值;如果指定的是无
         效句柄或是正在设备中使用,那么则返回零值。
             注意:当某个绘图对象正在设备环境中使用时,就不能删除对象。

    1.1.4  GDI对象
             GDI是一个含有与各种图形操作有关的函数集。在Windows应用程序中绘制或编辑图形时可以调用这些函数。因为,在Windows屏幕上看
          到的任何东西都是图形,所以在应用窗口中每次进行显示和编辑操作时,都必须调用特定的GDI函数。
              Windows的GDI对象类型是通过MFC库中的类来表示的,其中CGdiObject类正是所有GDI对象的抽象基类,其派生类包括CBitmap类,
          CBrush类,CFont类,CPen类,CRgn类和CPalette类。这些派生类对于绘制图形和图像来说都是非常重要的,编程者经常要使用这些类来创
          建绘图工具,而很少使用基类CGdiObject。
                void CMyView::OnDraw(CDC* pDC)
                {
                   CPen NewPen(PS_SOLID,1,RGB(0,0,0));
                   CPen* pOldPen = pDC->SelectObject(&NewPen);
                   pDC->SelectObject(pOldPen); // 恢复旧画笔
                   
                }

        1.1.5 使用库存GDI对象
              在Windows中包含了一库存的GDI对象。这些库存对象是通过一些预定义的宏来表示的。由于它们是Windows系统的一部分,因此用户
          在使用以后无需删除它们。(Windows对任何删除库存GDI对象的动作将不予理会。)MFC库函数SelectStockObject()可以把一个库存对象
          选进设备环境中,并返回原先被选中的对象的指针,同时是该对象被分离出来。
             virtual CGdiObject* SelectStockObject(int nIndex);
           返回值:
               如果函数调用成功,则返回一个被代替的CGdiObject对象的指针,而实际指向的是CPen、CBrush或CFont等类的实例。如果调用不成
            功,则返回值为NULL。
                    nIndex参数的值           
            ---------------------------------------------------------
                    参数值             |   说明
            ---------------------------------------------------------
                    BLACK_BRUSH            黑色画刷
                    DKGRAY_BRUSH           深灰色画刷
                    GRAY_BRUSH             灰色画刷
                    HOLLOW_BRUSH      中空画刷
          LTGRAY_BRUSH      浅灰色色画刷
          NULL_BRUSH              空画刷 
                    WHITE_BRUSH             白色画刷 
                    BLACK_PEN               黑色画刷
                    NULL_PEN                空画笔
                    WHITE_PEN        白色画笔
          ANSI_FIXED_FONT          ANSI标准定义的固定尺寸的系统字体
                    ANSI_VAR_FONT      ANSI标准定义的可变尺寸的系统字体
                    DEVICE_DEFAULT_FONT      设备相关的字体
                    OEM_FIXED_FONT      与OEM相关的固定尺寸的字体
                    SYSTEM_FONT        缺省的系统字体
          SYSTEM_FIXED_FONT     在Window3.0版以前使用的具有固定宽度的系统字体,
          DEFAULT_PALETTE      缺省的颜色调色板,该调色板包含在系统调色板中的
                        20个静态颜色
            ---------------------------------------------------------

 1.1.6 DC与GDI设备之间的关系
       设备环境(DC)和图形设备接口(GDI)是实现计算机绘图的两个重要的组成部分,设备环境(DC)主要定义了绘图的状态和方式,
       而图形设备接口(GDI)则主要定义了采用的绘图工具。打个比方,前者就像画家手里的画笔,而后者就好比画家在什么
       样的画布打算绘制什么图形。
          
 1.2.1 OnDraw成员函数
           在视图内绘图最常用的是使用OnDraw函数。该函数是CView类中的一个虚函数,每次当视图需要重新绘制时,应用程序框架
        都会调用OnDraw函数。当用户改变了窗口尺寸,或者当窗口恢复了先前被遮盖的部分,或者当应用程序改变了窗口数据时,应用
        程序框架都会自动OnDraw函数。
            如果程序中某个函数修改了数据,为了把更改后的数据形象地体现在视图中,则它必须通过调用视图类所继承的Invalidate
        (InvalidateRect)成员函数通知Windows进行重绘窗口。调用Invalidate或InvalidateRect函数后会触发对OnDraw函数的调用。
            下面的OnDraw函数是由AppWizard直接生成的:

 1.2.2 Windows设备环境
        在MFC库中,设备环境是通过C++的CDC类对象来表示的(也就是我们前面提到的),该对象被作为参数(以指针的形式)传递给 
       OnDraw函数。有了这个设备环境指针,人们就可以直接调用CDC类中的成员函数来完成各种各样的绘制工作了。到现在,我们就可
       以将绘图函数加OnDraw函数。下面就是一段加入绘图函数的OnDraw函数:
           

 1.2.3 与绘图相关的GDI对象类
        所谓基本绘图对象类主要包括CBitmap类、CBrush类、CFont类、CPen类、CRgn类和CPalette类。正如上面所提到的,它们都是
      CGdiObject类的派生类。简要介绍如下:
           CBitmap--位图是一种位矩阵,每一个显示像素都对应于其中的一个或多个位。用户可以利用位图来表示图像,也可以利用它来
        创建画刷。
           CBrush--画刷定义了一种位图形式的像素,利用它可对区域内部填充颜色。
           CFont--字体是一种具有某种风格和尺寸的所有字符的完整集合,它常常被当作资源存于磁盘中,其中有一些还依赖于某种设备。
           CPen--画笔是一种用来画线及绘制有形边框的工具,用户可以指定它的颜色及厚度,并且可以指定它画实线、点线或虚线。
           CRgn--区域是由多边形、椭圆或二者组合形成的一种范围,可以利用它来进行填充、裁剪以及鼠标点中测试。
           CPalette--调色板是一种颜色映射接口,它允许应用程序在不干扰其他应用程序的前提下,充分利用输出设备的颜色描绘能力。
        通常情况下,我们都是使用GDI绘图对象类所创建的对象进行绘制各种图形的,就好像画家手里必须拿着画笔才能作画一样。绘图
        对象也就相当于画家手里的画笔,而设备环境如同这支画笔应该被哪个画家(每个画家都有自己的风格)拿着以及在什么样的画
        纸上作画。为了让读者能够更好的理解这部分知识,下面将详细介绍每个GDI对象类是如何创建其绘图对象的及其部分重要的成员
        函数。

 1.3.1 CPen类
       该类封装了Windows图形设备接口(GDI)画笔,主要通过构造函数来创建绘图对象。
 1.3.1.1 构造CPen对象
        CPen();
        CPen(int nPenStyle,int nWidth, COLORREF crColor);
        throw(CResourceException);
        CPen(int nPenStyle,int nWidth,const LOGBRUSH* pLogBrush,int nStyleCount=0,const DWORD* lpStyle=NULL);
        throw(CResourceException);
            
 1.3.1.2 初始化CPen对象
         下面我们将介绍另外几种方法来创建和初始化画笔对象。
           调用 CreatePen(),其原型声明如下:
              BOOL CreatePen(int nPenSytle,int nWidth,COLORREF crColor);
              BOOL CreatePen(int nPenStyle,int nWidth,const LOGBRUSH* pLogBrush,int nStyleCount=0,const DWORD* lpStyle=NULL);
            
 1.3.13 CPen对象应用
          这里使用了32位的COLORREF类型值来确定图形颜色值,其结构为0x00bbggrr,和部分的数据分别如下:
            bb代表蓝色值。范围从00到FF。
            gg代表绿色值。范围从00至FF。
            rr代表红色值。范围从00到FF。

          RGB(short red,short green,short blue)
            red代表红色值,范围从0到255.
            green代表绿色值,范围从0到255.
            blue代表蓝色值,范围从0到255.

1.3.2 CBrush类
        该类封装了Windows的图形设备接口(GDI)刷子。通过该类构造的CBrush对象可以传递给任何一个需要画刷的CDC成员函数。
        该画刷可以是实线、阴影线和某种图案。
     
1.3.2.1  构造CBrush对象
           该类具有4个重载的构造函数,下面分别加以介绍:
       CBrush();
       CBrush(COLORREF crColor);
       CBrush(int nIndex, COLORREF crColor);            
       CBrush(CBitmap* pBitmap);
        第一个构造函数构造 了一支未被初始化的画刷,如果用户使用了该构造函数,则必须对所得到的CBrush对象进行初始化。本小节
      后面将介绍几种初始化的方法。
        
           
         

  
                       

    
                    
              

        

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值