📄 chap11_4.htm
字号:
<p ALIGN="JUSTIFY">public:</p>
<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">CDib m_Dib; </b></p>
<p ALIGN="JUSTIFY"><b>. . .</b></p>
<p ALIGN="JUSTIFY">};</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">// ShowDibDoc.cpp : implementation of the CShowDibDoc class</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></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></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">BeginWaitCursor();</p>
<p ALIGN="JUSTIFY">BOOL bSuccess=m_Dib.Load(lpszPathName); //</font><font SIZE="3">载入</font><font FACE="Times New Roman" SIZE="3">DIB</p>
<p ALIGN="JUSTIFY">EndWaitCursor();</p>
<p ALIGN="JUSTIFY">return bSuccess;</b></p>
<p ALIGN="JUSTIFY">}</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </p>
<p ALIGN="JUSTIFY">清单</font><font FACE="Times New Roman" SIZE="3">11.7 CShowDibView</font><font SIZE="3">类的部分代码</font></b><font FACE="Times New Roman" SIZE="3"></p>
<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>. . .</p>
<p ALIGN="JUSTIFY">afx_msg LRESULT OnDoRealize(WPARAM wParam, LPARAM lParam);</b></p>
<p ALIGN="JUSTIFY">DECLARE_MESSAGE_MAP()</p>
<p ALIGN="JUSTIFY">};</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">// ShowDibView.cpp : implementation of the CShowDibView class</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">BEGIN_MESSAGE_MAP(CShowDibView, CScrollView)</p>
<p ALIGN="JUSTIFY"><b>. . .</p>
<p ALIGN="JUSTIFY">ON_MESSAGE(WM_DOREALIZE, OnDoRealize)</b></p>
<p ALIGN="JUSTIFY">END_MESSAGE_MAP()</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></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></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<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); //</font><font SIZE="3">设置视图的滚动范围</font></b><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">}</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></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></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">if(bActivate)</p>
<p ALIGN="JUSTIFY">OnDoRealize(0,0); //</font><font SIZE="3">刷新视图</font></b><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">CScrollView::OnActivateView(bActivate, pActivateView, pDeactiveView);</p>
<p ALIGN="JUSTIFY">}</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<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</font><font SIZE="3">参数决定了该视图是否实现前景调色板</font><font FACE="Times New Roman" SIZE="3"></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">}</b></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></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></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">pDoc->m_Dib.Draw(pDC,0,0); //</font><font SIZE="3">输出</font><font FACE="Times New Roman" SIZE="3">DIB</b></p>
<p ALIGN="JUSTIFY">}</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></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">CDib</font><font SIZE="3">对象的代码很简单。当用户在</font><font FACE="Times New Roman" SIZE="3">ShowDib</font><font SIZE="3">程序中选择</font><font FACE="Times New Roman" SIZE="3">File->Open</font><font SIZE="3">命令并从打开文件对话框中选择了一个</font><font FACE="Times New Roman" SIZE="3">BMP</font><font SIZE="3">文件后,</font><font FACE="Times New Roman" SIZE="3">CShowDibDoc::OnOpenDocument</font><font SIZE="3">函数被调用,该函数调用</font><font FACE="Times New Roman" SIZE="3">CDib::Load</font><font SIZE="3">载入位图。在</font><font FACE="Times New Roman" SIZE="3">CShowDibView::OnDraw</font><font SIZE="3">中,调用</font><font FACE="Times New Roman" SIZE="3">CDib::Draw</font><font SIZE="3">输出位图。在</font><font FACE="Times New Roman" SIZE="3">CShowDibView::OnInitialUpdate</font><font SIZE="3">中,根据</font><font FACE="Times New Roman" SIZE="3">DIB</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">ShowDib</font><font SIZE="3">如何处理调色板问题的。</font><font FACE="Times New Roman" SIZE="3">ShowDib</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">WM_QUERYNEWPALETTE</font><font SIZE="3">消息时,主框架窗口向具有输入焦点的视图发送</font><font FACE="Times New Roman" SIZE="3">wParam</font><font SIZE="3">参数为</font><font FACE="Times New Roman" SIZE="3">0</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">CShowDibView::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">WM_PALETTECHANGED</font><font SIZE="3">消息,</font><font FACE="Times New Roman" SIZE="3">DibLook</font><font SIZE="3">的主框架窗口也会收到该消息。主框架窗口对该消息的处理是向所有的视图发送</font><font FACE="Times New Roman" SIZE="3">wParam</font><font SIZE="3">参数为</font><font FACE="Times New Roman" SIZE="3">1</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"></p>
<p ALIGN="JUSTIFY"></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">CShowDibView:: OnActivateView</font><font SIZE="3">函数来完成。</font><font FACE="Times New Roman" SIZE="3"></p>
</font><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>
</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 + -