#include #include #include ImageView::ImageView(void) { mCreateHandler.setCallback(this,&ImageView::createHandler); mSizeHandler.setCallback(this,&ImageView::sizeHandler); mPaintHandler.setCallback(this,&ImageView::paintHandler); mHorizontalScrollHandler.setCallback(this,&ImageView::horizontalScrollHandler); mVerticalScrollHandler.setCallback(this,&ImageView::verticalScrollHandler); insertHandler(VectorHandler::CreateHandler,&mCreateHandler); insertHandler(VectorHandler::SizeHandler,&mSizeHandler); insertHandler(VectorHandler::PaintHandler,&mPaintHandler); insertHandler(VectorHandler::VerticalScrollHandler,&mVerticalScrollHandler); insertHandler(VectorHandler::HorizontalScrollHandler,&mHorizontalScrollHandler); } ImageView::~ImageView() { removeHandler(VectorHandler::CreateHandler,&mCreateHandler); removeHandler(VectorHandler::SizeHandler,&mSizeHandler); removeHandler(VectorHandler::PaintHandler,&mPaintHandler); removeHandler(VectorHandler::VerticalScrollHandler,&mVerticalScrollHandler); removeHandler(VectorHandler::HorizontalScrollHandler,&mHorizontalScrollHandler); } CallbackData::ReturnType ImageView::createHandler(CallbackData &someCallbackData) { mScrollInfo.hwndOwner(*this); setTitle("None"); return FALSE; } CallbackData::ReturnType ImageView::sizeHandler(CallbackData &someCallbackData) { mScrollInfo.handleSize(someCallbackData); return FALSE; } CallbackData::ReturnType ImageView::paintHandler(CallbackData &someCallbackData) { CursorControl cursorControl; cursorControl.waitCursor(TRUE); mMutex.requestMutex(); if(!mJPGImage.isOkay()) { mMutex.releaseMutex(); cursorControl.waitCursor(FALSE); return (CallbackData::ReturnType)FALSE; } PaintInformation &paintInfo=*((PaintInformation*)someCallbackData.lParam()); PureDevice &paintDevice=(PureDevice&)paintInfo; if(mScrollInfo.sizeEvent()) { mScrollInfo.sizeEvent(FALSE); mJPGImage.draw(paintDevice,Rect(0,0,mJPGImage.width(),mJPGImage.height()),Point(mScrollInfo.currScrollx(),mScrollInfo.currScrolly())); } if(mScrollInfo.scrollEvent()||(!mScrollInfo.sizeEvent()&&!mScrollInfo.scrollEvent())) { Rect paintRect(paintInfo.paintRect()); mScrollInfo.scrollEvent(FALSE); paintRect.right(paintRect.right()-paintRect.left()); paintRect.bottom(paintRect.bottom()-paintRect.top()); mJPGImage.draw(paintDevice,paintRect,Point(paintRect.left()+mScrollInfo.currScrollx(),paintRect.top()+mScrollInfo.currScrolly())); } mMutex.releaseMutex(); cursorControl.waitCursor(FALSE); return (CallbackData::ReturnType)FALSE; } CallbackData::ReturnType ImageView::verticalScrollHandler(CallbackData &someCallbackData) { mScrollInfo.handleVerticalScroll(someCallbackData); return (CallbackData::ReturnType)FALSE; } CallbackData::ReturnType ImageView::horizontalScrollHandler(CallbackData &someCallbackData) { mScrollInfo.handleHorizontalScroll(someCallbackData); return (CallbackData::ReturnType)FALSE; } BOOL ImageView::open(const String &strPathFileName) { String strString; CursorControl cursorControl; BOOL result; if(strPathFileName.isNull())return FALSE; cursorControl.waitCursor(TRUE); mMutex.requestMutex(); PureDevice pureDevice(*this); result=mJPGImage.decode(strPathFileName,pureDevice); mMutex.releaseMutex(); cursorControl.waitCursor(FALSE); if(!result)return FALSE; mScrollInfo.scrollableObjectDimensions(mJPGImage.width(),mJPGImage.height()); setTitle(strPathFileName); ::sprintf(strString,"%s (%dx%d)",(LPSTR)strPathFileName,mJPGImage.width(),mJPGImage.height()); invalidate(); return TRUE; } void ImageView::setTitle(const String &strTitle) { String strCaption; String strString; windowText(strCaption); strString=strCaption; strCaption=strCaption.betweenString(0,' '); if(strCaption.isNull())strCaption=strString; strCaption+=String(" - [")+strTitle+String("]"); setCaption(strCaption); } BOOL ImageView::fitToWindow(void) { PureDevice pureDevice(*this); CursorControl cursorControl; if(!mJPGImage.isOkay())return false; cursorControl.waitCursor(true); mJPGImage.resample(pureDevice,width()); mScrollInfo.scrollableObjectDimensions(mJPGImage.width(),mJPGImage.height()); cursorControl.waitCursor(false); invalidate(); return true; } // *** virtuals void ImageView::preRegister(WNDCLASS &wndClass) { wndClass.style|=CS_SAVEBITS|CS_OWNDC; wndClass.hbrBackground=(HBRUSH)::GetStockObject(WHITE_BRUSH); } void ImageView::preCreate(MDICREATESTRUCT &createStruct) { createStruct.style|=WS_VSCROLL|WS_HSCROLL; }