// DIBManagerView.cpp : implementation of the CDIBManagerView class // #include "stdafx.h" #include "DIBManager.h" #include "MainFrm.h" #include "DIBManagerDoc.h" #include "DIBManagerView.h" #include "ChildFrm.h" #include "ExportDlg.h" #include "ScaleRollupDlg.h" #include "ImageInfoDlg.h" #include "ResampleImageDlg.h" #include "oxbmpfle.h" #include "UTBStrOp.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[]=__FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CDIBManagerView IMPLEMENT_DYNCREATE(CDIBManagerView, COXZoomView) BEGIN_MESSAGE_MAP(CDIBManagerView, COXZoomView) //{{AFX_MSG_MAP(CDIBManagerView) ON_COMMAND(ID_VIEW_ZOOM_IN, OnViewZoomIn) ON_UPDATE_COMMAND_UI(ID_VIEW_ZOOM_IN, OnUpdateViewZoomIn) ON_COMMAND(ID_VIEW_ZOOM_OUT, OnViewZoomOut) ON_UPDATE_COMMAND_UI(ID_VIEW_ZOOM_OUT, OnUpdateViewZoomOut) ON_COMMAND(ID_VIEW_ZOOM_TO_100, OnViewZoomTo100) ON_UPDATE_COMMAND_UI(ID_VIEW_ZOOM_TO_100, OnUpdateViewZoomTo100) ON_COMMAND(ID_VIEW_ZOOM_TO_WINDOW, OnViewZoomToWindow) ON_UPDATE_COMMAND_UI(ID_INDICATOR_ZOOM, OnUpdateZoom) ON_UPDATE_COMMAND_UI(ID_INDICATOR_SIZE, OnUpdateSize) ON_UPDATE_COMMAND_UI(ID_INDICATOR_PARAMETERS, OnUpdateParameters) ON_UPDATE_COMMAND_UI(ID_FILE_SAVE, OnUpdateFileSave) ON_COMMAND(ID_FILE_EXPORT, OnFileExport) ON_UPDATE_COMMAND_UI(ID_FILE_PROTECTED, OnUpdateFileProtected) ON_COMMAND(ID_FILE_PROTECTED, OnFileProtected) ON_WM_DESTROY() ON_WM_SETFOCUS() ON_COMMAND(ID_VIEW_ZOOM_LEVEL_DLG, OnViewZoomLevelDlg) ON_WM_QUERYNEWPALETTE() ON_WM_PALETTECHANGED() ON_COMMAND(ID_VIEW_IMAGE_INFO, OnViewImageInfo) ON_COMMAND(ID_VIEW_RESAMPLE_IMAGE, OnViewResampleImage) //}}AFX_MSG_MAP ON_ROLLUP_NOTIFICATION() // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDIBManagerView construction/destruction CDIBManagerView::CDIBManagerView() { // TODO: add construction code here SetSmoothScrolling(TRUE); SetSmoothEnvironment(); } CDIBManagerView::~CDIBManagerView() { } BOOL CDIBManagerView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return CView::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CDIBManagerView drawing void CDIBManagerView::OnDraw(CDC* pDC) { CDIBManagerDoc* pDoc=GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here // get the size of image CSize sizeDIB=pDoc->GetDIBSize(); CRect rect(0,0,sizeDIB.cx,sizeDIB.cy); CRect rectPaint=rect; // transform coordinates of boundary rectangle // taking into account current zoom level NormalToScaled(&rectPaint); /// // we have to revert Y-coordinates // to get right print output UINT diff=rect.bottom-rect.top; rect.bottom=sizeDIB.cy-rect.top; rect.top=rect.bottom-diff; /// DrawDIB(pDC,rectPaint,rect); } ///////////////////////////////////////////////////////////////////////////// // CDIBManagerView printing BOOL CDIBManagerView::OnPreparePrinting(CPrintInfo* pInfo) { // default preparation return DoPreparePrinting(pInfo); } void CDIBManagerView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo) { CDIBManagerDoc* pDoc=GetDocument(); ASSERT_VALID(pDoc); // TODO: add extra initialization before printing pInfo->SetMaxPage(pDoc->CalcDIBNumPage(this,pDC)); } void CDIBManagerView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add cleanup after printing } void CDIBManagerView::OnPrint(CDC* pDC, CPrintInfo* pInfo) { // TODO: Add your specialized code here and/or call the base class // print current page PrintPage(pDC, pInfo); } void CDIBManagerView::PrintPage(CDC* pDC, CPrintInfo* pInfo) { CDIBManagerDoc* pDoc=GetDocument(); ASSERT_VALID(pDoc); // define size of image on printer taking into account current zoom level CSize sizeDIB=pDoc->GetDIBSize(); CRect rect(0,0,sizeDIB.cx,sizeDIB.cy); NormalToScaled(&rect); NormalToPrinted(pDC,&rect); // define the rectangle for current printing page // based on the number of all pages in the image int xPrinterRes=pDC->GetDeviceCaps(HORZRES); int yPrinterRes=pDC->GetDeviceCaps(VERTRES); CRect rectPage(xPrinterRes*((pInfo->m_nCurPage-1)%pDoc->m_nXPage), yPrinterRes*((pInfo->m_nCurPage-1)/pDoc->m_nXPage), xPrinterRes*((pInfo->m_nCurPage-1)%pDoc->m_nXPage)+xPrinterRes, yPrinterRes*((pInfo->m_nCurPage-1)/pDoc->m_nXPage)+yPrinterRes); // if size of page is bigger than size of remaining image // then make them equal if(rectPage.right>rect.right) { rectPage.right=rect.right; } if(rectPage.bottom>rect.bottom) { rectPage.bottom=rect.bottom; } // get the coordinates of part of image that is going to be printed // on the current page CRect rectDIB=rectPage; PrintedToNormal(pDC,&rectDIB); ScaledToNormal(&rectDIB); /// // we have to revert Y-coordinates // to get right print output UINT diff=rectDIB.bottom-rectDIB.top; rectDIB.bottom=sizeDIB.cy-rectDIB.top; rectDIB.top=rectDIB.bottom-diff; /// rectPage+=CSize(-rectPage.left,-rectPage.top); DrawDIB(pDC,rectPage,rectDIB); } BOOL CDIBManagerView::DrawDIB(CDC* pDC, CRect& rectDest, CRect& rectSrc) { CDIBManagerDoc* pDoc=GetDocument(); ASSERT_VALID(pDoc); // set neccessary map mode int oldMapMode; oldMapMode=pDC->SetMapMode(MM_TEXT); // depending on current palette use original or dithered image // to render image on display int bSuccess; if(!pDoc->CheckUseDithered()) { bSuccess=pDoc->m_dib.Paint(pDC,rectDest,rectSrc); } else { bSuccess=pDoc->m_dibDither.Paint(pDC,rectDest,rectSrc); } pDC->SetMapMode(oldMapMode); return bSuccess; } void CDIBManagerView::NormalToScaled(CRect* pRect) { int nZoomLevel=GetZoomLevel(); // scale coordinates from normal to scaled // taking into account current zoom level if(nZoomLevel!=100) { pRect->left=((long)((long)pRect->left*(long)nZoomLevel))/(100L); pRect->top=((long)((long)pRect->top*(long)nZoomLevel))/(100L); pRect->right=((long)((long)pRect->right*(long)nZoomLevel))/(100L); pRect->bottom=((long)((long)pRect->bottom*(long)nZoomLevel))/(100L); } } void CDIBManagerView::NormalToScaled(CPoint* pPoint) { int nZoomLevel=GetZoomLevel(); // scale coordinates from normal to scaled // taking into account current zoom level if(nZoomLevel!=100) { pPoint->x=((long)((long)pPoint->x*(long)nZoomLevel))/(100L); pPoint->y=((long)((long)pPoint->y*(long)nZoomLevel))/(100L); } } void CDIBManagerView::ScaledToNormal(CRect* pRect) { int nZoomLevel=GetZoomLevel(); // scale coordinates from scaled to normal // taking into account current zoom level if(nZoomLevel!=100) { pRect->left=((long)((long)pRect->left*100L))/((long)nZoomLevel); pRect->top=((long)((long)pRect->top*100L))/((long)nZoomLevel); pRect->right=((long)((long)pRect->right*100L))/((long)nZoomLevel); pRect->bottom=((long)((long)pRect->bottom*100L))/((long)nZoomLevel); } } void CDIBManagerView::ScaledToNormal(CPoint* pPoint) { int nZoomLevel=GetZoomLevel(); // scale coordinates from scaled to normal // taking into account current zoom level if(nZoomLevel!=100) { pPoint->x=((long)((long)pPoint->x*100L))/((long)nZoomLevel); pPoint->y=((long)((long)pPoint->y*100L))/((long)nZoomLevel); } } void CDIBManagerView::NormalToPrinted(CDC* pDC, CRect* pRect) { // scale coordinates from display to printer // taking into account screen and current printer DPI int xPrinterDPI=pDC->GetDeviceCaps(LOGPIXELSX); int yPrinterDPI=pDC->GetDeviceCaps(LOGPIXELSY); CClientDC dc(this); int xScreenDPI=dc.GetDeviceCaps(LOGPIXELSX); int yScreenDPI=dc.GetDeviceCaps(LOGPIXELSY); if(xPrinterDPI!=xScreenDPI || yPrinterDPI!=yScreenDPI) { pRect->left=((long)((long)pRect->left*(long)xPrinterDPI))/((long)xScreenDPI); pRect->top=((long)((long)pRect->top*(long)yPrinterDPI))/((long)yScreenDPI); pRect->right=((long)((long)pRect->right*(long)xPrinterDPI))/((long)xScreenDPI); pRect->bottom=((long)((long)pRect->bottom*(long)yPrinterDPI))/((long)yScreenDPI); } } void CDIBManagerView::NormalToPrinted(CDC* pDC, CPoint* pPoint) { // scale coordinates from display to printer // taking into account screen and current printer DPI int xPrinterDPI=pDC->GetDeviceCaps(LOGPIXELSX); int yPrinterDPI=pDC->GetDeviceCaps(LOGPIXELSY); CClientDC dc(this); int xScreenDPI=dc.GetDeviceCaps(LOGPIXELSX); int yScreenDPI=dc.GetDeviceCaps(LOGPIXELSY); if(xPrinterDPI!=xScreenDPI || yPrinterDPI!=yScreenDPI) { pPoint->x=((long)((long)pPoint->x*(long)xPrinterDPI))/((long)xScreenDPI); pPoint->y=((long)((long)pPoint->y*(long)yPrinterDPI))/((long)yScreenDPI); } } void CDIBManagerView::PrintedToNormal(CDC* pDC, CRect* pRect) { // scale coordinates from printer to display // taking into account screen and current printer DPI int xPrinterDPI=pDC->GetDeviceCaps(LOGPIXELSX); int yPrinterDPI=pDC->GetDeviceCaps(LOGPIXELSY); CClientDC dc(this); int xScreenDPI=dc.GetDeviceCaps(LOGPIXELSX); int yScreenDPI=dc.GetDeviceCaps(LOGPIXELSY); if(xPrinterDPI!=xScreenDPI || yPrinterDPI!=yScreenDPI) { pRect->left=((long)((long)pRect->left*(long)xScreenDPI))/((long)xPrinterDPI); pRect->top=((long)((long)pRect->top*(long)yScreenDPI))/((long)yPrinterDPI); pRect->right=((long)((long)pRect->right*(long)xScreenDPI))/((long)xPrinterDPI); pRect->bottom=((long)((long)pRect->bottom*(long)yScreenDPI))/((long)yPrinterDPI); } } void CDIBManagerView::PrintedToNormal(CDC* pDC, CPoint* pPoint) { // scale coordinates from printer to display // taking into account screen and current printer DPI int xPrinterDPI=pDC->GetDeviceCaps(LOGPIXELSX); int yPrinterDPI=pDC->GetDeviceCaps(LOGPIXELSY); CClientDC dc(this); int xScreenDPI=dc.GetDeviceCaps(LOGPIXELSX); int yScreenDPI=dc.GetDeviceCaps(LOGPIXELSY); if(xPrinterDPI!=xScreenDPI || yPrinterDPI!=yScreenDPI) { pPoint->x=((long)((long)pPoint->x*(long)xScreenDPI))/((long)xPrinterDPI); pPoint->y=((long)((long)pPoint->y*(long)yScreenDPI))/((long)yPrinterDPI); } } ///////////////////////////////////////////////////////////////////////////// // CDIBManagerView diagnostics #ifdef _DEBUG void CDIBManagerView::AssertValid() const { CView::AssertValid(); } void CDIBManagerView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CDIBManagerDoc* CDIBManagerView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDIBManagerDoc))); return(CDIBManagerDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // A view's OnInitialUpdate() overrideable function is called immediately // after the frame window is created, and the view within the frame // window is attached to its document. This provides the scroll view the // opportunity to set its size(m_totalSize) based on the document size. void CDIBManagerView::OnInitialUpdate() { CDIBManagerDoc* pDoc=GetDocument(); // get the size of DIB image to set ScrollSize of view window CSize sizeDIB=pDoc->m_dib.GetSize(); CRect rectDIB=CRect(0,0,sizeDIB.cx,sizeDIB.cy); SetDeviceScrollSizesRelative(MM_TEXT,rectDIB); SetZoomAlign(ZV_CENTER); } void CDIBManagerView::OnViewZoomIn() { // TODO: Add your command handler code here // up current zoom level on 100% if it is more than 100% already // or on 10% otherwise int nZoomLevel=GetZoomLevel(); if(nZoomLevel=100 ? 100 : 10; nZoomLevel+=nMargin; SetZoomLevel(nZoomLevel); if(GetZoomLevel()>ID_MAX_ZOOM_LEVEL) { SetZoomLevel(ID_MAX_ZOOM_LEVEL); } // if roll-up ZoomLevel dialog is active then // notify it that current zoom level is changed NotifyZoomChanged(); } } void CDIBManagerView::OnUpdateViewZoomIn(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(ID_MAX_ZOOM_LEVEL>GetZoomLevel()); } void CDIBManagerView::OnViewZoomOut() { // TODO: Add your command handler code here // down current zoom level on 100% if it is more than 100% already // or on 10% otherwise int nZoomLevel=GetZoomLevel(); if(nZoomLevel>ID_MIN_ZOOM_LEVEL) { int nMargin=nZoomLevel>100 ? 100 : 10; nZoomLevel-=nMargin; if(nZoomLevelEnable(ID_MIN_ZOOM_LEVELEnable(!bZoomLevelEqual100); pCmdUI->SetCheck(bZoomLevelEqual100); } void CDIBManagerView::OnViewZoomToWindow() { // TODO: Add your command handler code here // zoom to the size of the containing window ZoomToWindow(); if(GetZoomLevel()>ID_MAX_ZOOM_LEVEL) { SetZoomLevel(ID_MAX_ZOOM_LEVEL); } // if roll-up ZoomLevel dialog is active then // notify it that current zoom level is changed NotifyZoomChanged(); } void CDIBManagerView::OnUpdateZoom(CCmdUI* pCmdUI) { CString string=""; string.Format(_T("%u%%"),GetZoomLevel()); pCmdUI->Enable(TRUE); pCmdUI->SetText(string); } void CDIBManagerView::OnUpdateSize(CCmdUI* pCmdUI) { // put length in bytes of image StatusBar CString string=""; CDIBManagerDoc* pDoc=GetDocument(); if(pDoc!=NULL) { DWORD dwSize=pDoc->m_dwImageSize; // if length in bytes is less than 1 kilobyte then show it in bytes // otherwise in kilobytes if(dwSize<1024) { string.Format(_T("%u byte%s"),dwSize,dwSize>1 ? "s" : ""); } else { string.Format(_T("%u.%1u KB"),dwSize/1024,((dwSize%1024)*10)/1024); } } pCmdUI->Enable(TRUE); pCmdUI->SetText(string); } void CDIBManagerView::OnUpdateParameters(CCmdUI* pCmdUI) { // put the size of image on StatusBar CString string=""; CDIBManagerDoc* pDoc=GetDocument(); if(pDoc!=NULL) { CSize sizeDIB=pDoc->m_dib.GetSize(); string.Format(_T("%4u:%u"),sizeDIB.cx,sizeDIB.cy); } pCmdUI->Enable(TRUE); pCmdUI->SetText(string); } void CDIBManagerView::OnUpdateFileSave(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here CDIBManagerDoc* pDoc=GetDocument(); // we can save changes to current document only if // image is of DIB format pCmdUI->Enable(pDoc->m_tf==CDIBManagerDoc::TF_DIB && pDoc->IsModified()); } void CDIBManagerView::OnFileExport() { // TODO: Add your command handler code here // we can save DIB image as JPEG CDIBManagerDoc* pDoc=GetDocument(); CExportDlg exportDlg; // copy current DIB image to the temporary file that // will be transformed into JPEG file CArchive ar(&exportDlg.m_tmpBMPFile, CArchive::store); pDoc->m_dib.Write(ar); ar.Close(); exportDlg.m_tmpBMPFile.SeekToBegin(); if(exportDlg.DoModal()==IDOK) { } } void CDIBManagerView::OnUpdateFileProtected(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetCheck(GetDocument()->m_bProtected); } void CDIBManagerView::OnFileProtected() { // TODO: Add your command handler code here CDIBManagerDoc* pDoc=GetDocument(); pDoc->m_bProtected=!pDoc->m_bProtected; // mark document as dirty only if we really changed the // original protection if(pDoc->m_bProtected==pDoc->m_bInitiallyProtected) { pDoc->SetModifiedFlag(FALSE); } else { pDoc->SetModifiedFlag(); } } void CDIBManagerView::OnDestroy() { COXZoomView::OnDestroy(); // TODO: Add your message handler code here CDIBManagerApp* pApp=(CDIBManagerApp*)AfxGetApp(); // notify roll-up ZoomLevel Dialog that // current view is about to be destroyed CScaleRollupDlg *pScaleRollupDlg=pApp->GetScaleRollupDlg(); pScaleRollupDlg->ReleaseRecipient(this); } void CDIBManagerView::OnSetFocus(CWnd* pOldWnd) { COXZoomView::OnSetFocus(pOldWnd); // TODO: Add your message handler code here // as far as we get focus // simply set our view as message recipient CScaleRollupDlg *pScaleRollupDlg=((CDIBManagerApp *)AfxGetApp())->GetScaleRollupDlg(); if(!pScaleRollupDlg->IsOwner( this )) { pScaleRollupDlg->SetRecipient(this); NotifyZoomChanged(); } DoRealizePalette(TRUE,TRUE); } BOOL CDIBManagerView::OnRollupMessage(CWnd* pWndRollup,UINT message,UINT rollupID) { // get messages from roll-up ZoomLevel Dialog CDIBManagerApp* pApp=(CDIBManagerApp*)AfxGetApp(); CMainFrame* pMainFrame=(CMainFrame*)pApp->m_pMainWnd; CScaleRollupDlg *pScaleRollupDlg=pApp->GetScaleRollupDlg(); if(pScaleRollupDlg->GetRollupID() == rollupID) { switch(message) { // apply set zoom level to the current image case ID_APPLY: { SetZoomLevel(((CScaleRollupDlg*)pWndRollup)->m_nZoomLevel); break; } case IDCANCEL: { pScaleRollupDlg->DestroyWindow(); pMainFrame->m_bShowZoomLevelDlg=FALSE; } default: { TRACE2("Unhandled message %d from Rollup %d\n",message,rollupID); break; } } } // messages from other rollups are being ignored!!! return TRUE; } void CDIBManagerView::OnViewZoomLevelDlg() { // TODO: Add your command handler code here // open roll-up ZoomLevel Dialog CDIBManagerApp* pApp=(CDIBManagerApp*)AfxGetApp(); CMainFrame* pMainFrame=(CMainFrame*)pApp->m_pMainWnd; CDIBManagerDoc* pDoc=GetDocument(); pMainFrame->m_bShowZoomLevelDlg=!pMainFrame->m_bShowZoomLevelDlg; CScaleRollupDlg *pScaleRollupDlg=pApp->GetScaleRollupDlg(); if(pMainFrame->m_bShowZoomLevelDlg) { TCHAR szTitle[20]; UTBStr::tcscpy(szTitle,20, _T("Zoom Level")); // set initial values of dialog vars pScaleRollupDlg->m_nZoomLevel=GetZoomLevel(); CSize sizeDIB=pDoc->m_dib.GetSize(); pScaleRollupDlg->m_nOrigWidth=sizeDIB.cx; pScaleRollupDlg->m_nOrigHeight=sizeDIB.cy; // create roll-up pScaleRollupDlg->CreateRollUp(this, 6458, szTitle); pScaleRollupDlg->ShowWindow(SW_SHOWNORMAL); pScaleRollupDlg->SendMessage(IDM_OX_RU_ARRANGE); SetFocus(); } else { pScaleRollupDlg->DestroyWindow(); } } void CDIBManagerView::NotifyZoomChanged() { CDIBManagerApp* pApp=(CDIBManagerApp*)AfxGetApp(); CMainFrame* pMainFrame=(CMainFrame*)pApp->m_pMainWnd; CDIBManagerDoc* pDoc=GetDocument(); CScaleRollupDlg *pScaleRollupDlg=pApp->GetScaleRollupDlg(); // if roll-up ZoomLevel Dialog is active then // set values of dialog vars if(pMainFrame->m_bShowZoomLevelDlg) { CSize sizeDIB=pDoc->m_dib.GetSize(); pScaleRollupDlg->m_nOrigHeight=sizeDIB.cx; pScaleRollupDlg->m_nOrigWidth=sizeDIB.cy; pScaleRollupDlg->m_nZoomLevel=GetZoomLevel(); pScaleRollupDlg->ShowControls(); // notify roll-up to change values pScaleRollupDlg->RUpdateData(FALSE); } } // next 3 functions // use to display 256 and higher images when // current palette is 8-bit color or less BOOL CDIBManagerView::OnQueryNewPalette() { return DoRealizePalette(TRUE,TRUE)>0 ? TRUE : FALSE; } void CDIBManagerView::OnPaletteChanged(CWnd* pFocusWnd) { if(pFocusWnd!=this) { DoRealizePalette(TRUE,FALSE); } } UINT CDIBManagerView::DoRealizePalette(BOOL bRedraw, BOOL bForeground) { UINT nCount=0; CDIBManagerApp* pApp=(CDIBManagerApp*)AfxGetApp(); // applicable only when current palette is 8-bit or less if(pApp->m_nColors<=8) { CDIBManagerDoc* pDoc=GetDocument(); // retrieve image palette CPalette* pPalette=pDoc->GetDIBPalette(); if(pPalette!=NULL) { CClientDC dc(this); CPalette* pOldPalette=dc.SelectPalette(pPalette,!bForeground); nCount=dc.RealizePalette(); if(nCount>0) { // if image pallete is selected then // redraw image if needed if(bRedraw) { Invalidate(); } dc.SelectPalette(pOldPalette,!bForeground); } } } return nCount; } void CDIBManagerView::OnViewImageInfo() { // TODO: Add your command handler code here CImageInfoDlg dlgInfo; dlgInfo.pDoc=GetDocument(); dlgInfo.DoModal(); } void CDIBManagerView::OnViewResampleImage() { // TODO: Add your command handler code here CDIBManagerDoc* pDoc=GetDocument(); CResampleImageDlg dlgResample; // we provide convertion only from 24-bit image to // 8-bit image by means of dithering dlgResample.m_bCanConvert=pDoc->m_dib.GetNumBitsPerPixel()==24 ? TRUE : FALSE; // we can resize only 24 and 8 bit DIB images dlgResample.m_bCanResize=pDoc->m_dib.GetNumBitsPerPixel()==24 || pDoc->m_dib.GetNumBitsPerPixel()==8 ? TRUE : FALSE; dlgResample.m_nCurrentZoomLevel=GetZoomLevel(); dlgResample.m_bConvertTo=FALSE; dlgResample.m_bMatchZoomLevel=FALSE; dlgResample.m_bMaintainRatio=TRUE; CSize sizeDIB=pDoc->m_dib.GetSize(); dlgResample.m_sHeightOrig.Format(_T("%u"),sizeDIB.cy); dlgResample.m_sWidthOrig.Format(_T("%u"),sizeDIB.cx); dlgResample.m_nWidthPixels=sizeDIB.cx; dlgResample.m_nHeightPixels=sizeDIB.cy; dlgResample.m_nOrigWidth=sizeDIB.cx; dlgResample.m_nOrigHeight=sizeDIB.cy; dlgResample.m_nWidthPercents=100; dlgResample.m_nHeightPercents=100; if(dlgResample.DoModal()==IDOK) { BOOL bChanged=FALSE; if(dlgResample.m_bCanConvert && dlgResample.m_bConvertTo) { // try to dither the image if(!pDoc->m_dib.HalfToneDitherDIB()) { AfxMessageBox(_T("Cannot convert image!")); } else { bChanged=TRUE; } } if(dlgResample.m_bCanResize &&(sizeDIB.cx!=(int)dlgResample.m_nWidthPixels || sizeDIB.cy!=(int)dlgResample.m_nHeightPixels)) { // try to resize if(!pDoc->m_dib.ResizeDIB(dlgResample.m_nWidthPixels, dlgResample.m_nHeightPixels)) { AfxMessageBox(_T("Cannot resize image!")); } else { bChanged=TRUE; } } if(bChanged) { // if we changed image we have to mark it as dirty, pDoc->SetModifiedFlag(TRUE); // set new ScrollSize of view window CRect rectDIB=CRect(0,0,dlgResample.m_nWidthPixels, dlgResample.m_nHeightPixels); SetDeviceScrollSizesRelative(MM_TEXT,rectDIB); // redraw image Invalidate(); } } } BOOL CDIBManagerView::OnScroll(UINT nScrollCode, UINT nPos, BOOL bDoScroll) { // TODO: Add your specialized code here and/or call the base class if(IsSmoothScrolling()) { // // First handle left/right scroll messages. If scrolling by page, // scroll m_nPageSlices times rather than 1. If scrolling by line, // scroll m_nLineSlices times. // BYTE nCode=LOBYTE(nScrollCode); if((nCode==SB_PAGELEFT) ||(nCode==SB_PAGERIGHT) || (nCode==SB_LINELEFT) ||(nCode==SB_LINERIGHT)) { int nCount=0; int nInc=0; int nFinalInc=0; int nLineCode=0; switch(nCode) { case SB_PAGELEFT: { nLineCode=SB_LINELEFT; nInc=m_pageDev.cx/m_nPageSlices; nFinalInc=m_pageDev.cx%m_nPageSlices; nCount=m_nPageSlices; break; } case SB_PAGERIGHT: { nLineCode=SB_LINERIGHT; nInc=m_pageDev.cx/m_nPageSlices; nFinalInc=m_pageDev.cx%m_nPageSlices; nCount=m_nPageSlices; break; } case SB_LINELEFT: { nLineCode=SB_LINELEFT; nInc=m_lineDev.cx/m_nLineSlices; nFinalInc=m_lineDev.cx%m_nLineSlices; nCount=m_nLineSlices; break; } case SB_LINERIGHT: { nLineCode=SB_LINERIGHT; nInc=m_lineDev.cx/m_nLineSlices; nFinalInc=m_lineDev.cx%m_nLineSlices; nCount=m_nLineSlices; break; } } int nOldLineSize=m_lineDev.cx; BOOL bResult=FALSE; DWORD dwTime=0; while(nCount--) { DWORD dwCurrentTime=::GetCurrentTime(); DWORD dwElapsedTime=dwCurrentTime-dwTime; if(dwElapsedTime