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

📄 conwnd.cpp

📁 又VC++实现的基于TWAIN的扫描仪图像输入处理软件
💻 CPP
字号:
 // ConWnd.cpp : implementation file

#include "stdafx.h"
#include "source10.h"
#include "ConWnd.h"
#include "HRulerWnd.h"
#include "VRulerWnd.h"
#include "ViewWnd.h"
#include "const.h"
#include "Data.h"

#ifdef _DEBUG
#define new DEBUG_NEW

#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

 CHRulerWnd *pHRulerWnd;
 CVRulerWnd *pVRulerWnd;
 CViewWnd  *pViewWnd;
 CData	   *pData = NULL;

/////////////////////////////////////////////////////////////////////////////
// CContainerWnd

CContainerWnd::CContainerWnd()
{
}

CContainerWnd::~CContainerWnd()
{
}


BEGIN_MESSAGE_MAP(CContainerWnd, CWnd)
	//{{AFX_MSG_MAP(CContainerWnd)
	ON_WM_CREATE()
	//当用户窗口大小发生变化时,发出此消息
	ON_WM_SIZE()
	ON_WM_VSCROLL()
	ON_WM_HSCROLL()
	ON_WM_ACTIVATE()
	ON_WM_LBUTTONUP()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// 用户窗口出现前响应消息ON_WM_CREATE调用此函数
//产生初始滚动条,标尺
int CContainerWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	SCROLLINFO si;

	if (CWnd::OnCreate(lpCreateStruct) == -1)
		return -1;

	si.cbSize	= sizeof(SCROLLINFO);
	si.fMask	= SIF_ALL;
	si.nMin		= 0;
	si.nMax		= 1000;
	si.nPage	= 100;
	si.nPos		= 0;
	si.nTrackPos= 0;	//ignored

	SetScrollInfo(SB_VERT,&si);

	CRect rect(0,0,0,0), rtBack;
	GetClientRect(rect);

	rtBack = rect;

	rect.bottom = 40;
	rect.left   = 40;
    
	//在当前窗口产生长为110的水平标尺有边界可视的子窗口
    pHRulerWnd = new CHRulerWnd();
	pHRulerWnd->Create("Containee",NULL,
		WS_CHILD|WS_BORDER|WS_VISIBLE,
		rect,
		this,
		110);
	
	rect       = rtBack;
	rect.right = 25 ;
	rect.top   = 25;
	//rect.bottom *=2; 

	//在当前窗口产生长为110的垂直标尺有边界可视的子窗口
	pVRulerWnd = new CVRulerWnd();
	pVRulerWnd->Create("Containee",NULL,
		WS_CHILD|WS_BORDER|WS_VISIBLE,
		rect,
		this,
		110);


	rect      = rtBack;
	rect.top  = 40;
	rect.left = 40;
	//rect.bottom *=2;
   
	//在当前窗口产生宽为110的有边界可视的子窗口用作用户区
	pViewWnd = new CViewWnd();
	pViewWnd->Create("ViewWndClass",NULL,
		WS_CHILD|WS_BORDER|WS_VISIBLE,
		rect,
		this,
		110);

	//初始化全局变量CDATA
	pData = new CData();

	//置预扫选择框左上角和右下角的坐标
	pData->m_rtSelection.SetRect(0,0,0,0);
	pData->m_nZoomFactor = 8; // 1/8 of the original size
	pData->m_ptPaintOrg.x = 0;
	pData->m_ptPaintOrg.y = 0;


	//设定设备可视区窗口的的大小
	pData->m_szViewWndSize.cx = rtBack.right - rtBack.left;
	pData->m_szViewWndSize.cy =( rtBack.bottom - rtBack.top);

	//A0=1000, A1=1300  FuMian*1000.0
	pData->m_szViewDocSize.cx =(long)((pData->m_szLogImageSize.cx/FuMian*1000.0)/pData->m_nZoomFactor);
	pData->m_szViewDocSize.cy =(long)((pData->m_szLogImageSize.cy/FuMian*1000.0)/pData->m_nZoomFactor);


	return 0;
}

//当窗口大小变化时标尺、滚动条随之变化
void CContainerWnd::OnSize(UINT nType, int cx, int cy) 
{
	CWnd::OnSize(nType, cx, cy);

	ResetScrollBar(cx, cy);
    pVRulerWnd->UpdateWindow(); 
    pHRulerWnd->UpdateWindow(); 
    pViewWnd->UpdateWindow();

	//移动窗口并响应ON_PAINT消息重画窗口
	pViewWnd->MoveWindow(VIEW_TOP,VIEW_LEFT,
		cx-VIEW_LEFT,cy-VIEW_TOP,TRUE);

	pHRulerWnd->MoveWindow(HRULER_LEFT,0,
		cx-HRULER_LEFT,
		HRULER_BOTTOM,TRUE);

	pVRulerWnd->MoveWindow(0,VRULER_TOP,
		VRULER_RIGHT,cy-VRULER_TOP,TRUE);

}

//设置滚动条
void CContainerWnd::ResetScrollBar(int& cx, int& cy)
{
	CRect rt,rt1;
    GetClientRect(rt);

	//定义设备空间视区大小为鼠标所在窗口的大小
	pData->m_szViewWndSize.cx = cx;
	pData->m_szViewWndSize.cy = cy;

	ShowScrollBar(SB_HORZ);
	ShowScrollBar(SB_VERT);

	GetClientRect(rt1);
	//设置设备空间的大小,以便滚动盒大小反映设备空间的大小
	pData->m_szViewWndSize.cx = cx = rt1.Width();
	pData->m_szViewWndSize.cy = cy = rt1.Height();

	SCROLLINFO si;
    
	si.cbSize	= sizeof(SCROLLINFO);
	si.fMask	= SIF_ALL;
	si.nMin		= 0;
	//si.nMax		= pData->m_szLogImageSize.cy;
    //si.nPage	= (pData->m_szLogImageSize.cy)*(pData->m_nZoomFactor)/8;
    si.nMax		= 47*100;
    si.nPage	= 4700*(pData->m_nZoomFactor)/8;
	
	si.nPos		= pData->m_ptPaintOrg.y;
    si.nTrackPos= 0;	
	SetScrollInfo(SB_VERT,&si);

	si.nPos		=pData->m_ptPaintOrg.x;
	//si.nMax		= pData->m_szLogImageSize.cx;
	//si.nPage	= (pData->m_szLogImageSize.cx)/(8/pData->m_nZoomFactor);
    si.nMax		= 3340;
	si.nPage	= 3340/(8/pData->m_nZoomFactor);
	SetScrollInfo(SB_HORZ,&si);

	pData->m_nVScrollPage = (UINT) 4700 * 2 * pData->m_nZoomFactor / 2;
	pData->m_nVScrollLine = pData->m_nVScrollPage / 5;

	pData->m_nHScrollPage = 3340 * 2 * pData->m_nZoomFactor / 2;
	pData->m_nHScrollLine = pData->m_nHScrollPage / 5;


	return;
}


//当在滚动条上移动时发消息WM_VSCROLL,此函数响应此消息
void CContainerWnd::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	UINT nPosParam = nPos;
	nPos = GetScrollPos(SB_VERT);

	switch(nSBCode)
	{
		case SB_BOTTOM:
			AfxMessageBox("Bottom reached");
			break;
		case SB_ENDSCROLL:
			pVRulerWnd->InvalidateRect(NULL,TRUE);
			break;
		case SB_LINEDOWN :
			nPos += pData->m_nVScrollLine;
           	break;
		case SB_LINEUP :
			nPos = (nPos > pData->m_nVScrollLine) ? \
					(nPos - pData->m_nVScrollLine) : \
					0;
			break;
		case SB_PAGEDOWN :
			nPos +=  pData->m_nVScrollPage;
			break;
		case SB_PAGEUP :
			nPos = (nPos > pData->m_nVScrollPage) ? \
					(nPos - pData->m_nVScrollPage) : \
					0;
			break;
		case SB_THUMBPOSITION :
			break;
		case SB_THUMBTRACK :
			nPos = nPosParam;
	  	    break;
		case SB_TOP :
			AfxMessageBox("Top Reached.");
			break;
		default:
			AfxMessageBox("VScroll nSBCode not identified!");
			break;
	}

	nPos = (nPos > pData->m_nVSBMax) ? pData->m_nVSBMax : nPos;
	pData->m_ptPaintOrg.y = nPos;
	
	SetScrollPos(SB_VERT,nPos);
    pViewWnd->nPos2 =GetScrollPos(SB_VERT);

    pViewWnd->InvalidateRect(NULL,TRUE);
	pVRulerWnd->InvalidateRect(NULL,TRUE);
    InvalidateRect(NULL,TRUE);
  	CWnd::OnVScroll(nSBCode, nPos, pScrollBar);
}

//水平滚动条移动过程同上
void CContainerWnd::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	UINT nPosParam = nPos;
	nPos = GetScrollPos(SB_HORZ);

	switch(nSBCode){
		case SB_RIGHT:
		   break;
		case SB_ENDSCROLL:
		   break;
		case SB_LINERIGHT :
			nPos += pData->m_nHScrollLine;
			break;
		case SB_LINELEFT :
			nPos = (nPos>pData->m_nHScrollLine) ? (nPos-pData->m_nHScrollLine) \
				: 0;
			 break;
		case SB_PAGERIGHT :
			nPos +=  pData->m_nHScrollPage;
			break;
		case SB_PAGELEFT :
			nPos = (nPos>pData->m_nHScrollPage) ? (nPos-pData->m_nHScrollPage) \
				: 0;
		   break;
		case SB_THUMBPOSITION :
		   break;
		case SB_THUMBTRACK :
		   nPos = nPosParam;
		   break;
		case SB_LEFT :
			break;
		default:
			break;
	}

	nPos = (nPos > pData->m_nHSBMax) ? pData->m_nHSBMax : nPos;
	pData->m_ptPaintOrg.x = nPos;
	SetScrollPos(SB_HORZ,nPos);

	pViewWnd->nPos1 = GetScrollPos(SB_HORZ);
    pViewWnd->InvalidateRect(NULL,TRUE);
	pHRulerWnd->InvalidateRect(NULL,TRUE);
	pVRulerWnd->InvalidateRect(NULL,TRUE);
    InvalidateRect(NULL,TRUE);
	CWnd::OnHScroll(nSBCode, nPos, pScrollBar);
}

void CContainerWnd::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) 
{
	CWnd::OnActivate(nState, pWndOther, bMinimized);
}

void CContainerWnd::OnLButtonUp(UINT nFlags, CPoint point) 
{
	CWnd::OnLButtonUp(nFlags, point);
}

//////////////////////////////////////////////////
//设置滚动条
////////////////////////////////////////////////
void CContainerWnd::setScrollBar(int& cx, int& cy)
{
}

⌨️ 快捷键说明

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