// ImageEditWnd.cpp : implementation file // #include "stdafx.h" #include "SkinBuilder.h" #include "ImageEditWnd.h" #include ".\imageeditwnd.h" #include "ImageDlg.h" // CImageEditWnd IMPLEMENT_DYNAMIC( CImageEditWnd , CWnd ) CImageEditWnd::CImageEditWnd() { m_pCurrentBitmap = NULL; m_pImageRect = NULL; m_pImageSection = NULL; //m_tracker.m_rect = CRect(23,23,123,123); m_rtTracker = CRect( 0,0,100,100 ); m_rtMargins = CRect( 0,0,0,0 ); m_tracker.m_nStyle = CRectTracker::resizeOutside; m_fZoom = 1.0f; m_nHScrollPos = 0; m_nVScrollPos = 0; } CImageEditWnd::~CImageEditWnd() { } BEGIN_MESSAGE_MAP(CImageEditWnd, CWnd) ON_WM_PAINT() ON_WM_CREATE() ON_WM_SIZE() ON_WM_VSCROLL() ON_WM_HSCROLL() ON_WM_ERASEBKGND() ON_WM_LBUTTONDOWN() ON_WM_MOUSEMOVE() END_MESSAGE_MAP() // CImageEditWnd message handlers BOOL CImageEditWnd::Create( const RECT & rect , CWnd * pParentWnd ) { // TODO: Add your specialized code here and/or call the base class return CWnd::Create( NULL,NULL,WS_CHILD | WS_VISIBLE | WS_EX_CLIENTEDGE | WS_HSCROLL | WS_VSCROLL,rect,pParentWnd,NULL,NULL ); } void CImageEditWnd::SetScrool() { int nWidth; int nHeight; nHeight = m_pCurrentBitmap->GetHeight(); nWidth = m_pCurrentBitmap->GetWidth(); int nDstHeight, nDstWidht; nDstHeight = ( int ) ( m_fZoom * nHeight ) + 60; nDstWidht = ( int ) ( m_fZoom * nWidth ) + 60; SCROLLINFO si; si.cbSize = sizeof( si ); if ( nDstWidht > m_nViewWidth ) { si.fMask = SIF_PAGE | SIF_RANGE ; si.nMin = 0; si.nMax = nDstWidht + 60; // si.nPos = 30; si.nPage = m_nViewWidth; SetScrollInfo( SB_HORZ,&si,TRUE ); } if ( nDstHeight > m_nViewHeight ) { si.fMask = SIF_PAGE | SIF_RANGE ; si.nMin = 0; si.nMax = nDstHeight + 60; // si.nPos = 30; si.nPage = m_nViewHeight; SetScrollInfo( SB_VERT,&si,TRUE ); } } void CImageEditWnd::OnPaint() { CPaintDC dc ( this ); // device context for painting // TODO: Add your message handler code here // Do not call CWnd::OnPaint() for painting messages if ( !m_pCurrentBitmap ) { return; } /*CRect rtClient; GetClientRect(&rtClient);*/ int nWidth; int nHeight; nHeight = m_pCurrentBitmap->GetHeight(); nWidth = m_pCurrentBitmap->GetWidth(); int nDstHeight, nDstWidht; nDstHeight = ( int ) ( m_fZoom * nHeight ); nDstWidht = ( int ) ( m_fZoom * nWidth ); int nLeft, nTop, nRight, nBottom; //if(nDstWidht > m_nViewWidth || nDstHeight > m_nViewHeight) //{ // SCROLLINFO si; // si.fMask = SIF_PAGE | SIF_RANGE ; // si.nMin = 0; // si.nMax = nDstWidht + 60; // // si.nPos = 30; // si.nPage = m_nViewWidth; // SetScrollInfo (SB_HORZ, &si, TRUE); // si.fMask = SIF_PAGE | SIF_RANGE ; // si.nMin = 0; // si.nMax = nDstHeight + 60; // // si.nPos = 30; // si.nPage = m_nViewHeight; // SetScrollInfo (SB_VERT, &si, TRUE); //} nLeft = 40 - m_nHScrollPos; nTop = 40 - m_nVScrollPos; m_ptLeftTop = CPoint( nLeft,nTop ); nRight = nLeft + nDstWidht; nBottom = nTop + nDstHeight; // CMemDC memDC(&dc,CRect(nLeft,nTop,nRight,nBottom)); m_pCurrentBitmap->Draw( &dc,CRect( nLeft,nTop,nRight,nBottom ),CRect( 0,0,nWidth,nHeight ) ); CRect rtTemp = m_rtTracker; rtTemp.bottom *= (int)m_fZoom; rtTemp.right *= (int)m_fZoom; rtTemp.left *= (int)m_fZoom; rtTemp.top *= (int)m_fZoom; m_tracker.m_rect = rtTemp + m_ptLeftTop; CPen pen ( PS_SOLID,1,RGB( 255,0,0 ) ); CBrush * pOldBrush = ( CBrush * ) dc.SelectStockObject( NULL_BRUSH ); CPen * pOld = dc.SelectObject( &pen ); int nOldROP = dc.SetROP2( R2_COPYPEN ); CRect rtTracker = rtTemp + m_ptLeftTop; CPoint ptStart, ptEnd; CRect rtTempMargins = m_rtMargins; rtTempMargins.left *= (int)m_fZoom; rtTempMargins.right *= (int)m_fZoom; rtTempMargins.bottom *= (int)m_fZoom; rtTempMargins.top *= (int)m_fZoom; if ( rtTempMargins.left ) { ptStart = CPoint( rtTracker.left + rtTempMargins.left,rtTracker.top ); ptEnd = CPoint( rtTracker.left + rtTempMargins.left,rtTracker.bottom ); dc.MoveTo( ptStart ); dc.LineTo( ptEnd ); } if ( rtTempMargins.top ) { ptStart = CPoint( rtTracker.left,rtTracker.top + rtTempMargins.top ); ptEnd = CPoint( rtTracker.right,rtTracker.top + rtTempMargins.top ); dc.MoveTo( ptStart ); dc.LineTo( ptEnd ); } if ( rtTempMargins.right ) { ptStart = CPoint( rtTracker.right - rtTempMargins.right,rtTracker.top ); ptEnd = CPoint( rtTracker.right - rtTempMargins.right,rtTracker.bottom ); dc.MoveTo( ptStart ); dc.LineTo( ptEnd ); } if ( rtTempMargins.bottom ) { ptStart = CPoint( rtTracker.left,rtTracker.bottom - rtTempMargins.bottom ); ptEnd = CPoint( rtTracker.right,rtTracker.bottom - rtTempMargins.bottom ); dc.MoveTo( ptStart ); dc.LineTo( ptEnd ); } m_tracker.Draw( &dc ); dc.Rectangle( rtTracker ); dc.SelectObject( pOld ); dc.SelectObject( pOldBrush ); dc.SetROP2( nOldROP ); } int CImageEditWnd::OnCreate( LPCREATESTRUCT lpCreateStruct ) { if ( CWnd::OnCreate( lpCreateStruct ) == -1 ) { return -1; } CRect rtClient; GetClientRect( &rtClient ); m_nViewWidth = rtClient.Width(); m_nViewHeight = rtClient.Height(); int cx = m_nViewWidth; int cy = m_nViewHeight; int nHScrollMax = 0; m_nHScrollPos = m_nHPageSize = 0; if ( cx < m_nViewWidth ) { nHScrollMax = m_nViewWidth - 1; m_nHPageSize = cx; m_nHScrollPos = min( m_nHScrollPos,m_nViewWidth - m_nHPageSize - 1 ); } SCROLLINFO si; si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS; si.nMin = 0; si.nMax = nHScrollMax; si.nPos = m_nHScrollPos; si.nPage = m_nHPageSize; SetScrollInfo( SB_HORZ,&si,TRUE ); // // Set the vertical scrolling parameters. // int nVScrollMax = 0; m_nVScrollPos = m_nVPageSize = 0; if ( cy < m_nViewHeight ) { nVScrollMax = m_nViewHeight - 1; m_nVPageSize = cy; m_nVScrollPos = min( m_nVScrollPos,m_nViewHeight - m_nVPageSize - 1 ); } si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS; si.nMin = 0; si.nMax = nVScrollMax; si.nPos = m_nVScrollPos; si.nPage = m_nVPageSize; SetScrollInfo( SB_VERT,&si,TRUE ); return 0; } void CImageEditWnd::OnSize( UINT nType , int cx , int cy ) { CWnd::OnSize( nType,cx,cy ); } void CImageEditWnd::OnVScroll( UINT nSBCode , UINT nPos , CScrollBar * pScrollBar ) { // TODO: Add your message handler code here and/or call default int nDelta; switch ( nSBCode ) { case SB_LINELEFT: nDelta = -20; break; case SB_PAGELEFT: nDelta = -m_nVPageSize; break; case SB_THUMBTRACK: nDelta = ( int ) nPos - m_nVScrollPos; break; case SB_PAGERIGHT: nDelta = m_nVPageSize; break; case SB_LINERIGHT: nDelta = 20; break; default: // Ignore other scroll bar messages return; } int nScrollPos = m_nVScrollPos + nDelta; int nMaxPos = m_nViewHeight - m_nVPageSize; if ( nScrollPos < 0 ) { nDelta = -m_nVScrollPos; } else if ( nScrollPos > nMaxPos ) { nDelta = nMaxPos - m_nVScrollPos; } if ( nDelta != 0 ) { m_nVScrollPos += nDelta; SetScrollPos( SB_VERT,m_nVScrollPos,TRUE ); ScrollWindow( 0,-nDelta ); } // CWnd::OnVScroll(nSBCode, nPos, pScrollBar); } void CImageEditWnd::OnHScroll( UINT nSBCode , UINT nPos , CScrollBar * pScrollBar ) { // TODO: Add your message handler code here and/or call default int nDelta; switch ( nSBCode ) { case SB_LINELEFT: nDelta = -20; break; case SB_PAGELEFT: nDelta = -m_nHPageSize; break; case SB_THUMBTRACK: nDelta = ( int ) nPos - m_nHScrollPos; break; case SB_PAGERIGHT: nDelta = m_nHPageSize; break; case SB_LINERIGHT: nDelta = 20; break; default: // Ignore other scroll bar messages return; } int nScrollPos = m_nHScrollPos + nDelta; int nMaxPos = m_nViewWidth - m_nHPageSize; if ( nScrollPos < 0 ) { nDelta = -m_nHScrollPos; } else if ( nScrollPos > nMaxPos ) { nDelta = nMaxPos - m_nHScrollPos; } if ( nDelta != 0 ) { m_nHScrollPos += nDelta; SetScrollPos( SB_HORZ,m_nHScrollPos,TRUE ); ScrollWindow( -nDelta,0 ); // Invalidate(); } //CWnd::OnHScroll(nSBCode, nPos, pScrollBar); } BOOL CImageEditWnd::OnEraseBkgnd( CDC * pDC ) { // TODO: Add your message handler code here and/or call default CRect rtClient; GetClientRect( &rtClient ); CBrush brush ( ::GetSysColor( COLOR_WINDOW ) ); pDC->FillRect( rtClient,&brush ); return TRUE; } void CImageEditWnd::OnLButtonDown( UINT nFlags , CPoint point ) { // TODO: Add your message handler code here and/or call default CRect rtClient; GetClientRect( &rtClient ); if ( m_tracker.Track( this,point,FALSE,NULL ) ) { m_rtTracker = m_tracker.m_rect ; CImageDlg * pDlg = ( CImageDlg * ) GetParent(); m_rtTracker = m_rtTracker - m_ptLeftTop ; m_rtTracker.left = (int) ( float ) ( m_rtTracker.left / m_fZoom); m_rtTracker.top = (int) ( float ) ( m_rtTracker.top / m_fZoom); m_rtTracker.bottom = (int) ( float ) ( m_rtTracker.bottom / m_fZoom); m_rtTracker.right = (int) ( float ) ( m_rtTracker.right / m_fZoom); if ( m_bSection ) m_pImageSection->rtImagePos = m_rtTracker; else m_pImageRect->rtImagePos = m_rtTracker; pDlg->UpdateRect( m_rtTracker ); InvalidateRect( &rtClient ); } CWnd::OnLButtonDown( nFlags,point ); } void CImageEditWnd::OnMouseMove( UINT nFlags , CPoint point ) { // TODO: Add your message handler code here and/or call default UINT uHit = m_tracker.HitTest( point ); m_tracker.SetCursor( this,uHit ); CWnd::OnMouseMove( nFlags,point ); }