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