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

📄 scanviewerview.cpp

📁 看图软件
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// ScanViewerView.cpp : CScanViewerView 类的实现
//

#include "stdafx.h"
#include "ScanViewer.h"

#include "ScanViewerDoc.h"
#include "ScanViewerView.h"
#include ".\scanviewerview.h"


#define WM_MYMSG_UPMYVIEW  WM_USER+100           //用户要定义一个用户消息
#define WM_MY_MSG_SEARCHFOLDER WM_USER+101       //用户要定义一个用户消息,用于搜索图片目录


#ifdef _DEBUG
#define new DEBUG_NEW
#endif



// CScanViewerView

IMPLEMENT_DYNCREATE(CScanViewerView, CScrollView)

BEGIN_MESSAGE_MAP(CScanViewerView, CScrollView)
	// 标准打印命令
	ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
	ON_COMMAND(D_NAV_PAPEDNIMG, OnNavPapednimg)
	ON_COMMAND(ID_NAV_PAPEUPIMG, OnNavPapeupimg)
	ON_COMMAND(ID_NAV_HOMEIMG, OnNavHomeimg)
	ON_COMMAND(ID_NAV_ENDIMG, OnNavEndimg)
	ON_COMMAND(ID_SETBKCOLOR, OnSetbkcolor)
	ON_COMMAND(ID_FULLSIZE, OnFullsize)
	ON_COMMAND(ID_EQUALSIZE, OnEqualsize)
	ON_COMMAND(ID_EQUALWIDTH, OnEqualwidth)
	ON_COMMAND(ID_EQUALHEIGHT, OnEqualheight)
	ON_COMMAND(ID_MAGNIFY, OnMagnify)
	ON_COMMAND(ID_REDUCE, OnReduce)
	ON_MESSAGE(WM_MY_MSG_SEARCHFOLDER , MSGOpenFirstPhoto) 
	ON_MESSAGE(WM_MYMSG_UPMYVIEW, MSGUpdateMyView) 
	ON_WM_NCCALCSIZE()
	ON_WM_TIMER()
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONUP()
	ON_WM_LBUTTONDBLCLK()
	ON_WM_MBUTTONDOWN()		
	ON_WM_KEYDOWN()
	ON_WM_ERASEBKGND()
	ON_UPDATE_COMMAND_UI(ID_FULLSIZE, OnUpdateFullsize)
	ON_UPDATE_COMMAND_UI(ID_EQUALSIZE, OnUpdateEqualsize)
	ON_UPDATE_COMMAND_UI(ID_EQUALWIDTH, OnUpdateEqualwidth)
	ON_UPDATE_COMMAND_UI(ID_EQUALHEIGHT, OnUpdateEqualheight)
	ON_COMMAND(ID_CLOCKWISE_ROTATE_0, OnClockwiseRotate0)
	ON_COMMAND(ID_CLOCKWISE_ROTATE_90, OnClockwiseRotate90)
	ON_COMMAND(ID_CLOCKWISE_ROTATE_180, OnClockwiseRotate180)
	ON_COMMAND(ID_CLOCKWISE_ROTATE_270, OnClockwiseRotate270)
	ON_UPDATE_COMMAND_UI(ID_CLOCKWISE_ROTATE_0, OnUpdateClockwiseRotate0)
	ON_UPDATE_COMMAND_UI(ID_CLOCKWISE_ROTATE_90, OnUpdateClockwiseRotate90)
	ON_UPDATE_COMMAND_UI(ID_CLOCKWISE_ROTATE_180, OnUpdateClockwiseRotate180)
	ON_UPDATE_COMMAND_UI(ID_CLOCKWISE_ROTATE_270, OnUpdateClockwiseRotate270)
END_MESSAGE_MAP()

// CScanViewerView 构造/析构

CScanViewerView::CScanViewerView()
: m_bDragPhotoState(FALSE)
, m_enImgS(CENTER_CENTER)   
, m_enViewSize(FULL_SIZE)
, m_enClockwiseRotate(CLOCKWISE_ROTATE_0)
, m_strUpwardsImgPath(_T(""))
, m_strNextImgPath(_T(""))
, m_strThreadFindFirstPhoto(_T(""))
{
	// TODO: 在此处添加构造代码
	m_BkColor=RGB(0, 0, 0);              //设置背景色
}

CScanViewerView::~CScanViewerView()
{
	//释放资源
	if (!imgShow.IsNull())	imgShow.Destroy();
}


BOOL CScanViewerView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或
	// 样式
	//修改视图窗口的显示性质,背景为m_BkColor
	//cs.lpszClass=AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW,::LoadCursor(NULL, IDC_ARROW),(HBRUSH)::GetStockObject(BLACK_BRUSH),::LoadIcon(NULL, IDI_APPLICATION));
	cs.lpszClass=AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW,::LoadCursor(NULL, IDC_ARROW),HBRUSH(CreateSolidBrush(m_BkColor)),::LoadIcon(NULL, IDI_APPLICATION));		
	return CScrollView::PreCreateWindow(cs);
}

// CScanViewerView 绘制

void CScanViewerView::OnDraw(CDC* pDC)
{
	CScanViewerDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 在此处为本机数据添加绘制代码		
	if (!imgShow.IsNull())	
	{		
		CRect rectClient;
		GetClientRect(&rectClient);	                                                                 //获取客户区的大小	

		//设置图片显示的位置
		UINT unSStateX=BLANK_LEFT,unSStateY=BLANK_TOP;
		switch(m_enImgS)
		{
		case LEFT_UP:
			unSStateX=BLANK_LEFT;unSStateY=BLANK_TOP;
			break;
		case CENTER_UP:
			if (rectClient.Width()>(imgShow.GetWidth()+BLANK_LEFT+BLANK_RIGHT))
				unSStateX=(rectClient.Width()-imgShow.GetWidth())/2;						
			break;
		case RIGHT_UP:
			if (rectClient.Width()>(imgShow.GetWidth()+BLANK_LEFT+BLANK_RIGHT))
				unSStateX=rectClient.Width()-imgShow.GetWidth()-BLANK_RIGHT;						
			break;

		case LEFT_CENTER:
			unSStateX=BLANK_LEFT;
			if (rectClient.Height()>(imgShow.GetHeight()+BLANK_TOP+BLANK_BOTTOM))
				unSStateY=(rectClient.Height()-imgShow.GetHeight())/2;
			break;
		case CENTER_CENTER:
			if (rectClient.Width()>(imgShow.GetWidth()+BLANK_LEFT+BLANK_RIGHT))
				unSStateX=(rectClient.Width()-imgShow.GetWidth())/2;	
			if (rectClient.Height()>(imgShow.GetHeight()+BLANK_TOP+BLANK_BOTTOM))
				unSStateY=(rectClient.Height()-imgShow.GetHeight())/2;
			break;
		case RIGHT_CENTER:
			if (rectClient.Width()>(imgShow.GetWidth()+BLANK_LEFT+BLANK_RIGHT))
				unSStateX=rectClient.Width()-imgShow.GetWidth()-BLANK_RIGHT;						
			if (rectClient.Height()>(imgShow.GetHeight()+BLANK_TOP+BLANK_BOTTOM))
				unSStateY=(rectClient.Height()-imgShow.GetHeight())/2;
			break;

		case LEFT_DOWN:
			unSStateX=BLANK_LEFT;
			if (rectClient.Height()>(imgShow.GetHeight()+BLANK_TOP+BLANK_BOTTOM))
				unSStateY=rectClient.Height()-imgShow.GetHeight()-BLANK_BOTTOM;
			break;
		case CENTER_DOWN:
			if (rectClient.Width()>(imgShow.GetWidth()+BLANK_LEFT+BLANK_RIGHT))
				unSStateX=(rectClient.Width()-imgShow.GetWidth())/2;	
			if (rectClient.Height()>(imgShow.GetHeight()+BLANK_TOP+BLANK_BOTTOM))
				unSStateY=rectClient.Height()-imgShow.GetHeight()-BLANK_BOTTOM;
			break;
		case RIGHT_DOWN:
			if (rectClient.Width()>(imgShow.GetWidth()+BLANK_LEFT+BLANK_RIGHT))
				unSStateX=rectClient.Width()-imgShow.GetWidth()-BLANK_RIGHT;	
			if (rectClient.Height()>(imgShow.GetHeight()+BLANK_TOP+BLANK_BOTTOM))
				unSStateY=rectClient.Height()-imgShow.GetHeight()-BLANK_BOTTOM;
			break;

		default:			
			break;
		}

			
		//重画非图像区域
		CRect rcNClient(&rectClient);
		if (imgShow.GetWidth()>rectClient.Width()) rcNClient.right=imgShow.GetWidth()+BLANK_LEFT+BLANK_RIGHT;
		if (imgShow.GetHeight()>rectClient.Height()) rcNClient.bottom=imgShow.GetHeight()+BLANK_TOP+BLANK_BOTTOM;
		CRect rectImg(unSStateX,unSStateY,unSStateX+imgShow.GetWidth(),unSStateY+imgShow.GetHeight());
		CRgn crgnClient,crgnImg,crgnFrame;
		crgnClient.CreateRectRgnIndirect(&rcNClient);
		crgnImg.CreateRectRgnIndirect(&rectImg);
		crgnFrame.CreateRectRgnIndirect(&rcNClient);
		crgnFrame.CombineRgn(&crgnClient,&crgnImg,RGN_XOR);
		pDC->FillRgn(&crgnFrame,&CBrush (m_BkColor)); 

		imgShow.Draw(pDC->m_hDC,unSStateX,unSStateY);		//显示图片			
	}
	else
	{
		CRect rectClient;
		GetClientRect(&rectClient);	   				
		pDC->FillRect(rectClient, &CBrush (m_BkColor));
	}
}



//idcomcn2007
//3:53 2007-9-22
//改变背色(颜色对话框)
void CScanViewerView::OnSetbkcolor()
{
	// TODO: 在此添加命令处理程序代码
	//颜色对话框
	CColorDialog   colorDlg;   
	if(colorDlg.DoModal()   !=   IDOK)   return;   
	m_BkColor=   colorDlg.GetColor();   

	AfxGetMainWnd()->Invalidate();
}


void CScanViewerView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();
	CSize sizeTotal;
	// TODO: 计算此视图的合计大小
	sizeTotal.cx = sizeTotal.cy = 100;            //在此修改滚动条
	CImage imgTest;
	CString strOpenPathName=GetDocument()->GetPathName();       //获取打开的路径
	if (!(strOpenPathName.IsEmpty())) imgTest.Load(strOpenPathName);
	if (!(imgTest.IsNull())) 
	{
		switch(m_enClockwiseRotate)
		{
		case CLOCKWISE_ROTATE_0:                                       //顺时针方向旋转0度
		case CLOCKWISE_ROTATE_180:                                     //顺时针方向旋转180度
			sizeTotal.cx=imgTest.GetWidth()+BLANK_LEFT+BLANK_RIGHT;
			sizeTotal.cy=imgTest.GetHeight()+BLANK_TOP+BLANK_BOTTOM;
			break;
		case CLOCKWISE_ROTATE_90:                                      //顺时针方向旋转90度
		case CLOCKWISE_ROTATE_270:                                     //顺时针方向旋转270度
			sizeTotal.cx=imgTest.GetHeight()+BLANK_LEFT+BLANK_RIGHT;
			sizeTotal.cy=imgTest.GetWidth()+BLANK_TOP+BLANK_BOTTOM;
			break;
		default:
			break;
		}
	}
	imgTest.Destroy();

	//((CScanViewerApp *)AfxGetApp())->IntegerToStringForTest(2,sizeTotal.cx,sizeTotal.cy);

	///////////////////////////////////////////////////////////////////调节视口大小//////////////////////////////////////////////////////////////////////////
	CRect rectClient;
	GetClientRect(&rectClient);
	UINT unTWidth=sizeTotal.cx;
	UINT unTHeight=sizeTotal.cy;		
	switch(m_enViewSize)
	{
	case FULL_SIZE:                                    //实际大小
		{		
			sizeTotal.SetSize(unTWidth,unTHeight);
		}
		break;
	case EQUAL_SIZE:                                   //合适大小
		{
			UINT unTW=unTWidth,unTH=unTHeight;
			if ((UINT)rectClient.Width()<unTWidth) {unTW=rectClient.Width();unTH=rectClient.Width()*unTHeight/unTWidth;}
			if ((UINT)rectClient.Height()<unTH) {unTW=rectClient.Height()*unTW/unTH;unTH=rectClient.Height();}
			sizeTotal.SetSize(unTW,unTH);
		}
		break;
	case EQUAL_WIDTH:                                  //合适宽度
		{
			UINT unTW=unTWidth,unTH=unTHeight;
			if ((UINT)rectClient.Width()<unTWidth) {unTW=rectClient.Width();unTH=rectClient.Width()*unTHeight/unTWidth;}
			sizeTotal.SetSize(unTW,unTH);
		}
		break;
	case EQUAL_HEIGHT:                                 //合适高度
		{
			UINT unTW=unTWidth,unTH=unTHeight;
			if ((UINT)rectClient.Height()<unTHeight) {unTW=rectClient.Height()*unTWidth/unTHeight;unTH=rectClient.Height();}
			sizeTotal.SetSize(unTW,unTH);
		}
		break;
	default:
		break;
	}
	///////////////////////////////////////////////////////////////////调节视口大小//////////////////////////////////////////////////////////////////////////

	//SetScrollSizes(MM_TEXT, sizeTotal);
	SetScrollSizes(MM_TEXT, sizeTotal,CSize(150,150),CSize(4,4));
	ScrollToPosition(CPoint(0,0));                 //窗口复位	

	//AfxMessageBox(strOpenPathName+"\n"+"ok");

	//寻找第一张图片
	if((GetDocument()->m_bIsFolder)&&(!(strOpenPathName.IsEmpty())))
	{
		m_strThreadFindFirstPhoto=GetDocument()->GetPathName();
		AfxBeginThread(ThreadFindFirstPhoto,this, THREAD_PRIORITY_NORMAL);  
	}
}



//idcomcn2007
//21:39 2007-12-16
void CScanViewerView::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CSize   sizeClient;   
	CSize   sizeSb;   
	GetTrueClientSize(sizeClient,   sizeSb);   

	BOOL   hasHorzBar(FALSE);   
	BOOL   hasVertBar(FALSE);   
	CheckScrollBars(hasHorzBar,hasVertBar);   
	if (hasHorzBar)  lpncsp->rgrc[0].bottom   +=   GetSystemMetrics(SM_CYHSCROLL);     //Hide horizontal scroll bar
	if (hasVertBar)  lpncsp->rgrc[0].right  +=   GetSystemMetrics(SM_CXVSCROLL);       //Hide vertical scroll bar
	//if (hasHorzBar)  lpncsp->rgrc[0].bottom   +=   GetSystemMetrics(SM_CYHSCROLL)+abs(sizeSb.cy-GetSystemMetrics(SM_CYHSCROLL));     //Hide horizontal scroll bar
	//if (hasVertBar)  lpncsp->rgrc[0].right  +=   GetSystemMetrics(SM_CXVSCROLL)+abs(sizeSb.cx-GetSystemMetrics(SM_CXVSCROLL));       //Hide vertical scroll bar

	CScrollView::OnNcCalcSize(bCalcValidRects, lpncsp);
}



//idcomcn2007
//8:40 2007-12-12
//文档数据修改后,自动更新视图类
void CScanViewerView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
	// TODO: 在此添加专用代码和/或调用基类
	CString strPathName=GetDocument()->GetPathName();
	if (strPathName.IsEmpty()) 
	{
		if (!imgShow.IsNull()) imgShow.Destroy();
		AfxGetMainWnd()->Invalidate();		                 // 强制更新窗口大小	
	};
	///////////////////////////////////////////////////////////////////遍历图片//////////////////////////////////////////////////////////////////////////
	//如果装载的不是图片则返回
	BOOL bImg=FALSE;
	CImage imgTest;
	if (!(strPathName.IsEmpty())) imgTest.Load(strPathName);
	(imgTest.IsNull())? bImg=FALSE:bImg=TRUE;
	imgTest.Destroy();
	if (bImg) BuildImage(strPathName);
	else return ;


	//传递路径,遍历图片
	if (m_strPhotoFileArray.IsEmpty()) 
		SearchFolder();
	else

⌨️ 快捷键说明

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