📄 chap7_5.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<title>7.5不使用串行化的文档视结构程序</title>
</head>
<body link="#3973DE" alink="#3973DE">
<font SIZE="5"><b><div align="center"><center>
<table border="0" width="615" cellspacing="0" cellpadding="0">
<tr>
</b><td><div align="center"><center><table border="0" width="615" cellpadding="0" cellspacing="0" height="20">
<tr>
<td width="377" bgcolor="#15397D" height="20"></td>
<td width="238" bgcolor="#000000" height="20"><p align="right"></font><span style="text-decoration: none"><a href="../../index.htm"><font color="#FFFFFF">电脑报Visual
C++网络教程</font></a></span></td>
</tr>
</table>
</center></div><font FACE="Times New Roman" SIZE="4"><b><p ALIGN="CENTER"></b></font><font color="#3973DE" FACE="Times New Roman" SIZE="4">7.5</font><font SIZE="4" color="#3973DE">不使用串行化的文档视结构程序</font><font FACE="Times New Roman" SIZE="3"></p>
<p></font><font SIZE="3">在</font><font FACE="Times New Roman" SIZE="3">MFC</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">SAMPLES\MFC\GENERAL\DIBLOOK</font><font SIZE="3">目录),它是一个位图显示程序,演示了在不使用串行化的情况下实现文档的输入输出功能。有关位图、调色板的使用在第十一章有详细介绍,这里只讨论与文档视结构相关的内容。我们先看</font><font FACE="Times New Roman" SIZE="3">DIBLOOK</font><font SIZE="3">的文档声明和定义。<b></p>
<p>清单</font><font FACE="Times New Roman" SIZE="3">7-16 CDibDoc</font><font SIZE="3">的类声明文件</font></b><font FACE="Times New Roman" SIZE="3"></p>
<p>// dibdoc.h : interface of the CDibDoc class</p>
<p>#include "dibapi.h"</p>
<p>class CDibDoc : public CDocument</p>
<p>{</p>
<p>protected: // create from serialization only</p>
<p>CDibDoc();</p>
<p>DECLARE_DYNCREATE(CDibDoc)</p>
<p>// Attributes</p>
<p>public:</p>
<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p>HDIB GetHDIB() const</p>
<p>{ return m_hDIB; }</p>
<p>CPalette* GetDocPalette() const</p>
<p>{ return m_palDIB; }</p>
<p>CSize GetDocSize() const</p>
<p>{ return m_sizeDoc; }</p>
<p>// Operations</p>
<p>public:</p>
<p>void ReplaceHDIB(HDIB hDIB);</p>
<p>void InitDIBData();</b></p>
<p>// Implementation</p>
<p>protected:</p>
<p>virtual ~CDibDoc();</p>
<p>virtual BOOL OnSaveDocument(LPCTSTR lpszPathName);</p>
<p>virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);</p>
<p>protected:</p>
<p>HDIB m_hDIB;</p>
<p>CPalette* m_palDIB;</p>
<p>CSize m_sizeDoc;</p>
<p>#ifdef _DEBUG</p>
<p>virtual void AssertValid() const;</p>
<p>virtual void Dump(CDumpContext& dc) const;</p>
<p>#endif</p>
<p>protected:</p>
<p>virtual BOOL OnNewDocument();</p>
<p>// Generated message map functions</p>
<p>protected:</p>
<p>//{{AFX_MSG(CDibDoc)</p>
<p>//}}AFX_MSG</p>
<p>DECLARE_MESSAGE_MAP()</p>
<p>};</p>
<p>/////////////////////////////////////////////////////////////////////////////</font><b><font SIZE="3"></p>
<p>清单</font><font FACE="Times New Roman" SIZE="3">7-17 CDibDoc</font><font SIZE="3">类的实现文件</font></b><font FACE="Times New Roman" SIZE="3"></p>
<p>// dibdoc.cpp : implementation of the CDibDoc class</p>
<p>#include "stdafx.h"</p>
<p>#include "diblook.h"</p>
<p>#include <limits.h></p>
<p>#include "dibdoc.h"</p>
<p>#ifdef _DEBUG</p>
<p>#undef THIS_FILE</p>
<p>static char BASED_CODE THIS_FILE[] = __FILE__;</p>
<p>#endif</p>
<p>/////////////////////////////////////////////////////////////////////////////</p>
<p>// CDibDoc</p>
<p>IMPLEMENT_DYNCREATE(CDibDoc, CDocument)</p>
<p>BEGIN_MESSAGE_MAP(CDibDoc, CDocument)</p>
<p>//{{AFX_MSG_MAP(CDibDoc)</p>
<p>//}}AFX_MSG_MAP</p>
<p>END_MESSAGE_MAP()</p>
<p>/////////////////////////////////////////////////////////////////////////////</p>
<p>// CDibDoc construction/destruction</p>
<p>CDibDoc::CDibDoc()</p>
<p>{</p>
<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p>//</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>m_hDIB = NULL;</p>
<p>m_palDIB = NULL;</p>
<p>m_sizeDoc = CSize(1,1); // dummy value to make CScrollView happy</b></p>
<p>}</p>
<p>CDibDoc::~CDibDoc()</p>
<p>{</p>
<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p>if (m_hDIB != NULL)</p>
<p>{</p>
<p>::GlobalFree((HGLOBAL) m_hDIB);</p>
<p>}</p>
<p>if (m_palDIB != NULL)</p>
<p>{</p>
<p>delete m_palDIB;</p>
<p>}</b></p>
<p>}</p>
<p>BOOL CDibDoc::OnNewDocument()</p>
<p>{</p>
<p>if (!CDocument::OnNewDocument())</p>
<p>return FALSE;</p>
<p>return TRUE;</p>
<p>}</p>
<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p>void CDibDoc::InitDIBData()</p>
<p>{</p>
<p>if (m_palDIB != NULL)</p>
<p>{</p>
<p>delete m_palDIB;</p>
<p>m_palDIB = NULL;</p>
<p>}</p>
<p>if (m_hDIB == NULL)</p>
<p>{</p>
<p>return;</p>
<p>}</p>
<p>// Set up document size</p>
<p>LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_hDIB);</p>
<p>if (::DIBWidth(lpDIB) > INT_MAX ||::DIBHeight(lpDIB) > INT_MAX)</p>
<p>{</p>
<p>::GlobalUnlock((HGLOBAL) m_hDIB);</p>
<p>::GlobalFree((HGLOBAL) m_hDIB);</p>
<p>m_hDIB = NULL;</p>
<p>CString strMsg;</p>
<p>strMsg.LoadString(IDS_DIB_TOO_BIG);</p>
<p>MessageBox(NULL, strMsg, NULL, MB_ICONINFORMATION | MB_OK);</p>
<p>return;</p>
<p>}</p>
<p>m_sizeDoc = CSize((int) ::DIBWidth(lpDIB), (int) ::DIBHeight(lpDIB));</p>
<p>::GlobalUnlock((HGLOBAL) m_hDIB);</p>
<p>// Create copy of palette</p>
<p>m_palDIB = new CPalette;</p>
<p>if (m_palDIB == NULL)</p>
<p>{</p>
<p>// we must be really low on memory</p>
<p>::GlobalFree((HGLOBAL) m_hDIB);</p>
<p>m_hDIB = NULL;</p>
<p>return;</p>
<p>}</p>
<p>if (::CreateDIBPalette(m_hDIB, m_palDIB) == NULL)</p>
<p>{</p>
<p>// DIB may not have a palette</p>
<p>delete m_palDIB;</p>
<p>m_palDIB = NULL;</p>
<p>return;</p>
<p>}</p>
<p>}</b></p>
<p></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p>BOOL CDibDoc::OnOpenDocument(LPCTSTR lpszPathName)</p>
<p>{</p>
<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p>CFile file;</p>
<p>CFileException fe;</p>
<p>if (!file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite, &fe))</p>
<p>{</p>
<p>ReportSaveLoadException(lpszPathName, &fe,</p>
<p>FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);</p>
<p>return FALSE;</p>
<p>}</p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -