windows-nt/Source/XPSP1/NT/printscan/ui/shimgvwr/imageview.cpp
2020-09-26 16:20:57 +08:00

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;
}