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

📄 jpgdlg.cpp

📁 模拟电子课程的教学演示程序
💻 CPP
字号:
// JpgDlg.cpp : implementation file
//

#include "stdafx.h"
#include "elecdemo.h"
#include "JpgDlg.h"
#include "menuxp.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CJpgDlg dialog


CJpgDlg::CJpgDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CJpgDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CJpgDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	m_strJpgFile="";
	m_bCanMove=FALSE;
	m_xSrc=m_ySrc=0;
	m_fRate=1.0;
}


void CJpgDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CJpgDlg)
	DDX_Control(pDX, IDOK, m_OK);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CJpgDlg, CDialog)
	//{{AFX_MSG_MAP(CJpgDlg)
	ON_WM_PAINT()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_WM_ERASEBKGND()
	ON_WM_CONTEXTMENU()
	//}}AFX_MSG_MAP
	ON_COMMAND(ID_50,On50)
	ON_COMMAND(ID_100,On100)
	ON_COMMAND(ID_150,On150)
	ON_COMMAND(ID_200,On200)
	ON_COMMAND(ID_250,On250)
	ON_COMMAND(ID_300,On300)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CJpgDlg message handlers

void CJpgDlg::SetJpgPath(CString file)
{
	if(file=="")
		return;
	if(m_bmpShow.m_hObject)
		m_bmpShow.DeleteObject();
	m_strJpgFile=file;
}

void CJpgDlg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting

	CRect rect;
	GetWindowRect(rect);	

	if(m_bmpBack.m_hObject==NULL)
	{
		CString str;
		str=getPath()+"back.bmp";
		if(!LoadPictureFile(str,&m_bmpBack,m_backSize))
			return ;
		m_rcShow.left=10;
		m_rcShow.top=10;
		m_rcShow.right=m_rcShow.left+rect.Width()-20;
		m_rcShow.bottom=m_rcShow.top+rect.Height()-60;//*/
	}   

	CDC tmpDC;
	tmpDC.CreateCompatibleDC(&dc);
	tmpDC.SelectObject(&m_bmpBack);    
	
	dc.StretchBlt(0,0,rect.Width(),rect.Height(),&tmpDC,0,0,m_backSize.cx,
		m_backSize.cy,SRCCOPY);	
	
	dc.Draw3dRect(&m_rcShow,RGB(0,0,0),RGB(255,255,255));
	m_rcShow.DeflateRect(2,2,2,2);
	dc.FillRect(&m_rcShow,&CBrush(RGB(255,255,255)));
	Draw();
	// Do not call CDialog::OnPaint() for painting messages
}
void CJpgDlg::Draw()
{
	
	if(m_bmpShow.m_hObject==NULL)
	{
		if(!LoadPictureFile(m_strJpgFile,&m_bmpShow,m_showSize))
		{
			CString str;
			str.Format("载入图片 %s 错误!",m_strJpgFile);
			AfxMessageBox(str);
			return ;
		}		
	}
	CalcSize();

	int bmpx=(int)(m_showSize.cx*m_fRate);
	int bmpy=(int)(m_showSize.cy*m_fRate);

	CDC *pDC=GetDC();
	CDC memDC,tmpDC;
	CBitmap tmpBmp;
	tmpBmp.CreateCompatibleBitmap(pDC,bmpx,bmpy);

	memDC.CreateCompatibleDC(pDC);
	tmpDC.CreateCompatibleDC(pDC);

    memDC.SelectObject(&tmpBmp);
	tmpDC.SelectObject(&m_bmpShow);

	memDC.StretchBlt(0,0,bmpx,bmpy,
		&tmpDC,0,0,m_showSize.cx,m_showSize.cy,SRCCOPY);
	pDC->BitBlt(m_rcDest.left,m_rcDest.top,m_rcDest.Width(),m_rcDest.Height(),&memDC,
		m_xSrc,m_ySrc,SRCCOPY);

}
BOOL CJpgDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	m_OK.SetShade(SHS_NOISE|SHS_METAL,8,10,20,RGB(0,0,255));
    CenterWindow();	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CJpgDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{	
	POINT pt=point;

	if(m_rcDest.PtInRect(pt))
	{
		m_bMouseDown = TRUE;
		m_ptOld.x = pt.x;
		m_ptOld.y = pt.y;
		::SetCursor(::LoadCursor(NULL,IDC_CROSS));
	}
	CDialog::OnLButtonDown(nFlags, point);
}

void CJpgDlg::OnLButtonUp(UINT nFlags, CPoint point) 
{
	m_bMouseDown=FALSE;
	::SetCursor(::LoadCursor(NULL,IDC_ARROW));
	CDialog::OnLButtonUp(nFlags, point);
}

void CJpgDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	BOOL bxMove,byMove;
   
	int bmpcx=(int)(m_showSize.cx*m_fRate);
	int bmpcy=(int)(m_showSize.cy*m_fRate);

	CPoint pt=point;
    if(nFlags&MK_LBUTTON == MK_LBUTTON && m_bCanMove)
	{

		if(m_xFlag)
		{
			m_xSrc -= pt.x - m_ptOld.x;
			m_ptOld.x = pt.x;

			if(m_xSrc <0 )
			{
				m_xSrc = 0;
				bxMove = FALSE;
			}
			else if((m_xSrc + m_rcDest.right) > bmpcx)
			{
				m_xSrc =bmpcx - m_rcDest.right;
				bxMove = FALSE;
			}
			else
				bxMove = TRUE;
		}

		if(m_yFlag)
		{
			m_ySrc -= pt.y - m_ptOld.y;
			m_ptOld.y = pt.y;

			if(m_ySrc < 0)
			{
				m_ySrc = 0;
				byMove = FALSE;
			}
			else if((m_ySrc + m_rcDest.bottom) > bmpcy)
			{
				m_ySrc = bmpcy - m_rcDest.bottom;
				byMove = FALSE;
			}
			else
				byMove = FALSE;
		}

		if(bxMove || byMove)
			Draw();
	}
	CDialog::OnMouseMove(nFlags, point);
}

void CJpgDlg::CalcSize()
{
	if(m_bmpShow.m_hObject == NULL)return;

	int cx = m_rcShow.Width();
	int cy = m_rcShow.Height();
     
	int bmpcx=(int)(m_showSize.cx*(m_fRate+0.1));
	int bmpcy=(int)(m_showSize.cy*(m_fRate+0.1));

	if(cx == 0 || cy == 0)return;

	if(bmpcx < cx)//图片宽度小于客户区
	{
		m_rcDest.left =m_rcShow.left+ (int)(cx - bmpcx)/2;
		m_rcDest.right = m_rcDest.left + bmpcx;
		m_xFlag = FALSE;
	}
	else//图片宽度大于客户区
	{
		m_rcDest.left = m_rcShow.left;
		m_rcDest.right = m_rcShow.right;
		if(bmpcx == cx)
			m_xFlag = FALSE;
		else
			m_xFlag = TRUE;
	}

	if(bmpcy < cy)//图片高度小于客户区
	{
		m_rcDest.top = m_rcShow.top+(int)(cy - bmpcy)/2;
		m_rcDest.bottom = m_rcDest.top + bmpcy;
		m_yFlag = FALSE;
	}
	else//图片高度大于客户区
	{
		m_rcDest.top = m_rcShow.top;
		m_rcDest.bottom = m_rcShow.bottom;
		if(bmpcy == cy)
			m_yFlag = FALSE;
		else
			m_yFlag = TRUE;
	}

	if(m_xFlag)
	{
		if(m_xSrc < 0)
			m_xSrc = 0;
		if(m_xSrc > (bmpcx - m_rcDest.Width()))
			m_xSrc = bmpcx - m_rcDest.Width();
	}
	if(m_yFlag)
	{
		if(m_ySrc < 0)
			m_ySrc = 0;
		if(m_ySrc > (bmpcy - m_rcDest.Height()))
			m_ySrc = bmpcy - m_rcDest.Height();
	}

	if(m_xFlag || m_yFlag)
		m_bCanMove = TRUE;
	else
		m_bCanMove = FALSE;
}
BOOL CJpgDlg::OnEraseBkgnd(CDC* /*pDC*/) 
{
	return FALSE;
}

void CJpgDlg::OnContextMenu(CWnd* pWnd, CPoint point) 
{
	if(m_rcShow.PtInRect(point))
	{
		CMenuXP	*pMenu = new CMenuXP;
		pMenu->CreatePopupMenu();
		pMenu->SetBackColor(RGB(0xf2, 0xf2, 0xf2));
	    pMenu->SetSelectedBarColor(RGB(0x66, 0x99, 0xff));
	    pMenu->SetMenuStyle(CMenuXP::STYLE_XP);
		
		pMenu->AddSideBar(new CMenuXPSideBar(24, "图片缩放"));
	    pMenu->AppendODMenu(MF_UNCHECKED, new CMenuXPText(ID_50, "50%"));
		pMenu->AppendODMenu(MF_UNCHECKED, new CMenuXPText(ID_100, "100%"));
		pMenu->AppendODMenu(MF_UNCHECKED, new CMenuXPText(ID_150, "150%"));
		pMenu->AppendODMenu(MF_UNCHECKED, new CMenuXPText(ID_200, "200%"));
		pMenu->AppendODMenu(MF_UNCHECKED, new CMenuXPText(ID_250, "250%"));
		pMenu->AppendODMenu(MF_UNCHECKED, new CMenuXPText(ID_300, "300%"));

		if(m_fRate==0.50)
			pMenu->CheckMenuItem(ID_50,MF_CHECKED|MF_BYCOMMAND);		
		else if(m_fRate==1.0)
			pMenu->CheckMenuItem(ID_100,MF_CHECKED|MF_BYCOMMAND);		
		else if(m_fRate==1.50)
			pMenu->CheckMenuItem(ID_150,MF_CHECKED|MF_BYCOMMAND);		
		else if(m_fRate==2.0)
			pMenu->CheckMenuItem(ID_200,MF_CHECKED|MF_BYCOMMAND);		
		else if(m_fRate==2.5)
			pMenu->CheckMenuItem(ID_250,MF_CHECKED|MF_BYCOMMAND);		
		else if(m_fRate==3.0)
			pMenu->CheckMenuItem(ID_300,MF_CHECKED|MF_BYCOMMAND);	

    	pMenu->TrackPopupMenu(TPM_LEFTBUTTON, point.x, point.y, this);
		delete pMenu;

	}
}


void CJpgDlg::On50()
{
	m_fRate=0.5;
	Invalidate();
}
void CJpgDlg::On100()
{
	m_fRate=1.0;
	m_xSrc=m_ySrc=0;
	Invalidate();
}
void CJpgDlg::On150()
{
	m_fRate=1.5;
	m_xSrc=m_ySrc=0;
	Invalidate();
}
void CJpgDlg::On200()
{
	m_fRate=2.0;
	m_xSrc=m_ySrc=0;
	Invalidate();
}
void CJpgDlg::On250()
{
	m_fRate=2.5;
	m_xSrc=m_ySrc=0;
	Invalidate();
}
void CJpgDlg::On300()
{
	m_fRate=3.0;
	m_xSrc=m_ySrc=0;
	Invalidate();
}

⌨️ 快捷键说明

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