PlateLocateDoc.cpp
上传用户:sgmlaoniu
上传日期:2013-03-16
资源大小:403k
文件大小:8k
源码类别:

Windows编程

开发平台:

Visual C++

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