zoukankan      html  css  js  c++  java
  • DIBs和CDib类

    DIBs和CDib类(Programming Visual C++ 5 Edition 第11章)

    在MFC中有一个类与GDI位图对应(即CBitmap),但是,MFC中没有与DIBs对应的类。别担心,这里将会给出一个,他是本书以前版本中CDib类的重写。他充分利用了Win32的特性,例如内存映射文件、增强的内存管理和DIB片段。他同时引入了调色板支持。

    调色板相关内容

    Windows调色板编程非常复杂,但是,如果想要用户在8bbp(bits per pixel)模式(很多用户如果他们的视频卡为1M或者更少时将会用到)下显示他们的程序,你就必须应用调色板编程。

    设想你要在视图中显示单个DIB。首先要创建一个逻辑调色板,一个包含DIB中颜色的GDI对象。然后,必须将这个逻辑调色板实现到硬件系统调色板。在这种情况下,视频卡将会显示256色的色表。如果你的程序是前台程序,实例化过程将试着复制所有的颜色到系统调色板,但是,他并不触及那20个标准的Windows颜色。绝大部分而言,DIB开起来将会像是你所预想的那样。

    但是,另一个程序是前台程序,而且那个程序有一个深林场景包含236个色度的绿色将会怎样呢?你的程序仍然实现自身的调色板,但是,这时将会有所不同。现在,系统的调色板还没有变,但是,Windows在你的逻辑调色板和系统调色板之间建立了一个一个新的映射。假如你的DIB包含一个粉色,Windows会将其映射为标准红色。如果你的程序忘记了实现这个调色板,这个粉色颜料将会在其他程序激活时变为绿色。

    上面的深林场景例子是一个极端,因为我们假设另一个程序具有236色,如果另一个程序实现的逻辑调色板只有200色,Windows将会让你的程序加载36个自身所有的颜色,希望能够包含粉色。

    那么,什么时候程序会实现他的调色板呢?当一个程序(包括你的程序)实例自身的调色板时,Windows消息WN_PALETTEDCHANGED将会发送到你的程序的主窗口。当你的程序的一个窗口获得焦点时,另一个消息——WM_QUERYNEWPALETTE消息竟会发送过来。你的程序应当在相应这两个消息时(除非你的程序产生这两个消息)实现自身的调色板。然而,这些调色板消息不是发送到你的试图窗口。你必须将这两个消息映射到应用程序的主框架窗口并通知视图。第13章讨论框架窗口和视图窗口的关系,第26章包含一个完整的调色板敏感的MDI应用程序。

    调用Win32 RealizePalette函数来执行实现,但是,首先必须调用SelectPalette函数选择DIB的逻辑调色板到设备环境当中。SelectPalette有一个标记参数,该参数在WM_PALETTECHANGED和WM_QUERYNEWPALETTE处理函数中通常设为FALSE。该参数确保了如果你的应用程序确实在前台运行时,你的调色板实现为一个前台调色板。如果在这里使用TRUE标记,将强迫Windows实现调色板,尽管应用程序是后台程序。

    必须为在OnDraw函数显示的每一个DIB调用SelectPalette函数,这是,使用TRUE标记来调用该函数。如果要显示多个具有自身调色板的DIB,事情就变得复杂了。基本上,必须在调色板消息处理函数中为每一个DIB选择一个调色板来实现(使用FALSE标记选择)。选中的DIB将导致比其他DIB更好看。有很多方法融合调色模板,但是,购买多个视频卡将更容易。

    DIB、像素和颜色表

    一个DIB包含一个二维的元素数组,称为像素。多数情况下,每一个DIB像素将映射为一个显示器像素,但是DIB像素可能映射到显示器的部分逻辑区域,依映射模式和显示函数拉伸参数而异。

    一个像素由连续的1、4、8、16、24或者32位组成,取决于DIB的颜色精度。对于16bpp、24bpp和32bpp的DIB来说,每一个像素代表一个RGB颜色。一个典型的16dpp的DIB中每个像素包含5位红、5位蓝和5位绿。一个24dpp的DIB为每一个颜色值保留8位。16dpp和24dpp的DIB为视频卡做了优化,可以同时显示65536或者16.7百万种颜色。

    1bpp的DIB是一个单色的DIB,但是这些DIB不一定是黑白色,他们可以为从DIB中创建的颜色表中选择的任意两色。一个单色位图具有两个32位颜色表实体,每一个实体保留8位的红、绿和蓝值加上另一个8位的标记字节。为0的像素值使用第一个实体,为1的像素值使用第二个。不管你用的是65536色的视频卡或者16.7百万色的视频卡。Windows将直接显示两种颜色。(对于65536色的显示,Windows截取8位颜色值为5位。)如果你的视频卡运行在256色的调色板模式下,你的程序将调整系统调色板加载指定的两个颜色。

  • 相关阅读:
    Win32 键盘事件
    好用的Markdown 编辑器及工具
    如何激发您孩子的学习动力和兴趣
    横扫芯片后,紫光欲进军公有云 数百亿资金已到位(大事表)
    C#更改控制台文本颜色
    I/O多路复用
    Python 安装 httpie
    Elasticsearch 5.0
    认证架构
    注册微信小程序
  • 原文地址:https://www.cnblogs.com/faceang/p/1682063.html
Copyright © 2011-2022 走看看