252 lines
5.8 KiB
C++
252 lines
5.8 KiB
C++
|
// ImageView.cpp : implementation of the CImageView class
|
||
|
//
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "shimgvwr.h"
|
||
|
|
||
|
#include "ImageDoc.h"
|
||
|
#include "ImageView.h"
|
||
|
#ifdef _DEBUG
|
||
|
#define new DEBUG_NEW
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CImageView
|
||
|
|
||
|
IMPLEMENT_DYNCREATE(CImageView, CView)
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CImageView, CView)
|
||
|
//{{AFX_MSG_MAP(CImageView)
|
||
|
ON_WM_CREATE()
|
||
|
ON_WM_SIZE()
|
||
|
ON_COMMAND(ID_VIEW_ACTUALSIZE, OnViewActualsize)
|
||
|
ON_UPDATE_COMMAND_UI(ID_VIEW_ACTUALSIZE, OnUpdateViewMenu)
|
||
|
ON_COMMAND(ID_VIEW_BESTFIT, OnViewBestfit)
|
||
|
ON_UPDATE_COMMAND_UI(ID_VIEW_BESTFIT, OnUpdateViewMenu)
|
||
|
ON_COMMAND(ID_VIEW_SLIDESHOW, OnViewSlideshow)
|
||
|
ON_UPDATE_COMMAND_UI(ID_VIEW_SLIDESHOW, OnUpdateViewMenu)
|
||
|
ON_COMMAND(ID_VIEW_ZOOM_IN, OnViewZoomIn)
|
||
|
ON_UPDATE_COMMAND_UI(ID_VIEW_ZOOM_IN, OnUpdateViewMenu)
|
||
|
ON_COMMAND(ID_VIEW_ZOOM_OUT, OnViewZoomOut)
|
||
|
ON_UPDATE_COMMAND_UI(ID_VIEW_ZOOM_OUT, OnUpdateViewMenu)
|
||
|
ON_UPDATE_COMMAND_UI(ID_ROTATE_90, OnUpdateViewMenu)
|
||
|
ON_UPDATE_COMMAND_UI(ID_ROTATE_CLOCKWISE, OnUpdateViewMenu)
|
||
|
ON_UPDATE_COMMAND_UI(ID_ROTATE_COUNTER, OnUpdateViewMenu)
|
||
|
ON_COMMAND(ID_ROTATE_CLOCKWISE, OnEditRotateClockwise)
|
||
|
ON_COMMAND(ID_ROTATE_COUNTER, OnEditRotateCounter)
|
||
|
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CImageView construction/destruction
|
||
|
|
||
|
CImageView::CImageView()
|
||
|
{
|
||
|
m_bBestFit = true;
|
||
|
|
||
|
}
|
||
|
|
||
|
CImageView::~CImageView()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
BOOL CImageView::PreCreateWindow(CREATESTRUCT& cs)
|
||
|
{
|
||
|
// TODO: Modify the Window class or styles here by modifying
|
||
|
// the CREATESTRUCT cs
|
||
|
|
||
|
return CView::PreCreateWindow(cs);
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CImageView drawing
|
||
|
|
||
|
void CImageView::OnDraw(CDC* pDC)
|
||
|
{
|
||
|
CImageDoc* pDoc = GetDocument();
|
||
|
ASSERT_VALID(pDoc);
|
||
|
// TODO: add draw code for native data here
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CImageView diagnostics
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
void CImageView::AssertValid() const
|
||
|
{
|
||
|
CView::AssertValid();
|
||
|
}
|
||
|
|
||
|
void CImageView::Dump(CDumpContext& dc) const
|
||
|
{
|
||
|
CView::Dump(dc);
|
||
|
}
|
||
|
|
||
|
CImageDoc* CImageView::GetDocument() // non-debug version is inline
|
||
|
{
|
||
|
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CImageDoc)));
|
||
|
return (CImageDoc*)m_pDocument;
|
||
|
}
|
||
|
#endif //_DEBUG
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CImageView message handlers
|
||
|
|
||
|
BEGIN_EVENTSINK_MAP(CImageView, CView)
|
||
|
//{{AFX_EVENTSINK_MAP(CImageView)
|
||
|
ON_EVENT(CImageView, ID_PREVCTRL, 3 /* OnError */, OnErrorPrevctrl, VTS_NONE)
|
||
|
ON_EVENT(CImageView, ID_PREVCTRL, 2 /* OnPreviewReady */, OnPreviewReady, VTS_NONE)
|
||
|
ON_EVENT(CImageView, ID_PREVCTRL, 4 /* OnBestFitPress */, OnBestFitPress, VTS_NONE)
|
||
|
ON_EVENT(CImageView, ID_PREVCTRL, 5 /* OnActualSizePress */, OnActualSizePress, VTS_NONE)
|
||
|
|
||
|
//}}AFX_EVENTSINK_MAP
|
||
|
END_EVENTSINK_MAP()
|
||
|
|
||
|
void CImageView::OnErrorPrevctrl()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
|
||
|
}
|
||
|
|
||
|
void CImageView::OnPreviewReady()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
|
||
|
}
|
||
|
|
||
|
void CImageView::OnBestFitPress()
|
||
|
{
|
||
|
m_bBestFit = true;
|
||
|
}
|
||
|
|
||
|
void CImageView::OnActualSizePress()
|
||
|
{
|
||
|
m_bBestFit = false;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void CImageView::OnInitialUpdate()
|
||
|
{
|
||
|
CView::OnInitialUpdate();
|
||
|
|
||
|
}
|
||
|
|
||
|
int CImageView::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
||
|
{
|
||
|
if (CView::OnCreate(lpCreateStruct) == -1)
|
||
|
return -1;
|
||
|
DWORD dwToolbarMask = 0x43;
|
||
|
CMemFile ParamFile(reinterpret_cast<BYTE*>(&dwToolbarMask), sizeof(dwToolbarMask));
|
||
|
if (!m_PrevCtrl.Create (NULL, WS_CHILD | WS_VISIBLE,
|
||
|
CRect (), this, ID_PREVCTRL, &ParamFile, FALSE))
|
||
|
{
|
||
|
return -1;
|
||
|
}
|
||
|
m_PrevCtrl.ShowFile (dynamic_cast<CImageDoc*>(m_pDocument)->GetImagePathName(), 1);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void CImageView::OnSize(UINT nType, int cx, int cy)
|
||
|
{
|
||
|
CView::OnSize(nType, cx, cy);
|
||
|
|
||
|
m_PrevCtrl.MoveWindow (0, 0, cx , cy);
|
||
|
m_PrevCtrl.UpdateWindow ();
|
||
|
|
||
|
}
|
||
|
|
||
|
void CImageView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
|
||
|
{
|
||
|
m_PrevCtrl.ShowFile (dynamic_cast<CImageDoc*>(m_pDocument)->GetImagePathName(), 1);
|
||
|
|
||
|
}
|
||
|
|
||
|
void CImageView::OnViewActualsize()
|
||
|
{
|
||
|
OnActualSizePress();
|
||
|
m_PrevCtrl.ActualSize();
|
||
|
|
||
|
}
|
||
|
|
||
|
void CImageView::OnUpdateViewMenu(CCmdUI* pCmdUI)
|
||
|
{
|
||
|
|
||
|
switch (pCmdUI->m_nID)
|
||
|
{
|
||
|
case ID_ROTATE_90:
|
||
|
case ID_ROTATE_COUNTER:
|
||
|
case ID_ROTATE_CLOCKWISE:
|
||
|
// eventually, ask the control if rotate is valid for this image
|
||
|
pCmdUI->Enable( m_pDocument->GetPathName().GetLength());
|
||
|
return;
|
||
|
case ID_VIEW_BESTFIT:
|
||
|
pCmdUI->SetCheck(m_bBestFit?1:0);
|
||
|
pCmdUI->Enable();
|
||
|
return;
|
||
|
case ID_VIEW_ACTUALSIZE:
|
||
|
pCmdUI->SetCheck(m_bBestFit?0:1);
|
||
|
pCmdUI->Enable();
|
||
|
return;
|
||
|
|
||
|
default:
|
||
|
// most view menu items are only available for images that have been saved to disk
|
||
|
pCmdUI->Enable(!(m_pDocument->IsModified()));
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CImageView::OnViewBestfit()
|
||
|
{
|
||
|
m_PrevCtrl.BestFit();
|
||
|
OnBestFitPress();
|
||
|
}
|
||
|
|
||
|
|
||
|
void CImageView::OnViewSlideshow()
|
||
|
{
|
||
|
m_PrevCtrl.SlideShow();
|
||
|
|
||
|
}
|
||
|
|
||
|
void CImageView::OnViewZoomIn()
|
||
|
{
|
||
|
m_PrevCtrl.Zoom(1);
|
||
|
|
||
|
}
|
||
|
|
||
|
void CImageView::OnViewZoomOut()
|
||
|
{
|
||
|
|
||
|
m_PrevCtrl.Zoom(-1);
|
||
|
}
|
||
|
|
||
|
void CImageView::OnEditRotateClockwise()
|
||
|
{
|
||
|
m_PrevCtrl.Rotate (90);
|
||
|
}
|
||
|
|
||
|
void CImageView::OnEditRotateCounter()
|
||
|
{
|
||
|
m_PrevCtrl.Rotate (270);
|
||
|
}
|
||
|
|
||
|
HRESULT CImageView::SaveImageAs (LPCTSTR lpszPath)
|
||
|
{
|
||
|
TRY
|
||
|
{
|
||
|
m_PrevCtrl.SaveAs(CComBSTR(lpszPath));
|
||
|
}
|
||
|
CATCH (COleDispatchException ,e)
|
||
|
|
||
|
{
|
||
|
|
||
|
return ResultFromScode (e->m_scError);
|
||
|
}
|
||
|
END_CATCH
|
||
|
return S_OK;
|
||
|
}
|