📄 scanviewerview.cpp
字号:
// 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 + -