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

📄 viewwnd.cpp

📁 又VC++实现的基于TWAIN的扫描仪图像输入处理软件
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//显示窗口类

#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 + -