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

📄 magichouseview.cpp

📁 "MagicHouse框架"目录: 含有MagicHouse的原始框架
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// 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 + -