📄 viewwnd.cpp
字号:
//显示窗口类
#include "stdafx.h"
#include "source10.h"
#include "ViewWnd.h"
#include "Scanner.h"
#include "Data.h"
#include "ConWnd.h"
#include "Const.h"
#include "HRulerWnd.h"
#include "VRulerWnd.h"
#include "SetScanner.h"
#include "postionInfo.h"
#include "Settings.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern CSource10App theApp;
extern CData *pData;
extern CScanner *pScanner;
extern CSetScanner* pSetScanner;
extern CContainerWnd *pContainerWnd;
extern CVRulerWnd *pVRulerWnd;
extern CHRulerWnd *pHRulerWnd;
extern CViewWnd *pViewWnd;
extern CpostionInfo *m_pPositionInfo;
extern CSettings *m_pSettingsWindow;
extern char SourceControl[260];
extern char DisplayFileName[80];
extern char InitDir2[100];
/////////////////////////////////////////////////////////////////////////////
//构造函数,通常在此进行初始化工作 //
/////////////////////////////////////////////////////////////////////////////
CViewWnd::CViewWnd()
{
CFile myFile;
RECT tempRect;
HDIB hbmp;
char IniFile[120];
int left,top,right,bottom;
GetWindowsDirectory(IniFile,sizeof(IniFile));
char* pFileName=lstrcat(IniFile,"\\twain_32\\MTIScanner\\preview.bmp");
//表示鼠标未按下
bTrack=FALSE;
bTrackHand=FALSE;
//表示鼠标拉伸方向,用于鼠标对扫描框的拖拉
H=FALSE;
V=FALSE;
L=FALSE;
//
m_bSelectZoom=FALSE;
//从文件中获得扫描框的初始值
GetWindowsDirectory(InitDir2,sizeof(InitDir2));
lstrcat(InitDir2,"\\twain_32\\MTIScanner\\jiaose.ini");
left = GetPrivateProfileInt("select","left",0,InitDir2);
top = GetPrivateProfileInt("select","top",0,InitDir2);
right = GetPrivateProfileInt("select","right",0,InitDir2);
bottom = GetPrivateProfileInt("select","bottom",0,InitDir2);
// int shuzu3,shuzu5;
shuzu3= 3310;//西飞3968; //扫描宽度 = 宽度(实际 -英寸)*分辨率(600)/10
shuzu5= 4680; //西飞9200; //扫描高度 = 高度(实际 -英寸)*分辨率(600)/10
if(left<0)
{
left = 0;
}
if(left>=shuzu3)
{
left =shuzu3;
}
if(top<0)
{
top = 0;
}
if(top>=shuzu5)
{
top =shuzu5;
}
if(right<0)
{
right=0;
}
if(right>=shuzu3)
{
right=shuzu3;
}
if(bottom<0)
{
bottom= 0;
}
if(bottom>=shuzu5)
{
bottom=shuzu5;
}
m_SelectZoom.left=left;
m_SelectZoom.top=top;
m_SelectZoom.right=right;
m_SelectZoom.bottom=bottom;
//确定实际扫描框的位置信息
tempRect.top = m_SelectZoom.top*10;
tempRect.left = m_SelectZoom.left*10;
tempRect.right = m_SelectZoom.right*10;
tempRect.bottom = m_SelectZoom.bottom*10;
pScanner->SetSelectZoom(tempRect);
//初始时,存在垂直滚动条
nPos1=GetScrollPos(SB_HORZ);
nPos2 =GetScrollPos(SB_VERT);
//调用预览图像,在这里,应该增加如果没有预览图像或者被破坏后,
//界面能被打开
hbmp=::ReadDIBFile( pFileName );
if(hbmp==NULL)
{
MessageBox("不存在预览图像文件,重新预览图像","出错",MB_OK);
return;
}
else
{
pScanner->SetHandleofPreviewBMP(hbmp);
hbmp=::ReadDIBFile( pFileName );
pScanner->SetHandleofAdjustedPreviewBMP(hbmp);
hbmp=::ReadDIBFile( pFileName );
}
}
/////////////////////////////////////////////////////////////////////
//析构函数 //
/////////////////////////////////////////////////////////////////////
CViewWnd::~CViewWnd()
{
}
////////////////////////////////////////////////////////////////////
//消息映射 //
////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CViewWnd, CWnd)
//{{AFX_MSG_MAP(CViewWnd)
ON_WM_PAINT()
ON_WM_ACTIVATE()
ON_WM_LBUTTONUP()
ON_WM_ACTIVATEAPP()
ON_WM_CREATE()
ON_WM_SETCURSOR()
ON_WM_ASKCBFORMATNAME()
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_WM_CANCELMODE()
ON_WM_KEYDOWN()
ON_WM_KEYUP()
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//响应系统命令ON_WM_PAINT(),系统在刷新画面的时候,发出此命令 //
/////////////////////////////////////////////////////////////////////////////
void CViewWnd::OnPaint()
{
CFile myFile;
BOOL bDone=TRUE;
HANDLE hDIB=NULL;
CPalette* palDIB;
CPaintDC dc(this);
OnPrepareDC(&dc);
CPen *pOldPen;
//用红笔画点化线,绿色笔写文本
CPen GridsPen(PS_DASHDOT,1,RGB(255,0,0));
pOldPen = dc.SelectObject( &GridsPen );
dc.SetTextColor(RGB(0,0,255) );
dc.MoveTo(5,4680); //H A0
dc.LineTo(3310,4680);
dc.MoveTo(3310,5); //V A0
dc.LineTo(3310,4680);
dc.TextOut(3260, 4730, "A0", 2);
dc.MoveTo(5,3310); //H A1
dc.LineTo(2339,3310);
dc.MoveTo(2339,5); //V A1
dc.LineTo(2339,3310);
dc.TextOut(2389, 3360, "A1", 2);
dc.MoveTo(5,2339); //H A2
dc.LineTo(1654,2339);
dc.MoveTo(1654,5); //V A2
dc.LineTo(1654,2339);
dc.TextOut(1704,2389, "A2", 2);
dc.MoveTo(5,1654); //H A3
dc.LineTo(1169,1654);
dc.MoveTo(1169,5); //V A3
dc.LineTo(1169,1654);
dc.TextOut(1219,1704, "A3", 2);
dc.MoveTo(5,1169); //H A3
dc.LineTo(827,1169);
dc.MoveTo(827,5); //V A3
dc.LineTo(827,1169);
dc.TextOut(857,1219, "A4", 2);
//由于扫描选择框是动态的,因此设置时间间隔
SetTimer(1,200,NULL);
hDIB=pScanner->GetHandleofPreviewBMP();
//在显示窗口中画预览图像
if (hDIB != NULL)
{
bDone = TRUE;
palDIB = new CPalette;
if(palDIB == NULL)
{
::GlobalFree((HGLOBAL) hDIB);
hDIB = NULL;
return;
}
if (::CreateDIBPalette((struct HDIB__ *)hDIB, palDIB) == NULL)
{
delete palDIB;
palDIB = NULL;
}
CPalette* oldPalette=dc.SelectPalette( palDIB, TRUE);
UINT nColorsChanged=dc.RealizePalette();
LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
int cxDIB = (int) ::DIBWidth(lpDIB);
int cyDIB = (int) ::DIBHeight(lpDIB);
::GlobalUnlock((HGLOBAL) hDIB);
//确定预览图像的显示区域
CRect rcDIB;
CRect rcDest;
rcDIB.top=0;
rcDIB.left=0;
rcDIB.right = cxDIB;
rcDIB.bottom =cyDIB;
rcDest.top=GetPrivateProfileInt("yuandian","y0",0,InitDir2);
rcDest.left=GetPrivateProfileInt("yuandian","x0",0,InitDir2);
rcDest.bottom=GetPrivateProfileInt("yuandian","high",0,InitDir2);
rcDest.right=GetPrivateProfileInt("yuandian","width",0,InitDir2);
//将预览图显示在特定扫描区域中
bDone=::PaintDIB(dc.m_hDC, &rcDest,(struct HDIB__ *)hDIB,
&rcDIB, palDIB);
dc.SelectPalette(oldPalette,TRUE);
}
}
/////////////////////////////////////////////////////////////////////////
//响应WINDOWS消息OnActivate //
/////////////////////////////////////////////////////////////////////////
void CViewWnd::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
{
CWnd::OnActivate(nState, pWndOther, bMinimized);
}
/////////////////////////////////////////////////////////////////////////
//实现设备空间和逻辑空间的映射关系 //
/////////////////////////////////////////////////////////////////////////
void CViewWnd::OnPrepareDC(CDC * pDC)
{
CSize sz;
POINT pt= {0,00};
pDC->SetMapMode(MM_ANISOTROPIC);
sz = pDC->SetWindowExt(pData->m_nZoomFactor,pData->m_nZoomFactor);
sz = pDC->SetViewportExt(1,1);
sz = pDC->GetWindowExt();
if(pData->m_nZoomFactor==8)
{
pDC->SetWindowOrg(nPos1,nPos2);
}
else
{
pDC->SetWindowOrg(pData->m_ptPaintOrg);
}
}
/////////////////////////////////////////////////////////////////////////
//响应WINDOWS消息WM_OnActivateApp //
/////////////////////////////////////////////////////////////////////////
void CViewWnd::OnActivateApp(BOOL bActive, HTASK hTask)
{
CWnd::OnActivateApp(bActive, hTask);
}
//////////////////////////////////////////////////////////////////////////
//响应系统消息,产生窗口,在这里是装入初始鼠标形状 //
//////////////////////////////////////////////////////////////////////////
int CViewWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
m_curZoomIn = theApp.LoadCursor(202);
if(m_curZoomIn == NULL) AfxMessageBox("Load Cursor failed.");
return 0;
}
///////////////////////////////////////////////////////////////////////
//设置鼠标形状 //
///////////////////////////////////////////////////////////////////////
BOOL CViewWnd::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
switch(m_iCursorType)
{
case CT_ZOOMIN:
::SetCursor(m_curZoomIn);
break;
case CT_CROSS:
::SetCursor(::LoadCursor(NULL,IDC_CROSS) );
break;
case CT_HAND:
::SetCursor(theApp.LoadCursor(IDC_HAND));
break;
case CT_ZOOMOUT:
::SetCursor(theApp.LoadCursor(203));
break;
default:
return CWnd::OnSetCursor(pWnd, nHitTest, message);
}
return TRUE;
}
//////////////////////////////////////////////////////////////////
// ?
//////////////////////////////////////////////////////////////////
void CViewWnd::OnAskCbFormatName(UINT nMaxCount, LPTSTR lpszString)
{
CWnd::OnAskCbFormatName(nMaxCount, lpszString);
}
////////////////////////////////////////////////////////////////////
//响应系统命令
////////////////////////////////////////////////////////////////////
BOOL CViewWnd::OnCommand(WPARAM wParam, LPARAM lParam)
{
AfxMessageBox("Command in CViewWnd");
return CWnd::OnCommand(wParam, lParam);
}
void CViewWnd::CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType)
{
CWnd::CalcWindowRect(lpClientRect, nAdjustType);
}
//////////////////////////////////////////////////////////////////
//在显示区中鼠标左键按下时的操作 //
//////////////////////////////////////////////////////////////////
void CViewWnd::OnLButtonDown(UINT nFlags, CPoint point)
{
CClientDC DC(this);
CPen newPen(PS_SOLID, 1, RGB(0,0,0));
CPen* oldPen;
oldPen=DC.SelectObject( &newPen );
int n,m;
//记录鼠标左键按下的点
m_ptStart = point;
//根据鼠标不同形状,执行不同操作
switch(m_iCursorType)
{
case CT_CROSS:
if(!bTrack) //现在按下并且拉动
{
bTrack=TRUE;
SetCapture();
KillTimer(1);
n=m_SelectZoom.right-m_SelectZoom.left;
m=m_SelectZoom.bottom-m_SelectZoom.top;
//右下角
if((point.x*(pData->m_nZoomFactor)+nPos1)<(m_SelectZoom.right+8*(pData->m_nZoomFactor))&&(point.x*(pData->m_nZoomFactor)+nPos1)>(m_SelectZoom.right-5*pData->m_nZoomFactor)&&
(point.y*(pData->m_nZoomFactor)+nPos2)<(m_SelectZoom.bottom+8*pData->m_nZoomFactor)&&(point.y*(pData->m_nZoomFactor)+nPos2)>(m_SelectZoom.bottom-5*pData->m_nZoomFactor))
{
Rect.left=m_SelectZoom.left;
Rect.top=m_SelectZoom.top;
Rect.right=m_SelectZoom.right;
Rect.bottom=m_SelectZoom.bottom;
}
//左上角
else if((point.x*(pData->m_nZoomFactor)+nPos1)<(m_SelectZoom.left+8*pData->m_nZoomFactor)&&(point.x*(pData->m_nZoomFactor)+nPos1)>(m_SelectZoom.left-5*pData->m_nZoomFactor)&&
(point.y*(pData->m_nZoomFactor)+nPos2)<(m_SelectZoom.top+8*pData->m_nZoomFactor)&&(point.y*(pData->m_nZoomFactor)+nPos2)>(m_SelectZoom.top-5*pData->m_nZoomFactor))
{
Rect.left=m_SelectZoom.right;
Rect.top=m_SelectZoom.bottom;
Rect.right=m_SelectZoom.left;
Rect.bottom=m_SelectZoom.top;
}
//右上角
else if((point.x*(pData->m_nZoomFactor)+nPos1)<(m_SelectZoom.right+8*pData->m_nZoomFactor)&&(point.x*(pData->m_nZoomFactor)+nPos1)>(m_SelectZoom.right-5*pData->m_nZoomFactor)&&
(point.y*(pData->m_nZoomFactor)+nPos2)<(m_SelectZoom.top+8*pData->m_nZoomFactor)&&(point.y*(pData->m_nZoomFactor)+nPos2)>(m_SelectZoom.top-5*pData->m_nZoomFactor))
{
Rect.left=m_SelectZoom.left;
Rect.top=m_SelectZoom.bottom;
Rect.bottom=m_SelectZoom.top;
Rect.right=m_SelectZoom.right;
}
//左下角
else if((point.x*(pData->m_nZoomFactor)+nPos1)<(m_SelectZoom.left+8*pData->m_nZoomFactor)&&(point.x*(pData->m_nZoomFactor)+nPos1)>(m_SelectZoom.left-5*pData->m_nZoomFactor)&&
(point.y*(pData->m_nZoomFactor)+nPos2)<(m_SelectZoom.bottom+8*pData->m_nZoomFactor)&&(point.y*(pData->m_nZoomFactor)+nPos2)>(m_SelectZoom.bottom-5*pData->m_nZoomFactor))
{
Rect.left=m_SelectZoom.right;
Rect.top=m_SelectZoom.top;
Rect.bottom=m_SelectZoom.bottom;
Rect.right=m_SelectZoom.left;
}
//上边中心
else if((point.x*(pData->m_nZoomFactor)+nPos1)>((m_SelectZoom.left+m_SelectZoom.right)/2-n/4)&&(point.x*(pData->m_nZoomFactor)+nPos1)<((m_SelectZoom.left+m_SelectZoom.right)/2+n/4)&&
(point.y*(pData->m_nZoomFactor)+nPos2)<(m_SelectZoom.top+8)&&(point.y*(pData->m_nZoomFactor)+nPos2)>(m_SelectZoom.top-8))
{
H=TRUE;
Rect.top=m_SelectZoom.bottom;
Rect.left=m_SelectZoom.left;
Rect.right=m_SelectZoom.right;
Rect.bottom=m_SelectZoom.top;
}
//下边中心
else if((point.x*(pData->m_nZoomFactor)+nPos1)>((m_SelectZoom.left+m_SelectZoom.right)/2-n/4)&&(point.x*(pData->m_nZoomFactor)+nPos1)<((m_SelectZoom.right+m_SelectZoom.left)/2+n/4)&&
(point.y*(pData->m_nZoomFactor)+nPos2)<(m_SelectZoom.bottom+8)&&(point.y*(pData->m_nZoomFactor)+nPos2)>(m_SelectZoom.bottom-8))
{
H=TRUE;
Rect.top=m_SelectZoom.top;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -