TypeRecDoc.cpp
上传用户:renhuadsj
上传日期:2008-11-19
资源大小:1466k
文件大小:8k
源码类别:

图形图象

开发平台:

Visual C++

  1. // TypeRecDoc.cpp : implementation of the CTypeRecDoc class
  2. //
  3. #include "stdafx.h"
  4. #include "TypeRec.h"
  5. #include "TypeRecDoc.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CTypeRecDoc
  13. IMPLEMENT_DYNCREATE(CTypeRecDoc, CDocument)
  14. BEGIN_MESSAGE_MAP(CTypeRecDoc, CDocument)
  15. //{{AFX_MSG_MAP(CTypeRecDoc)
  16. ON_COMMAND(ID_FILE_REOPEN, OnFileReopen)
  17. //}}AFX_MSG_MAP
  18. END_MESSAGE_MAP()
  19. /////////////////////////////////////////////////////////////////////////////
  20. // CTypeRecDoc construction/destruction
  21. CTypeRecDoc::CTypeRecDoc()
  22. {
  23. // 默认背景色,灰色
  24. m_refColorBKG = 0x00808080;
  25. // 初始化变量
  26. m_hDIB = NULL;
  27. m_palDIB = NULL;
  28. m_sizeDoc = CSize(1,1);
  29. }
  30. CTypeRecDoc::~CTypeRecDoc()
  31. {
  32. // 判断DIB对象是否存在
  33. if (m_hDIB != NULL)
  34. {
  35. // 清除DIB对象
  36. ::GlobalFree((HGLOBAL) m_hDIB);
  37. }
  38. // 判断调色板是否存在
  39. if (m_palDIB != NULL)
  40. {
  41. // 清除调色板
  42. delete m_palDIB;
  43. }
  44. }
  45. BOOL CTypeRecDoc::OnNewDocument()
  46. {
  47. if (!CDocument::OnNewDocument())
  48. return FALSE;
  49. // TODO: add reinitialization code here
  50. // (SDI documents will reuse this document)
  51. return TRUE;
  52. }
  53. /////////////////////////////////////////////////////////////////////////////
  54. // CTypeRecDoc serialization
  55. void CTypeRecDoc::Serialize(CArchive& ar)
  56. {
  57. if (ar.IsStoring())
  58. {
  59. // TODO: add storing code here
  60. }
  61. else
  62. {
  63. // TODO: add loading code here
  64. }
  65. }
  66. /////////////////////////////////////////////////////////////////////////////
  67. // CTypeRecDoc diagnostics
  68. #ifdef _DEBUG
  69. void CTypeRecDoc::AssertValid() const
  70. {
  71. CDocument::AssertValid();
  72. }
  73. void CTypeRecDoc::Dump(CDumpContext& dc) const
  74. {
  75. CDocument::Dump(dc);
  76. }
  77. #endif //_DEBUG
  78. /////////////////////////////////////////////////////////////////////////////
  79. // CTypeRecDoc commands
  80. BOOL CTypeRecDoc::OnOpenDocument(LPCTSTR lpszPathName) 
  81. {
  82. CFile file;
  83. CFileException fe;
  84. // 打开文件
  85. if (!file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite, &fe))
  86. {
  87. // 失败
  88. ReportSaveLoadException(lpszPathName, &fe,
  89. FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
  90. // 返回FALSE
  91. return FALSE;
  92. }
  93. DeleteContents();
  94. // 更改光标形状
  95. BeginWaitCursor();
  96. // 尝试调用ReadDIBFile()读取图像
  97. TRY
  98. {
  99. m_hDIB = ::ReadDIBFile(file);
  100. }
  101. CATCH (CFileException, eLoad)
  102. {
  103. // 读取失败
  104. file.Abort();
  105. // 恢复光标形状
  106. EndWaitCursor();
  107. // 报告失败
  108. ReportSaveLoadException(lpszPathName, eLoad,
  109. FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
  110. // 设置DIB为空
  111. m_hDIB = NULL;
  112. // 返回FALSE
  113. return FALSE;
  114. }
  115. END_CATCH
  116. // 初始化DIB
  117. InitDIBData();
  118. // 恢复光标形状
  119. EndWaitCursor();
  120. // 判断读取文件是否成功
  121. if (m_hDIB == NULL)
  122. {
  123. // 失败,可能非BMP格式
  124. CString strMsg;
  125. strMsg = "读取图像时出错!可能是不支持该类型的图像文件!";
  126. // 提示出错
  127. MessageBox(NULL, strMsg, "系统提示", MB_ICONINFORMATION | MB_OK);
  128. // 返回FALSE
  129. return FALSE;
  130. }
  131. // 设置文件名称
  132. SetPathName(lpszPathName);
  133. // 初始化胀标记为FALSE
  134. SetModifiedFlag(FALSE);
  135. // 返回TRUE
  136. return TRUE;
  137. }
  138. void CTypeRecDoc::InitDIBData()
  139. {
  140. // 初始化DIB对象
  141. // 判断调色板是否为空
  142. if (m_palDIB != NULL)
  143. {
  144. // 删除调色板对象
  145. delete m_palDIB;
  146. // 重置调色板为空
  147. m_palDIB = NULL;
  148. }
  149. // 如果DIB对象为空,直接返回
  150. if (m_hDIB == NULL)
  151. {
  152. // 返回
  153. return;
  154. }
  155. LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_hDIB);
  156. // 判断图像是否过大
  157. if (::DIBWidth(lpDIB) > INT_MAX ||::DIBHeight(lpDIB) > INT_MAX)
  158. {
  159. ::GlobalUnlock((HGLOBAL) m_hDIB);
  160. // 释放DIB对象
  161. ::GlobalFree((HGLOBAL) m_hDIB);
  162. // 设置DIB为空
  163. m_hDIB = NULL;
  164. CString strMsg;
  165. strMsg = "BMP图像太大!";
  166. // 提示用户
  167. MessageBox(NULL, strMsg, "系统提示", MB_ICONINFORMATION | MB_OK);
  168. // 返回
  169. return;
  170. }
  171. // 设置文档大小
  172. m_sizeDoc = CSize((int) ::DIBWidth(lpDIB), (int) ::DIBHeight(lpDIB));
  173. ::GlobalUnlock((HGLOBAL) m_hDIB);
  174. // 创建新调色板
  175. m_palDIB = new CPalette;
  176. // 判断是否创建成功
  177. if (m_palDIB == NULL)
  178. {
  179. // 失败,可能是内存不足
  180. ::GlobalFree((HGLOBAL) m_hDIB);
  181. // 设置DIB对象为空
  182. m_hDIB = NULL;
  183. // 返回
  184. return;
  185. }
  186. // 调用CreateDIBPalette来创建调色板
  187. if (::CreateDIBPalette(m_hDIB, m_palDIB) == NULL)
  188. {
  189. // 返回空,可能该DIB对象没有调色板
  190. // 删除
  191. delete m_palDIB;
  192. // 设置为空
  193. m_palDIB = NULL;
  194. // 返回
  195. return;
  196. }
  197. }
  198. BOOL CTypeRecDoc::OnSaveDocument(LPCTSTR lpszPathName) 
  199. {
  200. CFile file;
  201. CFileException fe;
  202. // 打开文件
  203. if (!file.Open(lpszPathName, CFile::modeCreate |
  204.   CFile::modeReadWrite | CFile::shareExclusive, &fe))
  205. {
  206. // 失败
  207. ReportSaveLoadException(lpszPathName, &fe,
  208. TRUE, AFX_IDP_INVALID_FILENAME);
  209. // 返回FALSE
  210. return FALSE;
  211. }
  212. // 尝试调用SaveDIB保存图像
  213. BOOL bSuccess = FALSE;
  214. TRY
  215. {
  216. // 更改光标形状
  217. BeginWaitCursor();
  218. // 尝试保存图像
  219. bSuccess = ::SaveDIB(m_hDIB, file);
  220. // 关闭文件
  221. file.Close();
  222. }
  223. CATCH (CException, eSave)
  224. {
  225. // 失败
  226. file.Abort();
  227. // 恢复光标形状
  228. EndWaitCursor();
  229. ReportSaveLoadException(lpszPathName, eSave,
  230. TRUE, AFX_IDP_FAILED_TO_SAVE_DOC);
  231. // 返回FALSE
  232. return FALSE;
  233. }
  234. END_CATCH
  235. // 恢复光标形状
  236. EndWaitCursor();
  237. // 重置胀标记为FALSE
  238. SetModifiedFlag(FALSE);
  239. if (!bSuccess)
  240. {
  241. // 保存失败,可能是其它格式的DIB,可以读取但是不能保存
  242. // 或者是SaveDIB函数有误
  243. CString strMsg;
  244. strMsg = "无法保存BMP图像!";
  245. // 提示出错
  246. MessageBox(NULL, strMsg, "系统提示", MB_ICONINFORMATION | MB_OK);
  247. }
  248. return bSuccess;
  249. }
  250. void CTypeRecDoc::ReplaceHDIB(HDIB hDIB)
  251. {
  252. // 替换DIB,在功能粘贴中用到该函数
  253. // 判断DIB是否为空
  254. if (m_hDIB != NULL)
  255. {
  256. // 非空,则清除
  257. ::GlobalFree((HGLOBAL) m_hDIB);
  258. }
  259. // 替换成新的DIB对象
  260. m_hDIB = hDIB;
  261. }
  262. void CTypeRecDoc::OnFileReopen() 
  263. {
  264. // 重新打开图像,放弃所有修改
  265.  
  266. // 判断当前图像是否已经被改动
  267. if (IsModified())
  268. {
  269. // 提示用户该操作将丢失所有当前的修改
  270. if (MessageBox(NULL, "重新打开图像将丢失所有改动!是否继续?", "系统提示", MB_ICONQUESTION | MB_YESNO) == IDNO)
  271. {
  272. // 用户取消操作,直接返回
  273. return;
  274. }
  275. }
  276. CFile file;
  277.   CFileException fe;
  278.  
  279.   CString strPathName;
  280.   
  281. // 获取当前文件路径
  282.   strPathName = GetPathName();
  283.  
  284.   // 重新打开文件
  285.   if (!file.Open(strPathName, CFile::modeRead | CFile::shareDenyWrite, &fe))
  286.   {
  287.   // 失败
  288.   ReportSaveLoadException(strPathName, &fe,
  289.   FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
  290.  
  291.   // 返回
  292.   return;
  293.   }
  294.  
  295.   // 更改光标形状
  296.   BeginWaitCursor();
  297.  
  298.   // 尝试调用ReadDIBFile()读取图像
  299.   TRY
  300.   {
  301.   m_hDIB = ::ReadDIBFile(file);
  302.   }
  303.   CATCH (CFileException, eLoad)
  304.   {
  305.   // 读取失败
  306.   file.Abort();
  307.  
  308.   // 恢复光标形状
  309.   EndWaitCursor();
  310.  
  311.   // 报告失败
  312.   ReportSaveLoadException(strPathName, eLoad,
  313.   FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
  314.  
  315.   // 设置DIB为空
  316.   m_hDIB = NULL;
  317.  
  318.   // 返回
  319.   return;
  320.   }
  321.   END_CATCH
  322.  
  323.   // 初始化DIB
  324.   InitDIBData();
  325.  
  326.   // 判断读取文件是否成功
  327.   if (m_hDIB == NULL)
  328.   {
  329.   // 失败,可能非BMP格式
  330.   CString strMsg;
  331.   strMsg = "读取图像时出错!可能是不支持该类型的图像文件!";
  332.  
  333.   // 提示出错
  334.   MessageBox(NULL, strMsg, "系统提示", MB_ICONINFORMATION | MB_OK);
  335.   
  336.   // 恢复光标形状
  337.   EndWaitCursor();
  338.  
  339.   // 返回
  340.   return;
  341.   }
  342.  
  343.   // 初始化胀标记为FALSE
  344.   SetModifiedFlag(FALSE);
  345.  
  346.   // 刷新
  347.   UpdateAllViews(NULL);
  348.   
  349.   // 恢复光标形状
  350.   EndWaitCursor();
  351.   // 返回
  352.   return;
  353. }