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

📄 ex_useimageview.cpp

📁 这是书上的代码
💻 CPP
字号:
// Ex_UseImageView.cpp : CEx_UseImageView 类的实现
//

#include "stdafx.h"
#include "Ex_UseImage.h"

#include "Ex_UseImageDoc.h"
#include "Ex_UseImageView.h"

#include "ImgDispDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CEx_UseImageView

IMPLEMENT_DYNCREATE(CEx_UseImageView, CView)

BEGIN_MESSAGE_MAP(CEx_UseImageView, CView)
	// 标准打印命令
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
	ON_COMMAND(ID_TOWHITEBLACK, OnTowhiteblack)
	ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs)
END_MESSAGE_MAP()

// CEx_UseImageView 构造/销毁

CEx_UseImageView::CEx_UseImageView()
{
	// TODO: 在此处添加构造代码

}

CEx_UseImageView::~CEx_UseImageView()
{
}

BOOL CEx_UseImageView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或
	// 样式

	return CView::PreCreateWindow(cs);
}

// CEx_UseImageView 绘制

void CEx_UseImageView::OnDraw(CDC* pDC)
{
	CEx_UseImageDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	// TODO: 在此处为本机数据添加绘制代码
	if (m_Image.IsNull()) return;

	CRect rc;
	GetClientRect(rc);

	// 以下目的是保持图像的纵横比
	double imgRatio = (double)(m_Image.GetHeight())/(double)(m_Image.GetWidth());
	int height = (int)((double)(rc.Width())*imgRatio);
	CRect rcDest(0,0,m_Image.GetWidth(),m_Image.GetHeight());

	if (height>rc.Height()) {
		rc.DeflateRect((rc.Width() - (int)((double)(rc.Height())/imgRatio))/2,0);
	} else {
		rc.DeflateRect(0,(rc.Height()-height)/2);
	}

	switch (m_nDispMode) {
		case 0:
			m_Image.Draw(pDC->m_hDC,rc);
			break;
		case 1:
			m_Image.AlphaBlend(pDC->m_hDC,rc,rcDest,m_bAlphaValue);
			break;
	}
}


// CEx_UseImageView 打印

BOOL CEx_UseImageView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// 默认准备
	return DoPreparePrinting(pInfo);
}

void CEx_UseImageView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: 打印前添加额外的初始化
}

void CEx_UseImageView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: 打印后添加清除过程
}


// CEx_UseImageView 诊断

#ifdef _DEBUG
void CEx_UseImageView::AssertValid() const
{
	CView::AssertValid();
}

void CEx_UseImageView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CEx_UseImageDoc* CEx_UseImageView::GetDocument() const // 非调试版本是内联的
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CEx_UseImageDoc)));
	return (CEx_UseImageDoc*)m_pDocument;
}
#endif //_DEBUG


// CEx_UseImageView 消息处理程序

void CEx_UseImageView::OnFileOpen()
{
	// TODO: 在此添加命令处理程序代码
	CString strFilter;
	CSimpleArray<GUID> aguidFileTypes;
	HRESULT hResult;

	// 获取CImage支持的过滤字符串
	hResult = m_Image.GetImporterFilterString(strFilter,aguidFileTypes,_T( "所有图像文件"));
	if (FAILED(hResult)) {
		MessageBox("GetExporterFilter调用失败!");
		return;
	}
	CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST, strFilter);
	if(IDOK != dlg.DoModal()) return;

	CImgDispDlg imgDlg;
	hResult = imgDlg.m_dlgImage.Load(dlg.GetFileName());
	if (FAILED(hResult)) {
		MessageBox("调用图像文件失败!");
		return;
	}
	if (IDOK==imgDlg.DoModal()){
		m_Image.Destroy();
		m_Image.Load(dlg.GetFileName());
		m_nDispMode = imgDlg.m_nDispMode;
		m_bAlphaValue = imgDlg.m_bAlphaValue;

		// 设置主窗口标题栏内容
		CString str;
		str.LoadString(AFX_IDS_APP_TITLE);
		AfxGetMainWnd()->SetWindowText(str + " - " +dlg.GetFileName());

		Invalidate();
	}
}

void CEx_UseImageView::OnTowhiteblack()
{
	// TODO: 在此添加命令处理程序代码
	if (m_Image.IsNull())	return;

	if (!m_Image.IsIndexed()) {
		// 直接修改像素颜色
		COLORREF pixel;
		int maxY = m_Image.GetHeight(), maxX = m_Image.GetWidth();
		byte r,g,b,avg;
		for (int x=0; x<maxX; x++) {
			for (int y=0; y<maxY; y++) {
				pixel = m_Image.GetPixel(x,y);
				r = GetRValue(pixel);
				g = GetGValue(pixel);
				b = GetBValue(pixel);
				avg = (int)((r + g + b)/3);
				m_Image.SetPixelRGB(x,y,avg,avg,avg);
			}
		}
	} else {
		// 获取并修改颜色表
		int MaxColors = m_Image.GetMaxColorTableEntries();
		RGBQUAD* ColorTable;
		ColorTable = new RGBQUAD[MaxColors];
		m_Image.GetColorTable(0,MaxColors,ColorTable);
		for (int i=0; i<MaxColors; i++)
		{
			int avg = (ColorTable[i].rgbBlue + ColorTable[i].rgbGreen + ColorTable[i].rgbRed)/3;
			ColorTable[i].rgbBlue = avg;
			ColorTable[i].rgbGreen = avg;
			ColorTable[i].rgbRed = avg;
		}
		m_Image.SetColorTable(0,MaxColors,ColorTable);
		delete(ColorTable);
	}
	Invalidate();
}

void CEx_UseImageView::OnFileSaveAs()
{
	// TODO: 在此添加命令处理程序代码
	if (m_Image.IsNull()) {
		MessageBox("你还没有打开一个要保存的图像文件!");
		return;
	}

	CString strFilter;
	strFilter = "位图文件|*.bmp|JPEG 图像文件|*.jpg| \
GIF 图像文件|*.gif|PNG 图像文件|*.png||";
	CFileDialog dlg(FALSE,NULL,NULL,NULL,strFilter);
	if ( IDOK != dlg.DoModal()) 
		return;

    // 如果用户没有指定文件扩展名,则为其添加一个
	CString strFileName;
	CString strExtension;

	strFileName = dlg.m_ofn.lpstrFile;
	if (dlg.m_ofn.nFileExtension == 0) 
	{
		switch (dlg.m_ofn.nFilterIndex)
		{
			case 1:
				strExtension = "bmp";		break;
			case 2:
				strExtension = "jpg";		break;
			case 3:
				strExtension = "gif";		break;
			case 4:
				strExtension = "png";		break;
			default:
				break;
		}
		strFileName = strFileName + '.' + strExtension;
	}

	// 图像保存
	HRESULT hResult = m_Image.Save(strFileName);
	if (FAILED(hResult)) 
		MessageBox("保存图像文件失败!");
}

⌨️ 快捷键说明

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