📄 ex_useimageview.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 + -