DEMODOC.CPP
上传用户:wep9318
上传日期:2007-01-07
资源大小:893k
文件大小:6k
源码类别:

图片显示

开发平台:

Visual C++

  1. // demoDoc.cpp : implementation of the CDemoDoc class
  2. //
  3. #include "stdafx.h"
  4. #include "demo.h"
  5. #include "demoDoc.h"
  6. #include "cimage.h"
  7. #include <math.h>
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CDemoDoc
  15. IMPLEMENT_DYNCREATE(CDemoDoc, CDocument)
  16. BEGIN_MESSAGE_MAP(CDemoDoc, CDocument)
  17. //{{AFX_MSG_MAP(CDemoDoc)
  18. ON_UPDATE_COMMAND_UI(ID_FILE_SAVE_AS, OnUpdateFileSaveAs)
  19. ON_UPDATE_COMMAND_UI(ID_FILE_SAVE, OnUpdateFileSave)
  20. ON_COMMAND(ID_STRETCH_MODE, OnStretchMode)
  21. ON_UPDATE_COMMAND_UI(ID_STRETCH_MODE, OnUpdateStretchMode)
  22. ON_COMMAND(ID_TRANSFORM_ELLIPSE, OnTransformEllipse)
  23. //}}AFX_MSG_MAP
  24. END_MESSAGE_MAP()
  25. /////////////////////////////////////////////////////////////////////////////
  26. // CDemoDoc construction/destruction
  27. CDemoDoc::CDemoDoc()
  28. {
  29. image = NULL;
  30. stretchMode = FALSE;
  31. }
  32. CDemoDoc::~CDemoDoc()
  33. {
  34. delete image;
  35. }
  36. BOOL CDemoDoc::OnNewDocument()
  37. {
  38. if (!CDocument::OnNewDocument())
  39. return FALSE;
  40. // TODO: add reinitialization code here
  41. // (SDI documents will reuse this document)
  42. image = NULL;
  43. return TRUE;
  44. }
  45. /////////////////////////////////////////////////////////////////////////////
  46. // CDemoDoc serialization
  47. void CDemoDoc::Serialize(CArchive& ar)
  48. {
  49. if (ar.IsStoring())
  50. {
  51. }
  52. else
  53. {
  54. }
  55. }
  56. /////////////////////////////////////////////////////////////////////////////
  57. // CDemoDoc diagnostics
  58. #ifdef _DEBUG
  59. void CDemoDoc::AssertValid() const
  60. {
  61. CDocument::AssertValid();
  62. }
  63. void CDemoDoc::Dump(CDumpContext& dc) const
  64. {
  65. CDocument::Dump(dc);
  66. }
  67. #endif //_DEBUG
  68. /////////////////////////////////////////////////////////////////////////////
  69. // CDemoDoc commands
  70. static CString FindExtension(const CString& name)
  71. {
  72. int len = name.GetLength();
  73. int i;
  74. for (i = len-1; i >= 0; i--)
  75. {
  76. if (name[i] == '.')
  77. {
  78. return name.Mid(i+1);
  79. }
  80. }
  81. return CString("");
  82. }
  83. BOOL CDemoDoc::OnOpenDocument(LPCTSTR lpszPathName) 
  84. {
  85. CString filename(lpszPathName);
  86. CString ext(FindExtension(filename));
  87. ext.MakeLower();
  88. if (ext == "")
  89. return FALSE;
  90. int type = 0;
  91. if (ext == "jpg" || ext == "jpeg")
  92. {
  93. type = CIMAGE_FORMAT_JPEG;
  94. }
  95. else if (ext == "gif")
  96. {
  97. type = CIMAGE_FORMAT_GIF;
  98. }
  99. else if (ext == "png")
  100. {
  101. type = CIMAGE_FORMAT_PNG;
  102. }
  103. else if (ext == "bmp")
  104. {
  105. type = CIMAGE_FORMAT_BMP;
  106. }
  107. else
  108. return FALSE;
  109. image = new CImage(filename, type);
  110. if (image->GetWidth() <= 0 || image->GetHeight() <= 0)
  111. {
  112. delete image;
  113. image = NULL;
  114. return FALSE;
  115. }
  116. return TRUE;
  117. }
  118. BOOL CDemoDoc::OnSaveDocument(LPCTSTR lpszPathName) 
  119. {
  120. CString filename(lpszPathName);
  121. CString ext(FindExtension(filename));
  122. ext.MakeLower();
  123. if (ext == "")
  124. return FALSE;
  125. int type = 0;
  126. if (ext == "jpg" || ext == "jpeg")
  127. {
  128. type = CIMAGE_FORMAT_JPEG;
  129. }
  130. else if (ext == "gif")
  131. {
  132. type = CIMAGE_FORMAT_GIF;
  133. }
  134. else if (ext == "png")
  135. {
  136. type = CIMAGE_FORMAT_PNG;
  137. }
  138. else if (ext == "bmp")
  139. {
  140. type = CIMAGE_FORMAT_BMP;
  141. }
  142. else
  143. return FALSE;
  144. if (image)
  145. return image->SaveFile(filename, type);
  146. else
  147. return FALSE;
  148. }
  149. BOOL CDemoDoc::DoSave(LPCTSTR pszPathName, BOOL bReplace /*=TRUE*/)
  150. {
  151. if (!image)
  152. return FALSE;
  153. CString newName = pszPathName;
  154. BOOL bModified = IsModified();
  155. BOOL bSaveAs = FALSE;
  156. if (newName.IsEmpty())
  157. bSaveAs = TRUE;
  158. else if (!theApp.GetWritableType(image->GetFileType()))
  159. bSaveAs = TRUE;
  160. if (bSaveAs)
  161. {
  162. newName = m_strPathName;
  163. if (bReplace && newName.IsEmpty())
  164. {
  165. newName = m_strTitle;
  166. int iBad = newName.FindOneOf(_T(" #%;/\"));    // dubious filename
  167. if (iBad != -1)
  168. newName.ReleaseBuffer(iBad);
  169. // append the default suffix if there is one
  170. newName += theApp.GetExtFromType(image->GetFileType());
  171. }
  172. int nDocType = image->GetFileType();
  173. if (!theApp.PromptForFileName(newName, 
  174. bReplace ? AFX_IDS_SAVEFILE : AFX_IDS_SAVEFILECOPY,
  175. OFN_HIDEREADONLY | OFN_PATHMUSTEXIST, FALSE, &nDocType))
  176. {
  177. return FALSE;       // don't even try to save
  178. }
  179. }
  180. BeginWaitCursor();
  181. if (!OnSaveDocument(newName))
  182. {
  183. if (pszPathName == NULL)
  184. {
  185. // be sure to delete the file
  186. TRY 
  187. {
  188. CFile::Remove(newName);
  189. }
  190. CATCH_ALL(e)
  191. {
  192. TRACE0("Warning: failed to delete file after failed SaveAsn");
  193. }
  194. END_CATCH_ALL
  195. }
  196. EndWaitCursor();
  197. return FALSE;
  198. }
  199. EndWaitCursor();
  200. if (bReplace)
  201. {
  202. // Reset the title and change the document name
  203. SetPathName(newName, TRUE);
  204. ASSERT(m_strPathName == newName);       // must be set
  205. }
  206. else // SaveCopyAs
  207. {
  208. SetModifiedFlag(bModified);
  209. }
  210. return TRUE;        // success
  211. }
  212. #define EPSILON (0.0000001)
  213. int CDemoDoc::ComputePixel(float x, float y, float &x1, float &y1)
  214. {
  215.   float r, nn;
  216.   if (x==0 && y==0) {
  217.  x1 = x;
  218.  y1 = y;
  219.  return 1;
  220.   }
  221.   nn = (float)sqrt(x*x + y*y);
  222.   r = (float) (fabs(x) > fabs(y)) ? fabs(nn/x): fabs(nn/y);
  223.   x1 = (r*x);
  224.   y1 = (r*y);
  225.   return 1;
  226. }
  227. void CDemoDoc::ComputeNewImage(void)
  228. {
  229.   CWaitCursor wait;
  230.   int x, y, x1, y1;
  231.   float fx, fy, xmid, ymid, ar;
  232.   CImage *image2 = new CImage(image);
  233.   xmid = (float) (image->GetWidth()/2.0);
  234.   ymid = (float) (image->GetHeight()/2.0);
  235.   ar = (float)(image->GetHeight())/(float)(image->GetWidth());
  236.   for (y=0; y<image->GetHeight(); y++) {
  237.  for (x=0; x<image->GetWidth(); x++) {
  238. ComputePixel(ar*(x-xmid), y-ymid, fx, fy);
  239. x1 = (int)(xmid+fx/ar);
  240. y1 = (int)(ymid+fy);
  241. if (image->Inside(x1, y1))
  242.   image2->SetIndex(x, y, image->GetIndex(x1, y1));
  243. else
  244.   image2->SetIndex(x, y, 0);
  245.  }
  246.   }
  247.   delete image;
  248.   image = image2;
  249.   UpdateAllViews(NULL);
  250. }
  251. void CDemoDoc::OnUpdateFileSaveAs(CCmdUI* pCmdUI) 
  252. {
  253. pCmdUI->Enable((image != NULL));
  254. }
  255. void CDemoDoc::OnUpdateFileSave(CCmdUI* pCmdUI) 
  256. {
  257. pCmdUI->Enable((image != NULL) &&
  258. theApp.GetWritableType(image->GetFileType()));
  259. }
  260. void CDemoDoc::OnStretchMode() 
  261. {
  262. stretchMode = !stretchMode;
  263. UpdateAllViews(NULL);
  264. }
  265. void CDemoDoc::OnUpdateStretchMode(CCmdUI* pCmdUI) 
  266. {
  267. pCmdUI->SetCheck(stretchMode);
  268. pCmdUI->Enable(TRUE);
  269. }
  270. void CDemoDoc::OnTransformEllipse() 
  271. {
  272. ComputeNewImage();
  273. UpdateAllViews(NULL);
  274. }