📄 conwnd.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 + -