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

📄 imageviewview.cpp

📁 主要介绍vc++6.0的编程过程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ImageViewView.cpp : implementation of the CImageViewView class
//

#include "stdafx.h"
#include "ImageView.h"

#include "ImageViewDoc.h"
#include "ImageViewView.h"

#include "MainFrm.h"
#include "ChildFrm.h"

#include "NewImageSize.h"
#include "RotateImage.h"
#include "PaletteCreationType.h"
#include "NewColorDepth.h"

#include "Brightness.h"
#include "ViewHistogram.h"

#include "ImagePointProcesses.h"
#include "ImageAreaProcesses.h"

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

/////////////////////////////////////////////////////////////////////////////
// CImageViewView

IMPLEMENT_DYNCREATE(CImageViewView, CScrollView)

BEGIN_MESSAGE_MAP(CImageViewView, CScrollView)
	//{{AFX_MSG_MAP(CImageViewView)
	ON_WM_SETFOCUS()
	ON_COMMAND(ID_OPERATIONS_SHOWCROPBOX, OnOperationsShowcropbox)
	ON_UPDATE_COMMAND_UI(ID_OPERATIONS_SHOWCROPBOX, OnUpdateOperationsShowcropbox)
	ON_WM_LBUTTONDOWN()
	ON_WM_SETCURSOR()
	ON_COMMAND(ID_OPERATIONS_CROP, OnOperationsCrop)
	ON_COMMAND(ID_OPERATIONS_STRETCH, OnOperationsStretch)
	ON_COMMAND(ID_OPERATIONS_FLIP, OnOperationsFlip)
	ON_COMMAND(ID_OPERATIONS_INVERT, OnOperationsInvert)
	ON_COMMAND(ID_OPERATIONS_ROTATE, OnOperationsRotate)
	ON_COMMAND(ID_OPERATIONS_SETPALETTECREATIONTYPE, OnOperationsSetpalettecreationtype)
	ON_COMMAND(ID_OPERATIONS_CHANGEIMAGECOLORDEPTH, OnOperationsChangeimagecolordepth)
	ON_COMMAND(ID_POINTPROCESSES_CHANGEBRIGHTNESS, OnPointprocessesChangebrightness)
	ON_COMMAND(ID_POINTPROCESSES_COLORIZE, OnPointprocessesColorize)
	ON_COMMAND(ID_POINTPROCESSES_MAKEGRAY, OnPointprocessesMakegray)
	ON_COMMAND(ID_POINTPROCESSES_REVERSECOLORS, OnPointprocessesReversecolors)
	ON_COMMAND(ID_POINTPROCESSES_VIEWHISTOGRAM, OnPointprocessesViewhistogram)
	ON_COMMAND(ID_AREAPROCESSES_CHANGECONTRACT, OnAreaprocessesChangecontract)
	ON_COMMAND(ID_AREAPROCESSES_EDGEENHANCE, OnAreaprocessesEdgeenhance)
	ON_COMMAND(ID_AREAPROCESSES_EQUALIZECONTRAST, OnAreaprocessesEqualizecontrast)
	ON_COMMAND(ID_AREAPROCESSES_HIGHPASSFILTER, OnAreaprocessesHighpassfilter)
	ON_COMMAND(ID_AREAPROCESSES_LOWPASSFILTER, OnAreaprocessesLowpassfilter)
	ON_COMMAND(ID_AREAPROCESSES_MEDIANFILTER, OnAreaprocessesMedianfilter)
	ON_WM_HSCROLL()
	ON_WM_VSCROLL()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CImageViewView construction/destruction

CImageViewView::CImageViewView()
{

	m_pImageObject = NULL;
	m_bImageLoaded = FALSE;

	m_bCropBoxShowing = FALSE;
	CRect Rect( 10, 10, 200, 100 );
	m_pTracker = new CRectTracker( &Rect, CRectTracker::solidLine | CRectTracker::resizeOutside );

}

CImageViewView::~CImageViewView()
{

	if( m_pImageObject != NULL ) delete m_pImageObject;
	if( m_pTracker ) delete m_pTracker;

}

BOOL CImageViewView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CImageViewView drawing

void CImageViewView::OnDraw(CDC* pDC)
{
	CImageViewDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	if( !m_bImageLoaded ){

		CString PathName = pDoc->GetPathName ();

		BeginWaitCursor ();
		m_pImageObject = new CImageObject( PathName.GetBuffer( 3 ), pDC );
		EndWaitCursor ();
		if( m_pImageObject == NULL ){
			AfxMessageBox( "Could not create picture class!" );
			return;
			}
					
		CSize SizeTotal;
		SizeTotal.cx = m_pImageObject->GetWidth();
		SizeTotal.cy = m_pImageObject->GetHeight();
		SetScrollSizes (MM_TEXT, SizeTotal);

		CMainFrame *pFrame = (CMainFrame *) AfxGetMainWnd();
		CChildFrame *pChild = (CChildFrame *) pFrame->MDIGetActive();
		pChild->m_nWidth = m_pImageObject->GetWidth(); 
		pChild->m_nHeight = m_pImageObject->GetHeight(); 
		pChild->SetWindowPos( NULL, 0, 0, 2500, 2500, SWP_NOZORDER | SWP_NOMOVE );

		m_bImageLoaded = TRUE;
		}

	OnPrepareDC (pDC);
	if( GetFocus() == this ) m_pImageObject->SetPalette( pDC );
	m_pImageObject->Draw( pDC );

	if( m_pTracker != NULL && m_bCropBoxShowing )
		m_pTracker->Draw( pDC );

}

void CImageViewView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();
	CSize sizeTotal;
	// TODO: calculate the total size of this view
	sizeTotal.cx = sizeTotal.cy = 100;
	SetScrollSizes(MM_TEXT, sizeTotal);
}

/////////////////////////////////////////////////////////////////////////////
// CImageViewView diagnostics

#ifdef _DEBUG
void CImageViewView::AssertValid() const
{
	CScrollView::AssertValid();
}

void CImageViewView::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}

CImageViewDoc* CImageViewView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CImageViewDoc)));
	return (CImageViewDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CImageViewView message handlers

void CImageViewView::OnSetFocus(CWnd* pOldWnd) 
{
	CScrollView::OnSetFocus(pOldWnd);
	
	if( m_pImageObject != NULL ){
		CClientDC ClientDC( this );
		OnPrepareDC( &ClientDC );
		m_pImageObject->SetPalette( &ClientDC );
		m_pImageObject->Draw( &ClientDC );
		}
	
}

void CImageViewView::OnOperationsShowcropbox() 
{

	if( m_pTracker != NULL ){
		m_bCropBoxShowing = !m_bCropBoxShowing;
		InvalidateRect( NULL, FALSE );
		UpdateWindow();
		}

}

void CImageViewView::OnUpdateOperationsShowcropbox(CCmdUI* pCmdUI) 
{

	if( !m_pTracker ) pCmdUI->Enable( FALSE );
	else{
		if( m_bCropBoxShowing ) pCmdUI->SetCheck( TRUE );
		else pCmdUI->SetCheck( FALSE );
		}

}

void CImageViewView::OnLButtonDown(UINT nFlags, CPoint point) 
{

	if( m_pTracker != NULL && m_bCropBoxShowing && m_pTracker->Track( this, point, FALSE ) ){
		InvalidateRect( NULL, FALSE );
		UpdateWindow();
		}
	
	CScrollView::OnLButtonDown(nFlags, point);
}

BOOL CImageViewView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{

	if( m_pTracker != NULL && m_bCropBoxShowing && pWnd == this && m_pTracker->SetCursor( this, nHitTest ) )
		return( TRUE );
	
	return CScrollView::OnSetCursor(pWnd, nHitTest, message);
}


void CImageViewView::OnOperationsCrop() 
{

	if( m_pTracker == NULL || m_pImageObject == NULL ) return;

	int nX1 = m_pTracker->m_rect.left;
	int nY1 = m_pTracker->m_rect.top;
	int nX2 = m_pTracker->m_rect.right;
	int nY2 = m_pTracker->m_rect.bottom;

	if( nX1 < 0 ) nX1 = 0;
	if( nX1 > m_pImageObject->GetWidth() - 1 ) nX1 = m_pImageObject->GetWidth() - 1;
	if( nY1 < 0 ) nY1 = 0;
	if( nY1 > m_pImageObject->GetHeight() - 1 ) nY1 = m_pImageObject->GetHeight() - 1;
	if( nX2 < 0 ) nX2 = 0;
	if( nX2 > m_pImageObject->GetWidth() - 1 ) nX2 = m_pImageObject->GetWidth() - 1;
	if( nY2 < 0 ) nY2 = 0;
	if( nY2 > m_pImageObject->GetHeight() - 1 ) nY2 = m_pImageObject->GetHeight() - 1;

	m_pImageObject->Crop( nX1, nY1, nX2, nY2 );

	if( m_pTracker->m_rect.right > m_pImageObject->GetWidth() - 1 ) m_pTracker->m_rect.right = m_pImageObject->GetWidth() - 1;
	if( m_pTracker->m_rect.bottom > m_pImageObject->GetHeight() - 1 ) m_pTracker->m_rect.bottom = m_pImageObject->GetHeight() - 1;
	if( m_pTracker->m_rect.left > m_pImageObject->GetWidth() - 40 ) m_pTracker->m_rect.left = m_pImageObject->GetWidth() - 40;
	if( m_pTracker->m_rect.left < 0 ) m_pTracker->m_rect.left = 0;
	if( m_pTracker->m_rect.top > m_pImageObject->GetHeight() - 40 ) m_pTracker->m_rect.top = m_pImageObject->GetHeight() - 40;
	if( m_pTracker->m_rect.top < 0 ) m_pTracker->m_rect.top = 0;

	m_bCropBoxShowing = FALSE;

	ResizeWindow();

}

void CImageViewView::OnOperationsStretch() 
{

	if( m_pImageObject == NULL ) return;

	CNewImageSize NewImageSize;

	NewImageSize.m_nWidth = m_pImageObject->GetWidth();
	NewImageSize.m_nHeight = m_pImageObject->GetHeight();
	char junk[200];
	wsprintf( junk, "The current size is %d by %d", NewImageSize.m_nWidth, NewImageSize.m_nHeight );
	NewImageSize.m_CurrentSize = junk;

	if( NewImageSize.DoModal() == IDOK ){
		m_pImageObject->Stretch( NewImageSize.m_nWidth, NewImageSize.m_nHeight );

		if( m_pTracker != NULL ){
			if( m_pTracker->m_rect.right > m_pImageObject->GetWidth() - 1 ) m_pTracker->m_rect.right = m_pImageObject->GetWidth() - 1;
			if( m_pTracker->m_rect.bottom > m_pImageObject->GetHeight() - 1 ) m_pTracker->m_rect.bottom = m_pImageObject->GetHeight() - 1;
			if( m_pTracker->m_rect.left > m_pImageObject->GetWidth() - 40 ) m_pTracker->m_rect.left = m_pImageObject->GetWidth() - 40;
			if( m_pTracker->m_rect.left < 0 ) m_pTracker->m_rect.left = 0;
			if( m_pTracker->m_rect.top > m_pImageObject->GetHeight() - 40 ) m_pTracker->m_rect.top = m_pImageObject->GetHeight() - 40;
			if( m_pTracker->m_rect.top < 0 ) m_pTracker->m_rect.top = 0;
			}

		m_bCropBoxShowing = FALSE;

		ResizeWindow();
		}

}

void CImageViewView::OnOperationsFlip() 
{

	if( m_pImageObject == NULL ) return;

	m_pImageObject->Reverse();
	InvalidateRect( NULL, FALSE );
	UpdateWindow();
	
}

void CImageViewView::OnOperationsInvert() 
{

	if( m_pImageObject == NULL ) return;

	m_pImageObject->Invert();
	InvalidateRect( NULL, FALSE );
	UpdateWindow();
	
}

void CImageViewView::OnOperationsRotate() 
{

	if( m_pImageObject == NULL ) return;
	
	CRotateImage RotateImage;
	RotateImage.m_Rotate = 0;
	if( RotateImage.DoModal() == IDOK ){
		m_pImageObject->Rotate( 90 + RotateImage.m_Rotate * 90 );
		if( RotateImage.m_Rotate == 1 ){
			InvalidateRect( NULL, FALSE );
			UpdateWindow();
			}
		else ResizeWindow();
		}

}

void CImageViewView::ResizeWindow( void )
{

	CSize SizeTotal;
	SizeTotal.cx = m_pImageObject->GetWidth();
	SizeTotal.cy = m_pImageObject->GetHeight();
	SetScrollSizes (MM_TEXT, SizeTotal);

	CMainFrame *pFrame = (CMainFrame *) AfxGetMainWnd();
	CChildFrame *pChild = (CChildFrame *) pFrame->MDIGetActive();
	pChild->m_nWidth = m_pImageObject->GetWidth(); 
	pChild->m_nHeight = m_pImageObject->GetHeight(); 
	pChild->SetWindowPos( NULL, 0, 0, 2500, 2500, SWP_NOZORDER | SWP_NOMOVE );

}

void CImageViewView::OnOperationsSetpalettecreationtype() 
{

	if( m_pImageObject == NULL ) return;

	CPaletteCreationType PaletteCreationType;
	PaletteCreationType.m_PaletteCreationType = m_pImageObject->GetPaletteCreationType();

	if( PaletteCreationType.DoModal() == IDOK ){
		m_pImageObject->SetPaletteCreationType( PaletteCreationType.m_PaletteCreationType );
		}
	
}

void CImageViewView::OnOperationsChangeimagecolordepth() 
{
	if( m_pImageObject == NULL ) return;

	CNewColorDepth NewColorDepth;
	switch( m_pImageObject->GetNumBits() ){
		case 1:
		case 4:
			NewColorDepth.m_nCurrentColorDepth = -1;
			NewColorDepth.m_nNewColorDepth = 0;
			break;
		case 8:
			NewColorDepth.m_nCurrentColorDepth = 0;
			NewColorDepth.m_nNewColorDepth = 2;
			break;
		case 16:
			NewColorDepth.m_nCurrentColorDepth = 1;
			NewColorDepth.m_nNewColorDepth = 2;
			break;
		case 24:
			NewColorDepth.m_nCurrentColorDepth = 2;
			NewColorDepth.m_nNewColorDepth = 1;
			break;
		case 32:
			NewColorDepth.m_nCurrentColorDepth = 3;
			NewColorDepth.m_nNewColorDepth = 2;
			break;
		}

⌨️ 快捷键说明

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