MFC学习笔记(五)

一:映射模式dc.SetMapMode(MM_ANISOTROPIC),窗口范围SetWindowExt和视口范围函数SetViewportExt。

void CMainWindow::OnPaint()
{		
	CPaintDC dc(this);
	CRect rect;
	GetClientRect(&rect);
	dc.SetMapMode(MM_ANISOTROPIC);
	dc.SetWindowExt(500,500);	
	dc.SetViewportExt(300,100);	            //情形一
	//dc.SetViewportExt(300,300);	        //情形二
	//dc.SetViewportExt(rect.Width(),rect.Height());     //情形三
	dc.Ellipse(0,0,500,500);
}

二:设置坐标原点。其实质是设置一个偏移量,然后新的坐标都以偏移为基础,进行坐标的加减。

SetViewportOrg()函数和SetWindowOrg()函数进行偏移量的设置。前者是对视口视图(设备坐标系)进行设置,

后者是对窗口坐标(逻辑坐标系)进行设置。

将原点移到中心,方法一:

void CMainWindow::OnPaint()
{		
	CPaintDC dc(this);
	CRect rect;	
	GetClientRect(&rect);
	CPoint point(rect.Width()/2,rect.Height()/2);
	dc.SetViewportOrg(point);	
	dc.Rectangle(-50,-50,50,50);	
}
将原点移到中心,方法二:

void CMainWindow::OnPaint()
{		
	CPaintDC dc(this);
	CRect rect;	
	GetClientRect(&rect);
	CPoint point(rect.Width()/2,rect.Height()/2);
	dc.SetMapMode(MM_LOENGLISH);
	dc.DPtoLP(&point);
	dc.SetWindowOrg(-point.x,-point.y);	
	dc.Rectangle(-50,-50,50,50);	
}
将原点移到左下角:

void CMainWindow::OnPaint()
{		
	CPaintDC dc(this);
	CRect rect;	
	GetClientRect(&rect);	
	dc.SetMapMode(MM_HIMETRIC);
	dc.SetViewportOrg(0,rect.Height());
	dc.Rectangle(1000,1000,5000,5000);
}


------------------------------------------------------------------------------------------------------------------------------------

研究了一下,我觉得是不是可以这样理解这两个函数:
物理坐标原点始终都是左上角,初始状态逻辑坐标原点也是左上角。
SetViewportOrg(x,y)的作用是逻辑坐标原点向右移动x个单位,向下移动y个单位(当然些时x轴以向右为正方向,y轴以向下为正方向),也就是说,这个函数的作用是将逻辑坐标原点从原来位置分别向着正方向移动若干个单位
比如:
SetViewportOrg(100,100);//这句的作用是将逻辑坐标原点向右移100,向下移100.
SetWindowOrg(x,y)的作用是将逻辑坐标原点向左移x个单位,向上移y个单位。也就是说这个函数的作用是将逻辑坐标原点从原来位置分别向着负方向移动若干个单位
比如:
SetWindowOrg(100,100)//这句的作用是将逻辑坐标原点从原来的位置向左移100个单位,向上移100个单位。
我试了一下将这两句同时写:
pDC->SetWindowOrg(100,100);
pDC->SetViewportOrg(100,100);
发现逻辑坐标原点又回到了左上角。
而将它改成:
pDC->SetWindowOrg(50,50);
pDC->SetViewportOrg(100,100);
发现,结果也是符合我上面所说的。
总结,这两个函数应该可以看作是将逻辑坐标进行移动,但是两者移动的方向恰好相反,SetViewportOrg是向正方向移动,而SetWindowOrg是向着负方向移动。另外,SetMapMode选择不同的映射模式应该也会影响到这两个函数。

该段截自:http://bbs.csdn.net/topics/340078257

------------------------------------------------------------------------------------------------------------------------------------





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值