📄 chap11_1.htm
字号:
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">void CTestPalView::OnDraw(CDC* pDC)</p>
<p ALIGN="JUSTIFY">{</p>
<p ALIGN="JUSTIFY">CTestPalDoc* pDoc = GetDocument();</p>
<p ALIGN="JUSTIFY">ASSERT_VALID(pDoc);</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">// TODO: add draw code for native data here</p>
<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">CBrush brush,*pOldBrush;</p>
<p ALIGN="JUSTIFY">int x,y,i;</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">pDC->SelectPalette(&m_Palette,FALSE);</p>
<p ALIGN="JUSTIFY">pDC->RealizePalette();</p>
<p ALIGN="JUSTIFY">pDC->SelectStockObject(BLACK_PEN);</p>
<p ALIGN="JUSTIFY">for(i=0;i<256;i++)</p>
<p ALIGN="JUSTIFY">{</p>
<p ALIGN="JUSTIFY">x=(i%16)*16;</p>
<p ALIGN="JUSTIFY">y=(i/16)*16;</p>
<p ALIGN="JUSTIFY">brush.CreateSolidBrush(PALETTEINDEX(i)); //</font><font SIZE="3">调色板索引引用</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">pOldBrush=pDC->SelectObject(&brush);</p>
<p ALIGN="JUSTIFY">pDC->Rectangle(x,y,x+16,y+16);</p>
<p ALIGN="JUSTIFY">pDC->SelectObject(pOldBrush);</p>
<p ALIGN="JUSTIFY">brush.DeleteObject();</p>
<p ALIGN="JUSTIFY">}</p>
<p ALIGN="JUSTIFY">for(i=0;i<256;i++)</p>
<p ALIGN="JUSTIFY">{</p>
<p ALIGN="JUSTIFY">x=(i%16)*16+300;</p>
<p ALIGN="JUSTIFY">y=(i/16)*16;</p>
<p ALIGN="JUSTIFY">brush.CreateSolidBrush(RGB(i,0,0)); //RGB</font><font SIZE="3">引用</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">pOldBrush=pDC->SelectObject(&brush);</p>
<p ALIGN="JUSTIFY">pDC->Rectangle(x,y,x+16,y+16);</p>
<p ALIGN="JUSTIFY">pDC->SelectObject(pOldBrush);</p>
<p ALIGN="JUSTIFY">brush.DeleteObject();</p>
<p ALIGN="JUSTIFY">}</b></p>
<p ALIGN="JUSTIFY">}</p>
<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">LRESULT CTestPalView::OnDoRealize(WPARAM wParam, LPARAM)</p>
<p ALIGN="JUSTIFY">{</p>
<p ALIGN="JUSTIFY">CClientDC dc(this);</p>
<p ALIGN="JUSTIFY">dc.SelectPalette(&m_Palette,FALSE);</p>
<p ALIGN="JUSTIFY">if(dc.RealizePalette()) //</font><font SIZE="3">若调色板映射被改变则刷新视图</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">GetDocument()->UpdateAllViews(NULL);</p>
<p ALIGN="JUSTIFY">return 0L;</p>
<p ALIGN="JUSTIFY">}</p>
<p ALIGN="JUSTIFY"></font></b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">在</font><font FACE="Times New Roman" SIZE="3">CTestPalView</font><font SIZE="3">的构造函数中创建了一个含有</font><font FACE="Times New Roman" SIZE="3">256</font><font SIZE="3">个递增红色的逻辑调色板。</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">当变为活动窗口以及窗口创建时,</font><font FACE="Times New Roman" SIZE="3">TestPal</font><font SIZE="3">程序的主框架窗口都会收到</font><font FACE="Times New Roman" SIZE="3">WM_QUERYNEWPALETTE</font><font SIZE="3">消息,该消息的处理函数</font><font FACE="Times New Roman" SIZE="3">OnQueryNewPalette</font><font SIZE="3">负责发送</font><font FACE="Times New Roman" SIZE="3">WM_DOREALIZE</font><font SIZE="3">消息通知视图</font><font FACE="Times New Roman" SIZE="3">, </font><font SIZE="3">并返回</font><font FACE="Times New Roman" SIZE="3">TRUE</font><font SIZE="3">以表明活动窗口实现了逻辑调色板。</font><font FACE="Times New Roman" SIZE="3">WM_DOREALIZE</font><font SIZE="3">消息的处理函数</font><font FACE="Times New Roman" SIZE="3">CTestPalView::OnDoRealize</font><font SIZE="3">为视图实现一个前景调色板,该函数中有一个判断语句可提高程序运行的效率:如果</font><font FACE="Times New Roman" SIZE="3">CDC::RealizePalette</font><font SIZE="3">返回值大于零,则说明调色板映射表发生了变化,此时必须刷新视图,否则制图中的颜色将失真。如果</font><font FACE="Times New Roman" SIZE="3">RealizePalette</font><font SIZE="3">返回零则说明调色板映射没有变化,这时就没有必要刷新视图。</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">无论是</font><font FACE="Times New Roman" SIZE="3">TestPal</font><font SIZE="3">还是别的应用程序在实现前景调色板并改变了系统调色板时,</font><font FACE="Times New Roman" SIZE="3">TestPal</font><font SIZE="3">程序的主框架窗口都会收到</font><font FACE="Times New Roman" SIZE="3">WM_PALETTECHANGED</font><font SIZE="3">消息。请注意该消息的处理函数</font><font FACE="Times New Roman" SIZE="3">CMainFrame::OnPaletteChanged</font><font SIZE="3">有一个</font><font FACE="Times New Roman" SIZE="3">pFocusWnd</font><font SIZE="3">参数,该参数表明是哪一个窗口改变了系统调色板。函数用</font><font FACE="Times New Roman" SIZE="3">pFocusWnd</font><font SIZE="3">来判断,如果是别的应用程序实现了前景调色板,则通知视图调用</font><font FACE="Times New Roman" SIZE="3">OnDoRealize</font><font SIZE="3">实现其逻辑调色板,注意虽然</font><font FACE="Times New Roman" SIZE="3">CDC::SelectPalette</font><font SIZE="3">的</font><font FACE="Times New Roman" SIZE="3">bForceBackground</font><font SIZE="3">参数是</font><font FACE="Times New Roman" SIZE="3">FALSE</font><font SIZE="3">,但这时视图的逻辑调色板是作为背景调色板实现的。如果是</font><font FACE="Times New Roman" SIZE="3">TestPal</font><font SIZE="3">自己的视图实现了前景调色板,则没有必要调用</font><font FACE="Times New Roman" SIZE="3">OnDoRealize</font><font SIZE="3">。</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">请读者将</font><font FACE="Times New Roman" SIZE="3">Windows</font><font SIZE="3">当前的显示模式设置为</font><font FACE="Times New Roman" SIZE="3">256</font><font SIZE="3">色,然后编译并运行</font><font FACE="Times New Roman" SIZE="3">TestPal</font><font SIZE="3">,对比一下</font><font FACE="Times New Roman" SIZE="3">RGB</font><font SIZE="3">引用与调色板索引引用的效果,读者不难发现左边用调色板索引引用输出的颜色比右边好的多。通过该程序我们可以看出,即使在系统调色板中已实现了丰富的红色的情况下,</font><font FACE="Times New Roman" SIZE="3">RGB</font><font SIZE="3">引用得到的红色仍然是</font><font FACE="Times New Roman" SIZE="3">20</font><font SIZE="3">种保留颜色的抖动色。</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">读者可以打开</font><font FACE="Times New Roman" SIZE="3">Windows</font><font SIZE="3">的画笔程序,并在该程序中打开一幅</font><font FACE="Times New Roman" SIZE="3">256</font><font SIZE="3">色的位图</font><font FACE="Times New Roman" SIZE="3">(</font><font SIZE="3">如</font><font FACE="Times New Roman" SIZE="3">Windows</font><font SIZE="3">目录下的</font><font FACE="Times New Roman" SIZE="3">Forest.bmp)</font><font SIZE="3">。在画笔和</font><font FACE="Times New Roman" SIZE="3">TestPal</font><font SIZE="3">程序之间来回切换,读者可以看到,由于两个应用程序都正确的处理了调色板消息,在前台的应用程序总是具有最好的颜色显示,而后台程序的颜色虽然有些失真,但还比较令人满意。</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">需要指出的是,</font><font FACE="Times New Roman" SIZE="3">TestPal</font><font SIZE="3">程序只使用了一个逻辑调色板,所以它处理调色板消息的方法比较简单。如果程序要用到多个逻辑调色板,那么就需要采取一些新措施来保证只有一个逻辑调色板作为前景调色板使用。在</font><font FACE="Times New Roman" SIZE="3">11.4</font><font SIZE="3">节读者可以看到使用多个逻辑调色板时的处理方法。</font><font FACE="Times New Roman" SIZE="3"><b></p>
</b></font><div align="center"><center><table border="0" cellpadding="0" cellspacing="0" width="615">
<tr>
<td><a href="chap11.htm">上一页</a></td>
<td><p align="right"><a href="chap11_2.htm">下一页</a></td>
</tr>
</table>
</center></div><font SIZE="5"><hr noshade color="#3973DE" size="1">
<p align="center"></font><font size="2" color="#000000">本教程由<a href="http://vcdynasty.yeah.net">Visual C++王朝(Where programmers come together)</a>协助制作<br>
未经许可,请勿以任何形式复制</font></td>
<b>
</tr>
</table>
</center></div>
<p ALIGN="CENTER"></b><font SIZE="5"> </font><font FACE="Times New Roman" SIZE="5"></p>
</font><font FACE="Times New Roman" SIZE="3">
<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
</font></b>
<p><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p></font> </p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -