// ChildView.cpp : implementation of the CChildView class
//
#include "stdafx.h"
#include "WindowToViewport.h"
#include "ChildView.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CChildView
CChildView::CChildView()
{
//初始化各数据
m_bIsInitialized=FALSE;
m_bIsInWindowRect=FALSE;
m_font.CreatePointFont(120,"宋体");
}
CChildView::~CChildView()
{
m_font.DeleteObject();
}
BEGIN_MESSAGE_MAP(CChildView,CWnd )
//{{AFX_MSG_MAP(CChildView)
ON_WM_PAINT()
ON_WM_SETCURSOR()
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_EN_CHANGE(IDC_EDITWW,OnChangeWinWidth)
ON_EN_CHANGE(IDC_EDITWH,OnChangeWinHeight)
ON_EN_CHANGE(IDC_EDITVW,OnChangeViewWidth)
ON_EN_CHANGE(IDC_EDITVH,OnChangeViewHeight)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CChildView message handlers
BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs)
{
if (!CWnd::PreCreateWindow(cs))
return FALSE;
cs.dwExStyle |= WS_EX_CLIENTEDGE;
cs.style &= ~WS_BORDER;
cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,
::LoadCursor(NULL, IDC_ARROW), HBRUSH(COLOR_WINDOW+1), NULL);
return TRUE;
}
void CChildView::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rcClient;//视图客户区矩形
GetClientRect(&rcClient);//获取客户区矩形
//如果数据未初始化,则初始化各数据
if (!m_bIsInitialized)
{
m_ptWorldOrg = CPoint(rcClient.right*11/40,rcClient.bottom*1/2);//记录世界坐标系原点
m_ptScreenOrg = CPoint(rcClient.right*29/40,rcClient.bottom*1/2);//记录屏幕坐标系原点
m_rcWorldRect = CRect(-rcClient.right*7/40,-rcClient.bottom*5/16,rcClient.right*7/40,rcClient.bottom*5/16);//记录世界坐标系矩形
m_rcScreenRect = m_rcWorldRect;//屏幕坐标系举行
m_rcWindowRect = CRect(-(m_rcWorldRect.right-m_rcWorldRect.left)*3/8,-(m_rcWorldRect.right-m_rcWorldRect.left)*9/32,(m_rcWorldRect.right-m_rcWorldRect.left)*3/8,(m_rcWorldRect.right-m_rcWorldRect.left)*9/32);//窗口矩形
m_rcViewportRect = m_rcWindowRect;//视口矩形
//初始化世界坐标系中的图形
m_aWorldFigures.SetSize(4);
m_aWorldFigures[0]=CRect(-m_rcWorldRect.Width()*9/20,-m_rcWorldRect.Height()/5,m_rcWorldRect.Width()*2/5,m_rcWorldRect.Height()/15);
m_aWorldFigures[1]=CRect(-m_rcWorldRect.Width()/13,-m_rcWorldRect.Height()/10,m_rcWorldRect.Width()*4/13,m_rcWorldRect.Height()*2/7);
m_aWorldFigures[2]=CRect(-m_rcWorldRect.Width()*2/5,m_rcWorldRect.Height()/6,m_rcWorldRect.Width()/6,m_rcWorldRect.Height()*2/5);
m_aWorldFigures[3]=CRect(-m_rcWorldRect.Width()/5,-m_rcWorldRect.Height()*2/5,m_rcWorldRect.Width()/4,-m_rcWorldRect.Height()/8);
//初始化屏幕坐标系中的图形
m_aScreenFigures.Copy(m_aWorldFigures);
//确定窗口的最大宽度和高度
m_nMaxWinWidth=m_rcWorldRect.Width()-6;
m_nMaxWinHeight=m_rcWorldRect.Height()-6;
////////////////////////////////////////////////
//处理微调按钮和编辑框
CSpinButtonCtrl* pSpinWW=GetSpinByID(IDC_SPINWW);
CSpinButtonCtrl* pSpinWH=GetSpinByID(IDC_SPINWH);
CSpinButtonCtrl* pSpinVW=GetSpinByID(IDC_SPINVW);
CSpinButtonCtrl* pSpinVH=GetSpinByID(IDC_SPINVH);
//将微调按钮和编辑框一一建立伙伴关系
pSpinWW->SetBuddy(GetEditByID(IDC_EDITWW));
pSpinWH->SetBuddy(GetEditByID(IDC_EDITWH));
pSpinVW->SetBuddy(GetEditByID(IDC_EDITVW));
pSpinVH->SetBuddy(GetEditByID(IDC_EDITVH));
//设置微调按钮的数值范围,最小值为2是为了防止产生除0错误
pSpinWW->SetRange(2,m_nMaxWinWidth);
pSpinWH->SetRange(2,m_nMaxWinHeight);
pSpinVW->SetRange(2,m_nMaxWinWidth);
pSpinVH->SetRange(2,m_nMaxWinHeight);
pSpinWW->SetPos(m_rcWindowRect.Width());
pSpinWH->SetPos(m_rcWindowRect.Height());
pSpinVW->SetPos(m_rcWindowRect.Width());
pSpinVH->SetPos(m_rcWindowRect.Height());
//将初始化标志置为真
m_bIsInitialized=TRUE;
}
///////////////////////////////
//显示标题
dc.SelectObject(&m_font);
dc.SetTextColor(RGB(255,0,0));//Set text color
dc.SetTextAlign(TA_CENTER+TA_BOTTOM);//Set text align
dc.TextOut(rcClient.right/2,30,"窗口到视口的变换");//Show title
////////////////////////////////
//处理世界坐标系
dc.SetViewportOrg(m_ptWorldOrg);//设置当前原点为“世界坐标系原点”
dc.SetTextColor(RGB(0,0,255));
dc.TextOut(0,m_rcWorldRect.top-20,"窗口");
dc.SetTextColor(RGB(0,150,0));
dc.TextOut(0,m_rcWorldRect.bottom+30,"世界坐标系");
//绘制世界坐标系矩形
DrawRect(&dc,m_ptWorldOrg,m_rcWorldRect,R2_COPYPEN,BS_NULL,RGB(0,150,0));
//绘制世界坐标系中的图形
dc.Rectangle(m_aWorldFigures[0]);
dc.Rectangle(m_aWorldFigures[1]);
dc.Rectangle(m_aWorldFigures[2]);
dc.Rectangle(m_aWorldFigures[3]);
//绘制窗口矩形
DrawRect(&dc,m_ptWorldOrg,m_rcWindowRect,R2_NOTXORPEN);
////////////////////////////////
//处理屏幕坐标系
dc.SetViewportOrg(m_ptScreenOrg);//设置当前原点为“屏幕坐标系原点”
dc.SetTextColor(RGB(0,0,255));
dc.TextOut(0,m_rcScreenRect.top-20,"视口");
dc.SetTextColor(RGB(0,150,0));
dc.TextOut(0,m_rcScreenRect.bottom+30,"屏幕坐标系");
//绘制屏幕坐标系矩形
DrawRect(&dc,m_ptScreenOrg,m_rcScreenRect,R2_COPYPEN,BS_NULL,RGB(0,150,0));
//绘制屏幕坐标系中的矩形
DrawFigures(&dc);
// Do not call CWnd::OnPaint() for painting messages
}
///////////////////////////////////////////
//获取编辑控件
//id:控件ID
CEdit* CChildView::GetEditByID(int id)
{
CMainFrame* pMainFrame=(CMainFrame*)GetParentFrame();
return (CEdit*)(pMainFrame->m_wndDialogBar.GetDlgItem(id));
}
//////////////////////////////////////////
//获取微调按钮
//id:控件ID
CSpinButtonCtrl* CChildView::GetSpinByID(int id)
{
CMainFrame* pMainFrame=(CMainFrame*)GetParentFrame();
return (CSpinButtonCtrl*)(pMainFrame->m_wndDialogBar.GetDlgItem(id));
}
/////////////////////////////////////////////////////////////
//绘制矩形
//pDC:设备环境指针,origin:当前绘图原点,rect:待绘制的矩形,
//nDrawMode:绘图模式,默认为R2_COPYPEN,
//brushStyle:画刷风格,默认为BS_NULL,
//penColor:画笔颜色,默认为RGB(0,0,255)
void CChildView::DrawRect(CDC* pDC, CPoint origin, CRect rect, int nDrawMode, UINT brushStyle,COLORREF penColor)
{
int nOldMode = pDC->SetROP2(nDrawMode);//设置绘图模式
CPen pen(PS_SOLID,2,penColor);//设置画笔颜色
CPen *pOldPen = pDC->SelectObject(&pen);
CBrush brush,*pOldBrush;//
LOGBRUSH lgbrush;
lgbrush.lbStyle = brushStyle;
lgbrush.lbColor = RGB(255,255,255);
brush.CreateBrushIndirect(&lgbrush);//创建画刷
pOldBrush = pDC->SelectObject(&brush);
pDC->SetViewportOrg(origin);//设置原点
pDC->Rectangle(rect);//绘制矩形
//重置设备环境
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
pDC->SetROP2(nOldMode);
}
//////////////////////////////////////////
//绘制屏幕坐标系中的图形
void CChildView::DrawFigures(CDC* pDC)
{
CRect wr = m_rcWindowRect;
wr.OffsetRect(-wr.CenterPoint());//视口中图形的移动和窗口的移动是相反的
pDC->SetViewportOrg(m_ptScreenOrg);//以屏幕坐标系原点为当前原点
pDC->Rectangle(m_rcViewportRect);//擦除视口中原来的图形
pDC->SetMapMode(MM_ANISOTROPIC);//设置映射模式为各向异性
pDC->SetWindowExt(m_rcWindowRect.Width(),m_rcWindowRect.Height());//设置窗口大小
pDC->SetViewportExt(m_rcViewportRect.Width(),m_rcViewportRect.Height());//设置视口大小
//绘制视口中的图形,通过“交”操作来代替裁剪
pDC->Rectangle(m_aScreenFigures[0]&wr);
pDC->Rectangle(m_aScreenFigures[1]&wr);
pDC->Rectangle(m_aScreenFigures[2]&wr);
pDC->Rectangle(m_aScreenFigures[3]&wr);
pDC->SetMapMode(MM_TEXT);
//重绘视口
DrawRect(pDC,m_ptScreenOrg,m_rcViewportRect);
}
////////////////////////////////////////////
//移动屏幕坐标系中的图形
//offset:偏移量
void CChildView::OffsetFigures(CPoint offset)
{
for(int i=0;i<m_aScreenFigures.GetSize();i++)
m_aScreenFigures[i].OffsetRect(offset);
}
//////////////////////////////////////////////
//
没有合适的资源?快使用搜索试试~ 我知道了~
图形中窗口,视区的关系
共39个文件
h:5个
cpp:4个
obj:4个
需积分: 34 8 下载量 136 浏览量
2008-11-01
21:49:22
上传
评论
收藏 6.39MB RAR 举报
温馨提示
这是一个可以明显得表现窗口与视区的关系的一个小软件,如果你不明白它们的关系,那么你就下载下来看看吧
资源推荐
资源详情
资源评论
收起资源包目录
222645116720079251630272155352.rar (39个子文件)
222645116720079251630272155352
01 WindowToViewport
StdAfx.cpp 218B
WindowToViewport.vcproj 8KB
WindowToViewport.aps 28KB
WindowToViewport.cpp 3KB
WindowToViewport.ncb 6.63MB
MainFrm.h 2KB
WindowToViewport.opt 58KB
ChildView.cpp 12KB
WindowToViewport.rc 10KB
WindowToViewport.h 1KB
ChildView.h 3KB
Debug
WindowToViewport.exe.embed.manifest.res 724B
vc80.pdb 684KB
WindowToViewport.pdb 3.37MB
WindowToViewport.exe.intermediate.manifest 625B
BuildLog.htm 12KB
WindowToViewport.ilk 1.22MB
WindowToViewport.res 9KB
mt.dep 67B
WindowToViewport.exe.embed.manifest 660B
WindowToViewport.pch 13MB
WindowToViewport.exe 160KB
MainFrm.obj 36KB
StdAfx.obj 323KB
WindowToViewport.obj 34KB
vc80.idb 667KB
ChildView.obj 76KB
WindowToViewport.vcproj.WWW-D7C41ED1D55.Administrator.user 1KB
StdAfx.h 1KB
WindowToViewport.exe 190KB
MainFrm.cpp 3KB
WindowToViewport.clw 2KB
Resource.h 1KB
res
WindowToViewport.ico 1KB
WindowToViewport.rc2 408B
Windows.ico 5KB
WindowToViewport.dsp 4KB
WindowToViewport.plg 1KB
WindowToViewport.dsw 557B
共 39 条
- 1
资源评论
liangfangfang
- 粉丝: 0
- 资源: 13
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功