📄 magichouseview.cpp
字号:
// MagicHouseView.cpp : CMagicHouseView 类的实现
//
#include "stdafx.h"
#include "MagicHouse.h"
#include "MagicHouseDoc.h"
#include "MagicHouseView.h"
#include "MagicHouseDoc.h"
#include "mainfrm.h"
#include "EffectDisplay.h"
#include "myDib.h"
#include "JpegDecoder.h"
#include "PreviewDlg.h"
#include <iostream>
#include <string>
using namespace std;
#pragma warning ( disable : 4996)
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 图像显示类型枚举
enum ShowType
{
ST_NORMAL = 0, // 原始大小
ST_FIXWIDTH = 1, // 适合宽度
ST_FIXHEIGHT = 2, // 适合高度
ST_FIXSCREEN = 3 // 适合屏幕
};
typedef struct s_BM_header {
WORD BMP_id ; // 'B''M'
DWORD size; // size in bytes of the BMP file
DWORD zero_res; // 0
DWORD offbits; // 54
DWORD biSize; // 0x28
DWORD Width; // X
DWORD Height; // Y
WORD biPlanes; // 1
WORD biBitCount ; // 24
DWORD biCompression; // 0 = BI_RGB
DWORD biSizeImage; // 0
DWORD biXPelsPerMeter; // 0xB40
DWORD biYPelsPerMeter; // 0xB40
DWORD biClrUsed; //0
DWORD biClrImportant; //0
} BM_header;
typedef struct s_RGB {
BYTE B;
BYTE G;
BYTE R;
} RGB;
// CMagicHouseView
IMPLEMENT_DYNCREATE(CMagicHouseView, CView)
BEGIN_MESSAGE_MAP(CMagicHouseView, 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_WM_ERASEBKGND()
ON_COMMAND(ID_MODE_NORMAL, &CMagicHouseView::OnModeNormal)
ON_COMMAND(ID_MODE_WIDTH, &CMagicHouseView::OnModeWidth)
ON_COMMAND(ID_MODE_HEIGHT, &CMagicHouseView::OnModeHeight)
ON_COMMAND(ID_MODE_SCREEN, &CMagicHouseView::OnModeScreen)
ON_UPDATE_COMMAND_UI(ID_MODE_NORMAL, &CMagicHouseView::OnUpdateModeNormal)
ON_UPDATE_COMMAND_UI(ID_MODE_WIDTH, &CMagicHouseView::OnUpdateModeWidth)
ON_UPDATE_COMMAND_UI(ID_MODE_HEIGHT, &CMagicHouseView::OnUpdateModeHeight)
ON_UPDATE_COMMAND_UI(ID_MODE_SCREEN, &CMagicHouseView::OnUpdateModeScreen)
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_SETCURSOR()
ON_COMMAND(ID_IMAGE_PREV, &CMagicHouseView::OnImagePrev)
ON_COMMAND(ID_IMAGE_NEXT, &CMagicHouseView::OnImageNext)
ON_COMMAND(ID_IMAGE_FIRST, &CMagicHouseView::OnImageFirst)
ON_COMMAND(ID_IMAGE_LAST, &CMagicHouseView::OnImageLast)
ON_UPDATE_COMMAND_UI(ID_IMAGE_PREV, &CMagicHouseView::OnUpdateImagePrev)
ON_UPDATE_COMMAND_UI(ID_IMAGE_NEXT, &CMagicHouseView::OnUpdateImageNext)
ON_UPDATE_COMMAND_UI(ID_IMAGE_FIRST, &CMagicHouseView::OnUpdateImageFirst)
ON_UPDATE_COMMAND_UI(ID_IMAGE_LAST, &CMagicHouseView::OnUpdateImageLast)
ON_COMMAND(ID_EFFECT_NONE, &CMagicHouseView::OnEffectNone)
ON_COMMAND(ID_EFFECT_RAND, &CMagicHouseView::OnEffectRand)
ON_COMMAND(ID_EFFECT_SCANDOWN, &CMagicHouseView::OnEffectScan)
ON_COMMAND(ID_EFFECT_VSCAN, &CMagicHouseView::OnEffectDscan)
ON_COMMAND(ID_EFFECT_MOVERIGHT, &CMagicHouseView::OnEffectMove)
ON_COMMAND(ID_EFFECT_VBLIND, &CMagicHouseView::OnEffectVBlind)
ON_COMMAND(ID_EFFECT_HRASTER, &CMagicHouseView::OnEffectHRaster)
ON_COMMAND(ID_EFFECT_MOSAIC, &CMagicHouseView::OnEffectMosaic)
ON_UPDATE_COMMAND_UI(ID_EFFECT_NONE, &CMagicHouseView::OnUpdateEffectNone)
ON_UPDATE_COMMAND_UI(ID_EFFECT_RAND, &CMagicHouseView::OnUpdateEffectRand)
ON_UPDATE_COMMAND_UI(ID_EFFECT_SCANDOWN, &CMagicHouseView::OnUpdateEffectScan)
ON_UPDATE_COMMAND_UI(ID_EFFECT_VSCAN, &CMagicHouseView::OnUpdateEffectDscan)
ON_UPDATE_COMMAND_UI(ID_EFFECT_MOVERIGHT, &CMagicHouseView::OnUpdateEffectMove)
ON_UPDATE_COMMAND_UI(ID_EFFECT_VBLIND, &CMagicHouseView::OnUpdateEffectBlind)
ON_UPDATE_COMMAND_UI(ID_EFFECT_HRASTER, &CMagicHouseView::OnUpdateEffectRaster)
ON_UPDATE_COMMAND_UI(ID_EFFECT_MOSAIC, &CMagicHouseView::OnUpdateEffectMosaic)
ON_COMMAND(ID_EFFECT_HSMOVE, &CMagicHouseView::OnEffectHsmove)
ON_UPDATE_COMMAND_UI(ID_EFFECT_HSMOVE, &CMagicHouseView::OnUpdateEffectHsmove)
ON_COMMAND(ID_EFFECT_SBLIND, &CMagicHouseView::OnEffectSblind)
ON_UPDATE_COMMAND_UI(ID_EFFECT_SBLIND, &CMagicHouseView::OnUpdateEffectSblind)
ON_COMMAND(ID_EFFECT_VRASTER, &CMagicHouseView::OnEffectVraster)
ON_UPDATE_COMMAND_UI(ID_EFFECT_VRASTER, &CMagicHouseView::OnUpdateEffectVraster)
ON_COMMAND(ID_EFFECT_RAINDROP, &CMagicHouseView::OnEffectRaindrop)
ON_UPDATE_COMMAND_UI(ID_EFFECT_RAINDROP, &CMagicHouseView::OnUpdateEffectRaindrop)
ON_COMMAND(ID_FILE_OPEN, &CMagicHouseView::OnFileOpen)
ON_COMMAND(ID_MODE_BROWSE, &CMagicHouseView::OnModeBrowse)
ON_COMMAND(ID_MODE_EDIT, &CMagicHouseView::OnModeEdit)
ON_COMMAND(ID_FILE_SAVE, &CMagicHouseView::OnFileSave)
ON_UPDATE_COMMAND_UI(ID_MODE_BROWSE, &CMagicHouseView::OnUpdateModeBrowse)
ON_UPDATE_COMMAND_UI(ID_MODE_EDIT, &CMagicHouseView::OnUpdateModeEdit)
END_MESSAGE_MAP()
// CMagicHouseView 构造/析构
CMagicHouseView::CMagicHouseView()
{
m_bIsEditMode = false;
m_nShowType = ST_NORMAL;
m_bHeightOut = false;
m_bWidhtOut = false;
m_nXX = 0;
m_nYY = 0;
m_nXXMax = 0;
m_nYYMax = 0;
m_nPos = -1;
m_pBitmap = NULL;
m_bEffectDraw = false;
m_nEffectDisplayType = EDT_RAND;
m_pImageBuffer = NULL;
m_pImageTempBuffer = NULL;
m_nPicWidth = m_nPicHeight = 0;
}
CMagicHouseView::~CMagicHouseView()
{
::delete m_pBitmap;
FreeImageBuffer();
}
/******************************************************************************
* 作用: 视图重绘函数
******************************************************************************/
void CMagicHouseView::OnDraw(CDC* pDC)
{
CMagicHouseDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
CRect rect;
GetClientRect(rect);
CDC memDC;
CBitmap MemBitmap;
// 设备描述表初始化
memDC.CreateCompatibleDC(NULL);
// 建立与屏幕显示兼容的内存显示设备
MemBitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
// 选取空白位图
memDC.SelectObject(MemBitmap);
memDC.FillSolidRect(0, 0, rect.Width(), rect.Height(), RGB(255,255,255));
if (m_nPos >= 0)
ShowPicture(&memDC, *m_pBitmap, m_nShowType);
if (m_bEffectDraw && m_nEffectDisplayType != EDT_NONE)
{
int nHeight = rect.Height() - m_nShowPicHeight;
int nWidth = rect.Width() - m_nShowPicWidth;
if (nHeight < 0)
nHeight = 0;
if (nWidth < 0)
nWidth = 0;
pDC->FillSolidRect(0, 0, rect.Width(), rect.Height(), RGB(255,255,255));
EffectDisplay::s_nOffsetX = nWidth / 2;
EffectDisplay::s_nOffsetY = nHeight / 2;
EffectDisplay::s_nPicWidth = m_nShowPicWidth;
EffectDisplay::s_nPicHeight = m_nShowPicHeight;
EffectDisplay::s_nCDCWidth = rect.Width();
EffectDisplay::s_nCDCHeight = rect.Height();
EffectDisplayImage(pDC, &memDC);
m_bEffectDraw = false;
}
else
pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
MemBitmap.DeleteObject();
memDC.DeleteDC();
}
/******************************************************************************
* 作用: 打开指定路径的文件
******************************************************************************/
void CMagicHouseView::OpenFile(const CString& strPath)
{
FreeImageBuffer();
m_FilesNameAry.RemoveAll();
int nIndex = strPath.ReverseFind('\\');
m_strPath = strPath.Left(nIndex);
CString strFileName = strPath.Right(strPath.GetLength() - nIndex - 1);
CMainFrame::GetAllFileNames(m_strPath, m_FilesNameAry);
m_nPicNum = (int)m_FilesNameAry.GetCount();
m_nPos = 0;
while( m_nPos < m_nPicNum && m_FilesNameAry[m_nPos] != strFileName)
m_nPos++;
PreDrawImage();
m_bEffectDraw = true;
Invalidate();
if (m_bIsEditMode)
{
CString strPath = GetFilePath(m_nPos);
GetImageBuffer(strPath);
}
}
void CMagicHouseView::OnInitialUpdate()
{
CView::OnInitialUpdate();
}
// CMagicHouseView 打印
BOOL CMagicHouseView::OnPreparePrinting(CPrintInfo* pInfo)
{
// 默认准备
return DoPreparePrinting(pInfo);
}
void CMagicHouseView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加额外的打印前进行的初始化过程
}
void CMagicHouseView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 添加打印后进行的清除过程
}
// CMagicHouseView 诊断
#ifdef _DEBUG
void CMagicHouseView::AssertValid() const
{
CView::AssertValid();
}
void CMagicHouseView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CMagicHouseDoc* CMagicHouseView::GetDocument() const // 非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMagicHouseDoc)));
return (CMagicHouseDoc*)m_pDocument;
}
#endif //_DEBUG
/******************************************************************************
* 作用: "打开"的命令响应函数
******************************************************************************/
void CMagicHouseView::OnFileOpen()
{
CFileDialog dlg(true, NULL, L"",
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_NOCHANGEDIR,
L"所有图像文件(*.bmp; *.jpg)|*.bmp; *.jpg|所有文件(*.*)|*.*||");
if (dlg.DoModal() == IDOK)
{
OpenFile(dlg.GetPathName());
FixOffset();
RefreshIndicator();
Invalidate();
}
}
/******************************************************************************
* 作用: 禁止重绘背景
******************************************************************************/
BOOL CMagicHouseView::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
/******************************************************************************
* 作用: 以指定模式显示图像
* 参数:
* pDC 目标设备上下文指针
* image 显示图像
* nShowType 显示模式
******************************************************************************/
void CMagicHouseView::ShowPicture(CDC* pDC, Image& image, int nShowType)
{
Graphics graph(pDC->GetSafeHdc());
CRect winRect;
GetClientRect(winRect);
REAL x = 0.0;
REAL y = 0.0;
CSize showPicSize = GetShowPicSize(image, m_nShowType);
REAL width = (REAL)showPicSize.cx;
REAL height = (REAL)showPicSize.cy;
// 使图像居中
if ((UINT)winRect.Width() > width)
x = (winRect.Width() - width) / 2.0f;
if ( (UINT)winRect.Height() > height )
y = ((UINT)winRect.Height() - height) / 2.0f;
if (m_bWidhtOut)
x += m_nXX;
if (m_bHeightOut)
y += m_nYY;
m_nShowPicHeight = (int)height;
m_nShowPicWidth = (int)width;
graph.DrawImage(&image, x, y, width, height);
}
/******************************************************************************
* 作用: 设置显示模式
* 参数:
* nType 新的显示模式
******************************************************************************/
void CMagicHouseView::SetShowType(int nType)
{
m_nShowType = nType;
}
/******************************************************************************
* 作用: 获得指定模式下图像的大小
* 参数:
* image 图像对象
* nShowType 显示模式
* 返回值: 在指定模式下图像的显示大小
******************************************************************************/
CSize CMagicHouseView::GetShowPicSize(Image& image, int nShowType)
{
REAL width = (REAL)image.GetWidth();
REAL height = (REAL)image.GetHeight();
REAL c = 0.0f;
CRect winRect;
GetClientRect(winRect);
switch (nShowType)
{
case ST_FIXWIDTH: // 适合宽度模式
width = (REAL)winRect.Width();
c = width / image.GetWidth();
height = c * image.GetHeight();
break;
case ST_FIXHEIGHT: // 适合高度模式
height = (REAL)winRect.Height();
c = height / image.GetHeight();
width = c * image.GetWidth();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -