⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demodoc.cpp

📁 深入剖析Visual C++编程技术及应用实例
💻 CPP
字号:
// demoDoc.cpp : implementation of the CDemoDoc class
//

#include "stdafx.h"
#include "demo.h"

#include "demoDoc.h"
#include "cimage.h"
#include <math.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDemoDoc

IMPLEMENT_DYNCREATE(CDemoDoc, CDocument)

BEGIN_MESSAGE_MAP(CDemoDoc, CDocument)
	//{{AFX_MSG_MAP(CDemoDoc)
	ON_UPDATE_COMMAND_UI(ID_FILE_SAVE_AS, OnUpdateFileSaveAs)
	ON_UPDATE_COMMAND_UI(ID_FILE_SAVE, OnUpdateFileSave)
	ON_COMMAND(ID_STRETCH_MODE, OnStretchMode)
	ON_UPDATE_COMMAND_UI(ID_STRETCH_MODE, OnUpdateStretchMode)
	ON_COMMAND(ID_TRANSFORM_ELLIPSE, OnTransformEllipse)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDemoDoc construction/destruction

CDemoDoc::CDemoDoc()
{
	image = NULL;
	stretchMode = FALSE;
}

CDemoDoc::~CDemoDoc()
{
	delete image;
}

BOOL CDemoDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)
	image = NULL;

	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CDemoDoc serialization

void CDemoDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
	}
	else
	{
	}
}

/////////////////////////////////////////////////////////////////////////////
// CDemoDoc diagnostics

#ifdef _DEBUG
void CDemoDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CDemoDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CDemoDoc commands

static CString FindExtension(const CString& name)
{
	int len = name.GetLength();
	int i;
	for (i = len-1; i >= 0; i--)
	{
		if (name[i] == '.')
		{
			return name.Mid(i+1);
		}
	}
	return CString("");
}

BOOL CDemoDoc::OnOpenDocument(LPCTSTR lpszPathName) 
{
	//获取打开文件的类型信息
	CString filename(lpszPathName);
	CString ext(FindExtension(filename));
	ext.MakeLower();
	if (ext == "")
		return FALSE;
	
	int type = 0;
	if (ext == "jpg" || ext == "jpeg")
	{
		type = CIMAGE_FORMAT_JPEG;
	}
	else if (ext == "gif")
	{
		type = CIMAGE_FORMAT_GIF;
	}
	else if (ext == "png")
	{
		type = CIMAGE_FORMAT_PNG;
	}
	else if (ext == "bmp")
	{
		type = CIMAGE_FORMAT_BMP;
	}
	else
		return FALSE;
	//构造Cimage对象,读取图像
	image = new CImage(filename, type);
	if (image->GetWidth() <= 0 || image->GetHeight() <= 0)
	{
		delete image;
		image = NULL;
		return FALSE;
	}
	
	return TRUE;
}

BOOL CDemoDoc::OnSaveDocument(LPCTSTR lpszPathName) 
{
	//获取文件类型信息
	CString filename(lpszPathName);
	CString ext(FindExtension(filename));
	ext.MakeLower();
	if (ext == "")
		return FALSE;
	//设定打开的文件类型
	int type = 0;
	if (ext == "jpg" || ext == "jpeg")
	{
		type = CIMAGE_FORMAT_JPEG;
	}
	else if (ext == "gif")
	{
		type = CIMAGE_FORMAT_GIF;
	}
	else if (ext == "png")
	{
		type = CIMAGE_FORMAT_PNG;
	}
	else if (ext == "bmp")
	{
		type = CIMAGE_FORMAT_BMP;
	}
	else
		return FALSE;
	//保存文件
	if (image)
		return image->SaveFile(filename, type);
	else
		return FALSE;
}

BOOL CDemoDoc::DoSave(LPCTSTR pszPathName, BOOL bReplace /*=TRUE*/)
{
	if (!image)
		return FALSE;

	CString newName = pszPathName;
	BOOL bModified = IsModified();

	BOOL bSaveAs = FALSE;
	if (newName.IsEmpty())
		bSaveAs = TRUE;
	else if (!theApp.GetWritableType(image->GetFileType()))
		bSaveAs = TRUE;

	if (bSaveAs)
	{
		newName = m_strPathName;
		if (bReplace && newName.IsEmpty())
		{
			newName = m_strTitle;
			int iBad = newName.FindOneOf(_T(" #%;/\\"));    // dubious filename
			if (iBad != -1)
				newName.ReleaseBuffer(iBad);

			// append the default suffix if there is one
			newName += theApp.GetExtFromType(image->GetFileType());
		}

		int nDocType = image->GetFileType();
		if (!theApp.PromptForFileName(newName, 
			bReplace ? AFX_IDS_SAVEFILE : AFX_IDS_SAVEFILECOPY,
			OFN_HIDEREADONLY | OFN_PATHMUSTEXIST, FALSE, &nDocType))
		{
			return FALSE;       // don't even try to save
		}
	}

	BeginWaitCursor();
	if (!OnSaveDocument(newName))
	{
		if (pszPathName == NULL)
		{
			// be sure to delete the file
			TRY 
			{
				CFile::Remove(newName);
			}
			CATCH_ALL(e)
			{
				TRACE0("Warning: failed to delete file after failed SaveAs\n");
			}
			END_CATCH_ALL
		}
		EndWaitCursor();
		return FALSE;
	}

	EndWaitCursor();
	if (bReplace)
	{
		// Reset the title and change the document name
		SetPathName(newName, TRUE);
		ASSERT(m_strPathName == newName);       // must be set
	}
	else // SaveCopyAs
	{
		SetModifiedFlag(bModified);
	}
	return TRUE;        // success
}


#define EPSILON (0.0000001)

int CDemoDoc::ComputePixel(float x, float y, float &x1, float &y1)
{
  float r, nn;

  if (x==0 && y==0) {
	 x1 = x;
	 y1 = y;
	 return 1;
  }

  nn = (float)sqrt(x*x + y*y);
  r = (float) (fabs(x) > fabs(y)) ? fabs(nn/x): fabs(nn/y);

  x1 = (r*x);
  y1 = (r*y);

  return 1;
}

void CDemoDoc::ComputeNewImage(void)
{
	//显示等待鼠标
	CWaitCursor wait;
	int x, y, x1, y1;
	float fx, fy, xmid, ymid, ar;
	//创建新的CImage对象
	CImage *image2 = new CImage(image);
	//计算图像中心点
	xmid = (float) (image->GetWidth()/2.0);
	ymid = (float) (image->GetHeight()/2.0);
	//旋转角度
	ar = (float)(image->GetHeight())/(float)(image->GetWidth());
	//创建新的数据
	for (y=0; y<image->GetHeight(); y++) {
		for (x=0; x<image->GetWidth(); x++) {
			ComputePixel(ar*(x-xmid), y-ymid, fx, fy);
			x1 = (int)(xmid+fx/ar);
			y1 = (int)(ymid+fy);
			if (image->Inside(x1, y1))
				image2->SetIndex(x, y, image->GetIndex(x1, y1));
			else
				image2->SetIndex(x, y, 0);
		}
	}
	delete image;
	image = image2;
	UpdateAllViews(NULL);
}

void CDemoDoc::OnUpdateFileSaveAs(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable((image != NULL));
}

void CDemoDoc::OnUpdateFileSave(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable((image != NULL) &&
		theApp.GetWritableType(image->GetFileType()));
}

void CDemoDoc::OnStretchMode() 
{
	stretchMode = !stretchMode;
	UpdateAllViews(NULL);
}

void CDemoDoc::OnUpdateStretchMode(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(stretchMode);
	pCmdUI->Enable(TRUE);
}

void CDemoDoc::OnTransformEllipse() 
{
	ComputeNewImage();
	UpdateAllViews(NULL);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -