⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 topitem.htm

📁 DirectX 编程初级教程中文版。只要有C++基础和一点三维知识即可。
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<blockquote>
  <b><p></font><a name="在窗口模式下使用DirectDraw调色板"><font color="#FF8000"><font
  FACE="黑体" size="4">在窗口模式下使用</font><font FACE="Arial" size="4">DirectDraw</font><font
  FACE="宋体" size="4">调色板</font></font></a></b><font FACE="宋体" SIZE="3"></p>
  <font size="4"><p align="right"></font><a href="#目录">返回目录</a></p>
</blockquote>

<blockquote>
  <p ALIGN="JUSTIFY">当应用程序为独占(全屏)模式时,<font FACE="Arial"
  SIZE="3">IDirectDrawPalette</font>接口的函数拥有直接写硬件的能力。然而,当应用程序处于非独占(窗口)模式时,<font
  FACE="Arial" SIZE="3">IDirectDrawPalette</font>接口的调用的是<font FACE="Arial"
  SIZE="3">GDI</font>的调色板函数句柄来与其它应用程序协同工作。</p>
  <p ALIGN="JUSTIFY">对以下主题的讨论,我们假使桌面是<font FACE="Arial"
  SIZE="3">8</font>位调色板模式,并且你已经创建了一个主页面和一个标准的窗口。</p>
</blockquote>

<blockquote>
  <blockquote>
    <ol>
      <li>窗口模式的调色板入口类型</li>
      <li>在窗口模式下创建调色板</li>
      <li>在窗口模式下设置调色板入口</li>
    </ol>
  </blockquote>
</blockquote>

<blockquote>
  <font FACE="黑体" SIZE="3"><b><p><a name="窗口模式的调色板入口类型">窗口模式的调色板入口类型</a></b></font></p>
  <font size="4"><p align="right"></font><a href="#目录">返回目录</a></p>
</blockquote>

<blockquote>
  <p ALIGN="JUSTIFY">与全屏模式的应用程序不同,窗口模式的应用程序必须与其它的应用程序共享桌面调色板。这就给开发者带来了一些困难,如怎样修改调色板入口,以及如何才能安全的修改等。用于<font
  FACE="Arial" SIZE="3">DirectDrawPalette</font>对象和<font FACE="Arial" SIZE="3">GDI</font>的<font
  FACE="Arial" SIZE="3">PALETTEENTRY</font>结构中,包含了一个<font FACE="Arial"
  SIZE="3">peFlags</font>成员,它携带了系统如何解释<font FACE="Arial" SIZE="3">PALETTEENTRY</font>结构的描述信息。<font
  FACE="Arial" SIZE="3"></p>
  <p ALIGN="JUSTIFY">PALETTEENTRY</font>结构是这样定义的:</p>
</blockquote>
</font>

<blockquote>
  <font FACE="宋体" SIZE="1"><p
  style="background-color: rgb(0,0,128); margin-top: 00; margin-bottom: 0; padding-top: 2"></font><font
  FACE="宋体" size="3"><font color="#FFFFFF">typedef struct tagPALETTEENTRY { // pe</font></p>
  <p
  style="background-color: rgb(0,0,128); margin-top: 00; margin-bottom: 0; padding-top: 2"><font
  color="#FFFFFF">BYTE peRed;</font></p>
  <p
  style="background-color: rgb(0,0,128); margin-top: 00; margin-bottom: 0; padding-top: 2"><font
  color="#FFFFFF">BYTE peGreen; </font></p>
  <p
  style="background-color: rgb(0,0,128); margin-top: 00; margin-bottom: 0; padding-top: 2"><font
  color="#FFFFFF">BYTE peBlue;</font></p>
  <p
  style="background-color: rgb(0,0,128); margin-top: 00; margin-bottom: 0; padding-top: 2"><font
  color="#FFFFFF">BYTE peFlags; </font></p>
  <p
  style="background-color: rgb(0,0,128); margin-top: 00; margin-bottom: 0; padding-top: 2"><font
  color="#FFFFFF">} PALETTEENTRY;</font></font><font FACE="宋体" size="5"></p>
  </font>
</blockquote>

<blockquote>
  <font FACE="宋体" size="3"><p ALIGN="JUSTIFY">前三个成员我们都很熟悉,它们是该入口所代表的颜色的三原色分量的值,分别是红、绿、蓝。最后一个成员</font><font
  FACE="Arial" SIZE="3">peFlags</font><font FACE="宋体" size="3">描述了该调色板入口是以下三种类型的哪一种:</p>
  </font>
</blockquote>

<blockquote>
  <blockquote>
    <font FACE="宋体" size="3"><ol>
      <font FACE="Arial" SIZE="3">
      <li>Windows</font>静态入口</li>
      <li>动态入口</li>
      <li>非动态入口</li>
    </ol>
    </font>
  </blockquote>
</blockquote>

<blockquote>
  <blockquote>
    <b><font FACE="Arial" SIZE="3"><p ALIGN="JUSTIFY">Windows</font><font FACE="宋体"
    size="3">静态入口:</b></p>
    </font>
  </blockquote>
  <blockquote>
    <font FACE="宋体" size="3"><p ALIGN="JUSTIFY">在窗口模式中,</font><font
    FACE="Arial" SIZE="3">Windows</font><font FACE="宋体" size="3">保留了调色板的前</font><font
    FACE="Arial" SIZE="3">10</font><font FACE="宋体" size="3">个(</font><font
    FACE="Arial" SIZE="3">0</font><font FACE="宋体" size="3">到</font><font FACE="Arial"
    SIZE="3">9</font><font FACE="宋体" size="3">)和后</font><font FACE="Arial" SIZE="3">10</font><font
    FACE="宋体" size="3">个(</font><font FACE="Arial" SIZE="3">246</font><font
    FACE="宋体" size="3">到</font><font FACE="Arial" SIZE="3">255</font><font FACE="宋体"
    size="3">)共</font><font FACE="Arial" SIZE="3">20</font><font FACE="宋体" size="3">个入口,将它们作为系统保留色来显示窗口,如:菜单条、菜单文字、窗口边框、按钮底色等。为了使你的应用程序与系统保持一致的外观,以及避免破坏其它的应用程序,你有必要保护主页面调色板的这些入口。通常,开发者调用</font><font
    FACE="Arial" SIZE="3">Win32</font><font FACE="宋体" size="3">的</font><font
    FACE="Arial" SIZE="3">GetSystemPaletteEntries</font><font FACE="宋体" size="3">函数获得系统调色板的入口,然后,在将用户定制的调色板指派给主页面之前,将系统调色板中这</font><font
    FACE="Arial" SIZE="3">20</font><font FACE="宋体" size="3">个保留入口的值明确的匹配给该定制调色板。在定制调色板中复制系统调色板的入口项在应用程序初始化时可以正常工作,但如果用户更改了桌面的配色方案,它会变得无法使用。</p>
    </font>
  </blockquote>
</blockquote>

<blockquote>
  <blockquote>
    <font FACE="宋体" size="3"><p ALIGN="JUSTIFY">要避免你的调色板在用户更改了配色方案之后变得面目全非,你可以通过提供一个指向系统调色板的引用,而不是直接指定一个颜色值来保护这些被保留的入口。用这种方法,不管系统对某一个保留入口使用什么样的颜色,你的定制调色板将总会符合系统颜色,而且不需要做任何更新工作。在</font><font
    FACE="Arial" SIZE="3">peFlags</font><font FACE="宋体" size="3">成员中使用</font><font
    FACE="Arial" SIZE="3">PC_EXPLICIT</font><font FACE="宋体" size="3">标志,使你将定制调色板的入口直接指向一个系统调色板成为可能。当你使用这个标志,系统将不会再认为其它的成员中包含颜色信息,你应该设置</font><font
    FACE="Arial" SIZE="3">peRed</font><font FACE="宋体" size="3">成员的值为系统调色板的一个索引,并且将其它成员的值设为</font><font
    FACE="Arial" SIZE="3">0</font><font FACE="宋体" size="3">。</p>
    </font>
  </blockquote>
</blockquote>

<blockquote>
  <blockquote>
    <font FACE="宋体" size="3"><p ALIGN="JUSTIFY">举例来说,如果你想要确保你定制调色板的保留入口与系统调色板相一致,你应该使用如下的代码:</p>
    </font>
  </blockquote>
</blockquote>

<blockquote>
  <blockquote>
    <font FACE="宋体" SIZE="1"><p
    style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
    FACE="宋体" size="3"><font color="#FFFFFF">// 设置前10项和后10项入口与系统调色板相匹配</font></p>
    <p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
    color="#FFFFFF">PALETTEENTRY pe[256];</font></p>
    <p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
    color="#FFFFFF">ZeroMemory(pe, sizeof(pe));</font></p>
    <p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
    color="#FFFFFF">for(int i=0;i&lt;10;i++){</font></p>
    <p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
    color="#FFFFFF">pe[i].peFlags = pe[i+246].peFlags = PC_EXPLICIT;</font></p>
    <p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
    color="#FFFFFF">pe[i].peRed = i;</font></p>
    <p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
    color="#FFFFFF">pe[i+246].peRed = i+246;</font></p>
    </font><p
    style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
    color="#FFFFFF" face="宋体" size="3">}</font></p>
  </blockquote>
</blockquote>

<blockquote>
  <blockquote>
    <font FACE="宋体" size="3"><p ALIGN="JUSTIFY">你可以强迫</font><font FACE="Arial"
    SIZE="3">Windows</font><font FACE="宋体" size="3">仅保留使用调色板入口的第一项和最后一项(</font><font
    FACE="Arial" SIZE="3">0</font><font FACE="宋体" size="3">和</font><font FACE="Arial"
    SIZE="3">255</font><font FACE="宋体" size="3">),方法是调用</font><font
    FACE="Arial" SIZE="3">Win32</font><font FACE="宋体" size="3">的</font><font
    FACE="Arial" SIZE="3">SetSystemPaletteUse</font><font FACE="宋体" size="3">函数。在这种情况下,你应该设置</font><font
    FACE="Arial" SIZE="3">0</font><font FACE="宋体" size="3">号与</font><font FACE="Arial"
    SIZE="3">255</font><font FACE="宋体" size="3">号</font><font FACE="Arial" SIZE="3">PALETTEENTRY</font><font
    FACE="宋体" size="3">结构的</font><font FACE="Arial" SIZE="3">peFlags</font><font
    FACE="宋体" size="3">成员值为</font><font FACE="Arial" SIZE="3">PC_EXPLICIT</font><font
    FACE="宋体" size="3">。</p>
    </font>
  </blockquote>
</blockquote>

<blockquote>
  <blockquote>
    <font FACE="宋体" size="3"><b><p ALIGN="JUSTIFY">动态入口:</b></p>
    </font>
  </blockquote>
</blockquote>

<blockquote>
  <blockquote>
    <font FACE="宋体" size="3"><p ALIGN="JUSTIFY">在相应的</font><font FACE="Arial"
    SIZE="3">PALETTEENTRY</font><font FACE="宋体" size="3">结构的</font><font
    FACE="Arial" SIZE="3">peFlags</font><font FACE="宋体" size="3">成员中设置</font><font
    FACE="Arial" SIZE="3">PC_RESERVED</font><font FACE="宋体" size="3">标志,表示调色板的该项入口即为用户所保留,</font><font
    FACE="Arial" SIZE="3">Windows</font><font FACE="宋体" size="3">将不会允许任何其它的应用程序将它们的逻辑调色板映射到这个物理入口中。因此,只有你的应用程序能够修改这个入口的颜色值,实现调色板动画,而其它的应用程序却无法修改它。</p>
    </font>
  </blockquote>
</blockquote>

<blockquote>
  <blockquote>
    <font FACE="宋体" size="3"><b><p ALIGN="JUSTIFY">非动态入口:</b></p>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -