DIBDOC.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:5k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // dibdoc.cpp : implementation of the CDibDoc class
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1998 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12. #include "stdafx.h"
  13. #include "diblook.h"
  14. #include <limits.h>
  15. #include "dibdoc.h"
  16. #ifdef _DEBUG
  17. #undef THIS_FILE
  18. static char BASED_CODE THIS_FILE[] = __FILE__;
  19. #endif
  20. /////////////////////////////////////////////////////////////////////////////
  21. // CDibDoc
  22. IMPLEMENT_DYNCREATE(CDibDoc, CDocument)
  23. BEGIN_MESSAGE_MAP(CDibDoc, CDocument)
  24. //{{AFX_MSG_MAP(CDibDoc)
  25. //}}AFX_MSG_MAP
  26. END_MESSAGE_MAP()
  27. /////////////////////////////////////////////////////////////////////////////
  28. // CDibDoc construction/destruction
  29. CDibDoc::CDibDoc()
  30. {
  31. m_hDIB = NULL;
  32. m_palDIB = NULL;
  33. m_sizeDoc = CSize(1,1);     // dummy value to make CScrollView happy
  34. }
  35. CDibDoc::~CDibDoc()
  36. {
  37. if (m_hDIB != NULL)
  38. {
  39. ::GlobalFree((HGLOBAL) m_hDIB);
  40. }
  41. if (m_palDIB != NULL)
  42. {
  43. delete m_palDIB;
  44. }
  45. }
  46. BOOL CDibDoc::OnNewDocument()
  47. {
  48. if (!CDocument::OnNewDocument())
  49. return FALSE;
  50. return TRUE;
  51. }
  52. void CDibDoc::InitDIBData()
  53. {
  54. if (m_palDIB != NULL)
  55. {
  56. delete m_palDIB;
  57. m_palDIB = NULL;
  58. }
  59. if (m_hDIB == NULL)
  60. {
  61. return;
  62. }
  63. // Set up document size
  64. LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_hDIB);
  65. if (::DIBWidth(lpDIB) > INT_MAX ||::DIBHeight(lpDIB) > INT_MAX)
  66. {
  67. ::GlobalUnlock((HGLOBAL) m_hDIB);
  68. ::GlobalFree((HGLOBAL) m_hDIB);
  69. m_hDIB = NULL;
  70. CString strMsg;
  71. strMsg.LoadString(IDS_DIB_TOO_BIG);
  72. MessageBox(NULL, strMsg, NULL, MB_ICONINFORMATION | MB_OK);
  73. return;
  74. }
  75. m_sizeDoc = CSize((int) ::DIBWidth(lpDIB), (int) ::DIBHeight(lpDIB));
  76. ::GlobalUnlock((HGLOBAL) m_hDIB);
  77. // Create copy of palette
  78. m_palDIB = new CPalette;
  79. if (m_palDIB == NULL)
  80. {
  81. // we must be really low on memory
  82. ::GlobalFree((HGLOBAL) m_hDIB);
  83. m_hDIB = NULL;
  84. return;
  85. }
  86. if (::CreateDIBPalette(m_hDIB, m_palDIB) == NULL)
  87. {
  88. // DIB may not have a palette
  89. delete m_palDIB;
  90. m_palDIB = NULL;
  91. return;
  92. }
  93. }
  94. BOOL CDibDoc::OnOpenDocument(LPCTSTR lpszPathName)
  95. {
  96. CFile file;
  97. CFileException fe;
  98. if (!file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite, &fe))
  99. {
  100. ReportSaveLoadException(lpszPathName, &fe,
  101. FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
  102. return FALSE;
  103. }
  104. DeleteContents();
  105. BeginWaitCursor();
  106. // replace calls to Serialize with ReadDIBFile function
  107. TRY
  108. {
  109. m_hDIB = ::ReadDIBFile(file);
  110. }
  111. CATCH (CFileException, eLoad)
  112. {
  113. file.Abort(); // will not throw an exception
  114. EndWaitCursor();
  115. ReportSaveLoadException(lpszPathName, eLoad,
  116. FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
  117. m_hDIB = NULL;
  118. return FALSE;
  119. }
  120. END_CATCH
  121. InitDIBData();
  122. EndWaitCursor();
  123. if (m_hDIB == NULL)
  124. {
  125. // may not be DIB format
  126. CString strMsg;
  127. strMsg.LoadString(IDS_CANNOT_LOAD_DIB);
  128. MessageBox(NULL, strMsg, NULL, MB_ICONINFORMATION | MB_OK);
  129. return FALSE;
  130. }
  131. SetPathName(lpszPathName);
  132. SetModifiedFlag(FALSE);     // start off with unmodified
  133. return TRUE;
  134. }
  135. BOOL CDibDoc::OnSaveDocument(LPCTSTR lpszPathName)
  136. {
  137. CFile file;
  138. CFileException fe;
  139. if (!file.Open(lpszPathName, CFile::modeCreate |
  140.   CFile::modeReadWrite | CFile::shareExclusive, &fe))
  141. {
  142. ReportSaveLoadException(lpszPathName, &fe,
  143. TRUE, AFX_IDP_INVALID_FILENAME);
  144. return FALSE;
  145. }
  146. // replace calls to Serialize with SaveDIB function
  147. BOOL bSuccess = FALSE;
  148. TRY
  149. {
  150. BeginWaitCursor();
  151. bSuccess = ::SaveDIB(m_hDIB, file);
  152. file.Close();
  153. }
  154. CATCH (CException, eSave)
  155. {
  156. file.Abort(); // will not throw an exception
  157. EndWaitCursor();
  158. ReportSaveLoadException(lpszPathName, eSave,
  159. TRUE, AFX_IDP_FAILED_TO_SAVE_DOC);
  160. return FALSE;
  161. }
  162. END_CATCH
  163. EndWaitCursor();
  164. SetModifiedFlag(FALSE);     // back to unmodified
  165. if (!bSuccess)
  166. {
  167. // may be other-style DIB (load supported but not save)
  168. //  or other problem in SaveDIB
  169. CString strMsg;
  170. strMsg.LoadString(IDS_CANNOT_SAVE_DIB);
  171. MessageBox(NULL, strMsg, NULL, MB_ICONINFORMATION | MB_OK);
  172. }
  173. return bSuccess;
  174. }
  175. void CDibDoc::ReplaceHDIB(HDIB hDIB)
  176. {
  177. if (m_hDIB != NULL)
  178. {
  179. ::GlobalFree((HGLOBAL) m_hDIB);
  180. }
  181. m_hDIB = hDIB;
  182. }
  183. /////////////////////////////////////////////////////////////////////////////
  184. // CDibDoc diagnostics
  185. #ifdef _DEBUG
  186. void CDibDoc::AssertValid() const
  187. {
  188. CDocument::AssertValid();
  189. }
  190. void CDibDoc::Dump(CDumpContext& dc) const
  191. {
  192. CDocument::Dump(dc);
  193. }
  194. #endif //_DEBUG
  195. /////////////////////////////////////////////////////////////////////////////
  196. // CDibDoc commands