CBIRDoc.cpp
上传用户:xayxjz
上传日期:2022-08-07
资源大小:2188k
文件大小:5k
源码类别:

图形图象

开发平台:

Visual C++

  1. // CBIRDoc.cpp : implementation of the CCBIRDoc class
  2. //
  3. #include "stdafx.h"
  4. #include "CBIR.h"
  5. #include "CBIRDoc.h"
  6. #include "MainFrm.h"
  7. #include "ChildFrm.h"
  8. #include "CBIRView.h"
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. //外部变量声明
  15. extern char szFilter[];
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CCBIRDoc
  18. IMPLEMENT_DYNCREATE(CCBIRDoc, CDocument)
  19. BEGIN_MESSAGE_MAP(CCBIRDoc, CDocument)
  20. //{{AFX_MSG_MAP(CCBIRDoc)
  21. ON_COMMAND(ID_FILE_NEW, OnFileNew)
  22. ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
  23. ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs)
  24. //}}AFX_MSG_MAP
  25. END_MESSAGE_MAP()
  26. /////////////////////////////////////////////////////////////////////////////
  27. // CCBIRDoc construction/destruction
  28. CCBIRDoc::CCBIRDoc()
  29. {
  30. // TODO: add one-time construction code here
  31. m_pDibObject = NULL;
  32. m_bImageLoaded = FALSE;
  33. }
  34. CCBIRDoc::~CCBIRDoc()
  35. {
  36. if(m_pDibObject != NULL)
  37. {
  38. delete m_pDibObject;
  39. m_pDibObject = NULL;
  40. }
  41. }
  42. BOOL CCBIRDoc::OnNewDocument()
  43. {
  44. if (!CDocument::OnNewDocument())
  45. return FALSE;
  46. // TODO: add reinitialization code here
  47. // (SDI documents will reuse this document)
  48. return TRUE;
  49. }
  50. /////////////////////////////////////////////////////////////////////////////
  51. // CCBIRDoc serialization
  52. void CCBIRDoc::Serialize(CArchive& ar)
  53. {
  54. if (ar.IsStoring())
  55. {
  56. // TODO: add storing code here
  57. }
  58. else
  59. {
  60. // TODO: add loading code here
  61. }
  62. }
  63. /////////////////////////////////////////////////////////////////////////////
  64. // CCBIRDoc diagnostics
  65. #ifdef _DEBUG
  66. void CCBIRDoc::AssertValid() const
  67. {
  68. CDocument::AssertValid();
  69. }
  70. void CCBIRDoc::Dump(CDumpContext& dc) const
  71. {
  72. CDocument::Dump(dc);
  73. }
  74. #endif //_DEBUG
  75. /////////////////////////////////////////////////////////////////////////////
  76. // CCBIRDoc commands
  77. void CCBIRDoc::OnFileNew() 
  78. {
  79. // TODO: Add your command handler code here
  80. }
  81. void CCBIRDoc::OnFileOpen() 
  82. {
  83. static int nIndex = 1;
  84. CFileDialog FileDlg( TRUE, NULL, NULL, OFN_HIDEREADONLY, szFilter );
  85. FileDlg.m_ofn.nFilterIndex = (DWORD) nIndex;
  86. if( FileDlg.DoModal() == IDOK )
  87. {
  88. CString strPathName = FileDlg.GetPathName();
  89. AfxGetApp()->OpenDocumentFile( strPathName );
  90. nIndex = (int) FileDlg.m_ofn.nFilterIndex;
  91. if( !ReadImgToDoc() )
  92. {
  93. AfxMessageBox("无法载入图像文件!");
  94. return;
  95. }
  96. }
  97. }
  98. BOOL CCBIRDoc::ReadImgToDoc()
  99. {
  100. CString strPathName = GetPathName();
  101. //设置等待光标
  102. BeginWaitCursor();
  103. m_pDibObject = new CDibObject( strPathName.GetBuffer(3) );
  104. //取消等待光标
  105. EndWaitCursor();
  106. //读入图像文件失败
  107. if( m_pDibObject == NULL )
  108. {
  109. AfxMessageBox("无法创建图像类对象!");
  110. //返回FALSE
  111. return(FALSE);
  112. }
  113. //读入图像文件成功,设置相应变量
  114. m_bImageLoaded = TRUE;
  115. //返回TRUE
  116. return(TRUE);
  117. }
  118. void CCBIRDoc::OnFileSaveAs() 
  119. {
  120. // TODO: Add your command handler code here
  121. static int nIndex = 1;
  122. CFileDialog DialogSaveAs( FALSE, NULL, m_pDibObject->GetImageName(),
  123.                       OFN_HIDEREADONLY, szFilter );
  124. DialogSaveAs.m_ofn.nFilterIndex = (DWORD) nIndex;
  125. if( DialogSaveAs.DoModal() == IDOK )
  126. {
  127. CMainFrame *pMainFrame = ( CMainFrame *)AfxGetMainWnd();
  128. CChildFrame *pChildFrame = ( CChildFrame *)pMainFrame->MDIGetActive();
  129. CCBIRView *pCBIRView = ( CCBIRView * )pChildFrame->GetActiveView();
  130. nIndex = (int) DialogSaveAs.m_ofn.nFilterIndex;
  131. //是JPEG格式图像,判断其是否为24位真彩色图像
  132. if( nIndex == 5 )
  133. {
  134. if( m_pDibObject->GetNumBits() != 24 )
  135. {
  136. AfxMessageBox("只有24位真彩色图像才能存为JPEG格式!");
  137. return;
  138. }
  139. }
  140. //CDibObject类中有图像才能保存
  141. if( m_pDibObject != NULL )
  142. {
  143. //获取指定的文件名(含路径名)
  144. CString strPathName = DialogSaveAs.GetPathName();
  145. int nFindIndex = strPathName.Find(".");
  146. if( nFindIndex != -1)
  147. strPathName = strPathName.Left( nFindIndex );
  148. //加上指定的扩展名以构成完整文件名
  149. strPathName += CDibObject::szExtensions[ nIndex - 1 ];
  150. //调用CDibObject类成员函数Save()保存图像
  151. m_pDibObject->Save( strPathName );
  152. //设置窗口标题
  153. CString strFileName = DialogSaveAs.GetFileName();
  154. nFindIndex = strFileName.Find(".");
  155. if ( nFindIndex != -1 )
  156. strFileName = strFileName.Left( nFindIndex );
  157. strFileName += CDibObject::szExtensions[ nIndex - 1 ];
  158. pChildFrame->SetWindowText( strFileName );
  159. SetPathName( strPathName );
  160. //若保存为JPEG图像,重新将图像载入并更新视图的显示
  161. if( nIndex == 5 )
  162. {
  163. m_pDibObject->Load( strPathName );
  164. pCBIRView->InvalidateRect( NULL, FALSE );
  165. pCBIRView->UpdateWindow();
  166. }
  167. }
  168. }
  169. }