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

📄 prevdlg.cpp

📁 "MagicHouse框架"目录: 含有MagicHouse的原始框架
💻 CPP
字号:
// PrevDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "MagicHouse.h"
#include "PrevDlg.h"

#include "mainfrm.h"

// CPrevDlg 对话框

IMPLEMENT_DYNCREATE(CPrevDlg, CDialog)

CPrevDlg::CPrevDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CPrevDlg::IDD, pParent)
	, m_strNum(_T(""))
{
	m_nPos = -1;
}

CPrevDlg::~CPrevDlg()
{
	m_FilesNameAry.RemoveAll();
}

void CPrevDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Text(pDX, IDC_PICNUM, m_strNum);
	DDX_Control(pDX, IDC_SCROLLBAR, m_ScrollBar);
	DDX_Control(pDX, IDC_PREV, m_staPrev);
}


BEGIN_MESSAGE_MAP(CPrevDlg, CDialog)
	ON_WM_PAINT()
	ON_BN_CLICKED(IDC_OPEN, &CPrevDlg::OnBnClickedOpen)
	ON_WM_HSCROLL()
END_MESSAGE_MAP()


/******************************************************************************
*	作用:		绘制对话框
******************************************************************************/
void CPrevDlg::OnPaint()
{
	CPaintDC dc(this); // device context for painting

	CRect rc;
	GetClientRect(&rc);

	int b = rc.bottom;
	int l = rc.left;
	int r = rc.right;
	int t = rc.top;

	GetDlgItem(IDC_SCROLLBAR)->MoveWindow( l + 5, b - 75, r - 10, 17, true);
	GetDlgItem(IDC_PICNUM)->MoveWindow( r - 120, b - 50, 120, 20, true);
	GetDlgItem(IDC_OPEN)->MoveWindow( (r - l) / 2 - 35, b - 30, 80, 22, true);
	m_staPrev.MoveWindow( 5, 5, rc.right - rc.left - 10, rc.bottom - rc.top - 80 );
	
	Redraw();
}

/******************************************************************************
*	作用:		“打开”按钮响应函数
******************************************************************************/
void CPrevDlg::OnBnClickedOpen()
{
	CFileDialog dlg(
		true, NULL, NULL, 
		OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_NOCHANGEDIR, 
		L"所有支持文件(*.bmp;*.jpg)|*.bmp;*.jpg|位图文件(*.bmp)|*.bmp|JPG文件(*.jpg)|*.jpg||");
	
	if(dlg.DoModal() == IDOK)
	{
		CString strTemp = dlg.GetPathName();
		int nIndex = strTemp.ReverseFind('\\');
		m_strPath = strTemp.Left(nIndex);	// 获取当前打开文件的所在目录

		// 获得打开目录下的所有图像文件
		CMainFrame::GetAllFileNames(m_strPath, m_FilesNameAry);
		m_nPicNum = (int)m_FilesNameAry.GetCount();

		m_nPos = 0;
		CString strFileName = dlg.GetFileName();

		// 计算当前文件的索引
		while( m_nPos < m_nPicNum && m_FilesNameAry[m_nPos] != strFileName)
			m_nPos++;

		m_ScrollBar.SetScrollRange(0, m_nPicNum - 1);
		m_ScrollBar.SetScrollPos(m_nPos);
		m_strNum.Format(L"第 %d 张,共 %d 张", m_nPos+1, m_nPicNum);
		UpdateData(FALSE);

		Redraw();
	}
}

/******************************************************************************
*	作用:		预览框重绘函数
******************************************************************************/
void CPrevDlg::Redraw(void)
{
	CDC* pDC = m_staPrev.GetDC();
	Graphics graph(pDC->GetSafeHdc());
	CRect rect;

	m_staPrev.GetClientRect(rect);
	pDC->FillRect(rect, &CBrush(RGB(211, 211, 211)));

	if (m_nPos >= 0)
	{
		CString m_strFilePath = m_strPath + L"\\" + m_FilesNameAry[m_nPos];
		Image image(m_strFilePath);
		CRect rect;

		m_staPrev.GetClientRect(rect);

		REAL width  = (REAL)image.GetWidth();
		REAL height = (REAL)image.GetHeight();
		REAL c		= 0.0f;
		REAL x		= 0.0f;
		REAL y		= 0.0f;

		// 按适合宽度模式处理
		width = (REAL)rect.Width();
		c = width / image.GetWidth();

		// 如果没有超界
		if (c * image.GetHeight() < rect.Height())
			height = c * image.GetHeight();
		// 超界则采用适合高度模式
		else
		{
			height = (REAL)rect.Height();
			c = height / image.GetHeight();
			width = c * image.GetWidth();
		}

		// 使图像居中
		if ((UINT)rect.Width() > width)
			x = (rect.Width() - width) / 2.0f;

		if ( (UINT)rect.Height() > height )
			y = ((UINT)rect.Height() - height) / 2.0f;

		graph.DrawImage(&image, x, y, width, height);
	}

	ReleaseDC(pDC);
}

/******************************************************************************
*	作用:		水平滚动条响应函数
******************************************************************************/
void CPrevDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	switch(nSBCode)
	{
	case SB_LINERIGHT:
		{
			if(m_nPos < m_nPicNum - 1)
			{
				m_nPos += 1;
				m_ScrollBar.SetScrollPos(m_nPos);
				m_strNum.Format(L"第 %d 张,共 %d 张", m_nPos+1, m_nPicNum);
				UpdateData(FALSE);

				Redraw();
			}

		}
		break;
	case SB_LINELEFT:
		{
			if(m_nPos > 0)
			{
				m_nPos -= 1;
				m_ScrollBar.SetScrollPos(m_nPos);
				m_strNum.Format(L"第 %d 张,共 %d 张", m_nPos+1, m_nPicNum);
				UpdateData(FALSE);

				Redraw();
			}
		}
		break;
	default:
		break;
	}

	CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}

⌨️ 快捷键说明

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