zoukankan      html  css  js  c++  java
  • Windows程序设计零基础自学_5_GDI基础

           前几天学习了windows下程序设计的消息处理机制,同时接着学习了如何处理WM_PAINT消息, 并在第4课中简单的论述了

    滚动条的处理,今天下班后感觉不是特别的累,因此看了看Windows 的GDI的基础内容,下面将晚上学习的总结贴出来,请各位

    大侠批评指正。

         哈哈, 感觉入门以后越往后学就越顺畅,同时感觉难度也在逐渐的增大, 希望可以尽快的把那本书看完,好接下来看看那个关于

    核心编程的书.....

         还不知道怎么用window的IDE编程环境,利用它来绘制应用程序界面, 不过没关系,我想我在看看实例就应该会明白的.....

         闲话少说,下面来看我今天的总结:

    5、 GDI图形基础
        图形设备接口(GDI:Graphics Device Interface)是windows的子系统,负责在标准输出设备和打印机上显示图形。
        1) 应用程序通过GDI显示视觉信息
        2) windows系统本身也使用GDI来显示使用者接口对象: 菜单、滚动条、图标和光标等
    5.1 GDI的结构
        从应用程序的观点来看,GDI由一大堆的系统函数呼叫和相关的数据类型、宏和结构
    5.1.1 GDI原理
        win98和winNT的图形主要由gdi32.dll动态链接库输出的函数来处理;在win98中,GDI32.dll实际上利用16位的gdi.exe
    动态链接库来执行许多函数, 而在NT中,16位的GDI.exe仅用来实现16位的程序。
       
       动态链接库在进行显示的过程中将呼叫显示器或者打印机的驱动程序例程, 显示驱动程序存取显示的控制硬件,打印机驱动程序
    则将GDI命令转换为打印机能理解的代码或者命令。因此不同类型的显示器或打印机需要不同的设备驱动程序。

       GDI的主要目的: 支持与设备无关的图形设计和输出;windows程序应该能够在windows支持的任意输出设备上正确的执行。
       1)图形设备的分类:
          位映像设备:以图点构成的数组来表示图像; 例如:显示卡、点阵打印机和激光打印机
          向量设备:使用线来绘制图像
       2)windows图素坐标系统
          windows默认使用图素坐标系统。
          传统图形语言使用虚拟坐标系: 水平和垂直范围从0 ~ 32767
          WindowsGDI允许使用两种坐标系统之一: 使用虚拟坐标系,是程序独立于硬件之外
                                             使用设备坐标系,完全适应硬件设备提供的编程环境
     5.1.2 GDI函数呼叫
         GDI函数分类:
            1) 取得(或建立)、释放(或清除)设备内容的函数
                      GetDC、ReleaseDC
                      BeginPaint、EndPaint
            2)取得有关设备内容信息的函数
                      GetSystemMetrics
                      GetTextMetrics
            3)绘图函数
                      Textout
            4)设定和取得设备内容参数的函数
                  设备内容的属性决定有关绘图函数如何工作的细节
                  SetTextColor来指定TextOut函数所绘制文字的颜色
                  SetTextAlign指定TextOut函数中字符串的开始位置应该在字符串的右边还是默认的左边
            5)使用GDI对象的函数
               Exp:
                  默认时使用GDI绘制的绘制的所有直线都是实线并且具有一个标准的宽度, 当需要改变线宽
               和线型时,不能通过改变设备内容的属性来实现,而只能通过一个逻辑画笔来实现。
                  要改变线型和线宽可以通过在CreatePen、CreatePenIndirect或ExtCreatePen函数中指定这些
               特征来建立一个逻辑画笔, 这些函数传回一个逻辑画笔的句柄。要使用这个画笔,需要将画笔句柄选进设备内容
               。通常认为设备内容中目前选中的画笔就是设备内容的一个属性,这样画任何线就使用这个画笔,当不再需要的
               时候可以取消设备内容中的画笔,并清除画笔对象。
                  在不需要画笔的时候清除是必要的,但不是必须的,因为画笔占用了分配的内存空间。
                  GDI对象除了画笔以外,还用于建立填入封闭区域的画刷、字体、位图以及GDI的其他一些方面。
          GDI基本图形
                直线和曲线: 线条是所有向量图形绘制的基础
                    GDI支持:直线、矩形、椭圆、圆、圆弧、贝瑟尔曲线,以及折线
                    线条由设备内容中目前选中的画笔绘制。
                填入区域:
                    一系列的直线或者曲线封闭了一个区域时,该区域可以使用目前GDI画刷对象进行填图,这个画刷
                    可以是实心色彩、图案,或者是在区域内垂直或者水平重复的位图图像。
                位图:
                    位图是位的矩形数组,这些位对应于显示设备上的图素,它们是位映像图形的基础工具。
                    位图通常:
                             用于在显示器或者打印机上显示复杂的图像
                             用于显示必须快速绘制的小图像,光标、图标以及在应用工具条上出现的按钮等。
                文字:
                    文字是显示系统中最复杂的对象之一。
          GDI的其他部分
                映像模式和变换:
                       window默认以图素为单位进行绘图,还支持以英寸、毫米等其他单位绘图。
                Metafile
                       以二进制形式存储的GDI命令集合,用于通过剪贴板传递图形
                绘图区域:
                       绘图区域是任意复杂的区域,通常定义为较简单的绘图区域的组合
                路径:
                    是GDI内部存储的直线和曲线的集合,路径可以用于绘图、填入图形和剪裁,还可以转换为绘图区域。
                剪裁:
                    绘图可以限制在显示区域的某一部分,这就是所谓的剪裁,剪裁区域可以是矩形,也可以不是矩形,剪裁
                    通常是通过区域或者路径来定义的。
                调色盘:
                     自定义调色盘通常限于256色的显示器
                 打印:
    5.2 设备内容
        如果想在一个图形输出设备上绘图,首先必须获取设备内容的句柄,并将句柄传回程序,获得使用设备的权限,然后才能
      进行绘图。
        windowsGDI函数通过返回的设备内容句柄作为一个参数,向windows标识您想在其上进行绘图的设备。
        设备内容中包含许多确定GDI函数如何在设备上工作的当前属性, 这些属性允许传递给GDI函数的参数只包含起始的坐标
      或者尺寸信息,而不必包含设备内容的其他所有信息。
        如果需要改变设备内容属性需要通过设备内容属性设定函数完成。
    5.2.1 取得设备内容句柄
         windows提供了多种获取设备内容句柄的方法,如果在处理一个消息时取得了设备内容句柄,那么应该在消息处理完毕后
    (退出窗口函数)之前释放他,一旦释放了句柄,他就不在有效。
    方法一:
        在处理WM_PAINT消息时通过BeginPaint函数取得设备内容句柄
    Exp:
        hdc=BeginPaint(hwnd,&ps);
        其他行程序
        EndPaint(hwnd,&ps);
        Tip:
           变量ps是一个PAINTSTRUCT结构类型的变量,该结构的hdc字段是BeginPaint传回的设备内容句柄,
        PAINTSTRUCT结构还包含一个名为rcPaint的RECT结构,rcPaint定义一个包含窗口显示区域无效范围的矩形,
        使用BeginPaint获得的设备内容句柄只能在这个区域内绘图。BeginPaint函数呼叫使无效区域变为有效。
    方法二:
        在处理非WM_PAINT消息时取得设备内容句柄
    Exp:
        hdc=GetDC(hwnd);
        其他行程序
        ReleaseDC(hwnd,hdc);
       Tip:
          这种方式获取的设备内容句柄,允许在整个显示区域绘图,并且这个函数呼叫不会使显示区域的无效区域变为有效。
    方法三:
       获取整个窗口的设备内容句柄
    Exp:
       hdc=GetWindowDC(hwnd);
       其他行程序
       ReleaseDC(hwnd,hdc);
       Tip:
           这个设备内容处理显示区域外,还包括窗口的标题列、菜单、滚动条和框架。
           如果需要用这个函数呼叫必须拦截处理WM_NCPAINT消息;windows利用这个消息在非显示区域绘图。
    方法四:
        BeginPaint、GetDC、GetWindowDC均与特定的窗口相关。
        可以取得不是与特定窗口先关的设备内容句柄,利用CreateDC函数
    Exp:
       hdc=CreateDC(pszDriver,pszDevice,pszOutput,pData);
       其他行程序
       DeleteDC(hdc);
    例如可以通过:
       hdc=CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
      
       在窗口之外写入画面一般是不恰当的,但是对于一些不同寻常的程序来说这样非常方便。
      
        当仅仅需要获取一个设备内容的设备内容信息而不需进行绘制时,可以使用CreateC来取的一个信息内容的句柄,
        CreateC函数的参数与CreateDC的相同。
    Exp:
        hdc=CreateC(TEXT("DISPLAY"),NULL,NULL,NULL); //当然不能用这个信息往设备内容上鞋东西。

        使用位图时取得一个内存设备内容有时是非常有用的:
    Exp:
        hdcMem=CreateCompatibleDC(hdc);
        其他行程序
        DeleteDC(hdcMem);
      Tip:
          可以将位图选择内存设备内容,然后使用GDI函数在位图上绘图。
     
      Metafile:
          metafile是一些GDI呼叫的集合,以二进制编码,可以通过取得metafile设备内容来建立metafile:
    Exp:  
        hdcMeta=CreateMetaFile(pszFilename);
        其他行程序
        hmf=CloseMetaFile(hdcMeta);
        Tip:
           在metafile设备内容有效期间,任何用hdcMeta所作的GDI呼叫都变成metafile的一部分而并不会显示,在
        呼叫CloseMetaFile之后,设备内容句柄变为无效,并且CloseMetaFile函数返回一个执行metafile(hmf)的句柄。
    5.2.2 取得设备内容信息
         一个设备内容通常指一个实际显示设备,通常可以取得有关该设备的信息: 例如显示器大小和色彩显示能力。可以通过
    GetDeviceCaps函数来取得这些消息。
    Exp:
         iValue=GetDeviceCaps(hdc,iIndex);
      Tip:
           iIndex为WINGDI.H头文件中定义的29个宏之一。
        例如:
           iIndex为HORZRES将使GetDeviceCaps传回设备的宽度(单位为图素), iIndex为VERTRES时GetDeviceCaps将
        返回设备的高度信息。如果hdc是打印机设备内容句柄,则GetDeviceCaps将返回打印机显示区域的高度和宽度(单位
        是图素)。

           以上内容纯属一孔之见, 欢迎各位弯腰找板砖....................

           越多越好啊, 我好收集板砖自己盖房,现在房价这么高,自己盖房是个不错的选择.....

           哈哈...............

  • 相关阅读:
    线段树扫描线求矩形面积并
    BZOJ-1103 [POI2007]大都市meg 【DFS序+树状数组】
    安徽大学第九届程序设计竞赛决赛题解
    如何解决Vue.js里面noVNC的截图问题(2)——蛋疼的cookies验证和node.js的websocket代理
    如何解决Vue.js里面noVNC的截图问题(1)——论可以跨域的webSocket
    从技术人视角看闪电网络之作用和局限性,以及一些问题的回答
    从技术人视角看闪电网络之闪电路由
    从技术人视角看闪电网络之微支付通道
    微服务化的大坑之一:当dubbo神器碰上共用注册中心和错误的暴露接口
    Fun论设计模式之1:简单工厂模式(Factory Pattern)
  • 原文地址:https://www.cnblogs.com/volcanol/p/2081064.html
Copyright © 2011-2022 走看看