📄 chap11_4.htm
字号:
<p align="JUSTIFY">// TODO: Add your message handler code here and/or
call default</p>
<p><b> </b></p>
<b>
<p align="JUSTIFY">CMDIChildWnd* pMDIChildWnd = MDIGetActive();</p>
<p align="JUSTIFY">if (pMDIChildWnd == NULL)</p>
<p align="JUSTIFY">return FALSE; // 没有活动的MDI子框架窗口</p>
<p align="JUSTIFY">CView* pView = pMDIChildWnd->GetActiveView();</p>
<p align="JUSTIFY">pView->SendMessage(WM_DOREALIZE,0); //只通知活动视图</p>
<p align="JUSTIFY">return TRUE; //返回TRUE表明实现了逻辑调色板</p>
</b>
<p align="JUSTIFY">}</p>
<p align="JUSTIFY"> </p>
<p align="JUSTIFY"><b> </b></p>
<b>
<p align="JUSTIFY">清单11.6 CShowDibDoc类的部分代码</p>
</b>
<p align="JUSTIFY">// ShowDibDoc.h : interface of the CShowDibDoc class</p>
<p><b> </b></p>
<b>
<p align="JUSTIFY">#include "CDib.h"</p>
</b>
<p align="JUSTIFY"> </p>
<p align="JUSTIFY">class CShowDibDoc : public CDocument</p>
<p align="JUSTIFY">{</p>
<p align="JUSTIFY"><b>. . .</b></p>
<p align="JUSTIFY">// Attributes</p>
<p align="JUSTIFY">public:</p>
<p><b> </b></p>
<b>
<p align="JUSTIFY">CDib m_Dib; </p>
</b>
<p align="JUSTIFY"><b>. . .</b></p>
<p align="JUSTIFY">};</p>
<p align="JUSTIFY"> </p>
<p align="JUSTIFY">// ShowDibDoc.cpp : implementation of the CShowDibDoc
class</p>
<p align="JUSTIFY"> </p>
<p align="JUSTIFY">BOOL CShowDibDoc::OnOpenDocument(LPCTSTR lpszPathName)
</p>
<p align="JUSTIFY">{</p>
<p align="JUSTIFY">if (!CDocument::OnOpenDocument(lpszPathName))</p>
<p align="JUSTIFY">return FALSE;</p>
<p align="JUSTIFY">// TODO: Add your specialized creation code here</p>
<p><b> </b></p>
<b>
<p align="JUSTIFY">BeginWaitCursor();</p>
<p align="JUSTIFY">BOOL bSuccess=m_Dib.Load(lpszPathName); //载入DIB</p>
<p align="JUSTIFY">EndWaitCursor();</p>
<p align="JUSTIFY">return bSuccess;</p>
</b>
<p align="JUSTIFY">}</p>
<p align="JUSTIFY"> </p>
<p><b> </b></p>
<b>
<p align="JUSTIFY"> </p>
<p align="JUSTIFY">清单11.7 CShowDibView类的部分代码</p>
</b>
<p align="JUSTIFY">// ShowDibView.h : interface of the CShowDibView
class</p>
<p align="JUSTIFY">class CShowDibView : public CScrollView</p>
<p align="JUSTIFY">{</p>
<p align="JUSTIFY"><b>. . .</b></p>
<b>
<p align="JUSTIFY">afx_msg LRESULT OnDoRealize(WPARAM wParam, LPARAM
lParam);</p>
</b>
<p align="JUSTIFY">DECLARE_MESSAGE_MAP()</p>
<p align="JUSTIFY">};</p>
<p align="JUSTIFY"> </p>
<p align="JUSTIFY">// ShowDibView.cpp : implementation of the CShowDibView
class</p>
<p align="JUSTIFY"> </p>
<p align="JUSTIFY">BEGIN_MESSAGE_MAP(CShowDibView, CScrollView)</p>
<p align="JUSTIFY"><b>. . .</b></p>
<b>
<p align="JUSTIFY">ON_MESSAGE(WM_DOREALIZE, OnDoRealize)</p>
</b>
<p align="JUSTIFY">END_MESSAGE_MAP()</p>
<p align="JUSTIFY"> </p>
<p align="JUSTIFY">void CShowDibView::OnInitialUpdate()</p>
<p align="JUSTIFY">{</p>
<p align="JUSTIFY">CScrollView::OnInitialUpdate();</p>
<p align="JUSTIFY">CSize sizeTotal;</p>
<p align="JUSTIFY">// TODO: calculate the total size of this view</p>
<p><b> </b></p>
<b>
<p align="JUSTIFY">CShowDibDoc* pDoc = GetDocument();</p>
<p align="JUSTIFY">sizeTotal.cx = pDoc->m_Dib.Width();</p>
<p align="JUSTIFY">sizeTotal.cy = pDoc->m_Dib.Height();</p>
<p align="JUSTIFY">SetScrollSizes(MM_TEXT, sizeTotal); //设置视图的滚动范围</p>
</b>
<p align="JUSTIFY">}</p>
<p align="JUSTIFY"> </p>
<p align="JUSTIFY">void CShowDibView::OnActivateView(BOOL bActivate,
CView* pActivateView, CView* pDeactiveView) </p>
<p align="JUSTIFY">{</p>
<p align="JUSTIFY">// TODO: Add your specialized code here and/or call
the base class</p>
<p><b> </b></p>
<b>
<p align="JUSTIFY">if(bActivate)</p>
<p align="JUSTIFY">OnDoRealize(0,0); //刷新视图</p>
</b>
<p align="JUSTIFY">CScrollView::OnActivateView(bActivate, pActivateView,
pDeactiveView);</p>
<p align="JUSTIFY">}</p>
<p align="JUSTIFY"> </p>
<p><b> </b></p>
<b>
<p align="JUSTIFY">LRESULT CShowDibView::OnDoRealize(WPARAM wParam,
LPARAM)</p>
<p align="JUSTIFY">{</p>
<p align="JUSTIFY">CClientDC dc(this);</p>
<p align="JUSTIFY">//wParam参数决定了该视图是否实现前景调色板</p>
<p align="JUSTIFY">dc.SelectPalette(GetDocument()->m_Dib.GetPalette(),wParam);</p>
<p align="JUSTIFY">if(dc.RealizePalette())</p>
<p align="JUSTIFY">GetDocument()->UpdateAllViews(NULL);</p>
<p align="JUSTIFY">return 0L;</p>
<p align="JUSTIFY">}</p>
</b>
<p align="JUSTIFY"> </p>
<p align="JUSTIFY">void CShowDibView::OnDraw(CDC* pDC)</p>
<p align="JUSTIFY">{</p>
<p align="JUSTIFY">CShowDibDoc* pDoc = GetDocument();</p>
<p align="JUSTIFY">ASSERT_VALID(pDoc);</p>
<p align="JUSTIFY">// TODO: add draw code for native data here</p>
<p><b> </b></p>
<b>
<p align="JUSTIFY">pDoc->m_Dib.Draw(pDC,0,0); //输出DIB</p>
</b>
<p align="JUSTIFY">}</p>
<p align="JUSTIFY"> 在程序中使用CDib对象的代码很简单。当用户在ShowDib程序中选择File->Open命令并从打开文件对话框中选择了一个BMP文件后,CShowDibDoc::OnOpenDocument函数被调用,该函数调用CDib::Load载入位图。在CShowDibView::OnDraw中,调用CDib::Draw输出位图。在CShowDibView::OnInitialUpdate中,根据DIB的尺寸来确定视图的滚动范围。</p>
<p align="JUSTIFY"> 需要重点研究的是ShowDib如何处理调色板问题的。ShowDib是一个多文档应用程序,可以同时显示多幅位图。由于每个位图一般都有不同的调色板,这样就产生了共享系统调色板的问题。程序必须采取措施来保证只有一个视图的逻辑调色板作为前景调色板使用。</p>
<p align="JUSTIFY"> 当主框架窗口收到WM_QUERYNEWPALETTE消息时,主框架窗口向具有输入焦点的视图发送wParam参数为0的WM_DOREALIZE消息,该视图的消息处理函数CShowDibView::OnDoRealize为视图实现前景调色板并在必要时重绘视图,这样活动视图中的位图就具有最佳颜色显示。</p>
<p align="JUSTIFY"> 如果活动视图在实现其前景调色板时改变了系统调色板,或是别的应用程序的前景调色板改变了系统调色板,那么Windows会向所有顶层窗口和重叠窗口发送WM_PALETTECHANGED消息,DibLook的主框架窗口也会收到该消息。主框架窗口对该消息的处理是向所有的视图发送wParam参数为1的WM_DOREALIZE消息,通知它们实现各自的背景调色板并在必要时重绘,这样所有的位图都能显示令人满意的颜色。</p>
<p align="JUSTIFY"> 当某一视图被激活时,需要调用OnDoRealize来实现其前景调色板,这一任务由CShowDibView::
OnActivateView函数来完成。</p>
<div align="center">
<center>
<table border="0" cellpadding="0" cellspacing="0" width="615">
<tr>
<td><a href="chap11_3.htm">上一页</a></td>
<td>
<p align="right"><a href="chap11_5.htm">下一页</a>
</td>
</tr>
</table>
<p><a href="http://www.cpcw.com">电脑报首页</a> <a href="../../index.htm">网络学院首页</a></p>
</center>
</div>
<font size="5">
<hr noshade color="#3973DE" size="1">
</font>
<p align="center"><font size="5"></font><font size="2" color="#000000">本教程由<a href="http://vcdynasty.yeah.net">Visual
C++王朝(Where programmers come together)</a>协助制作<br>
未经许可,请勿以任何形式复制</font>
</td>
</tr>
</table>
</center>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -