|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
最近在学win32的时候学到逻辑坐标和设备坐标的时候快崩溃了,咋学都学不明白,折腾了一晚上,查了不少资料,总算是明白了。
先说一下让我最困惑的地方:设备坐标(视口)到底是个什么?
windows其实只认识设备坐标,只能根据设备坐标来画图,不论进行如何操作,设备坐标的原点始终在左上角(0,0)处,永远向下y增大。平时我们使用GDI函数不管怎样,都是使用逻辑坐标进行编程。
windows必须将逻辑坐标转换为设备坐标才可以进行画图操作。
再来说一下SetViewportOrgEx() 函数和SetWindowsOrgEx()函数到底是咋回事:(不想那么复杂,映射模式假设还是MM_TEXT)
SetViewportOrgEx()函数我刚刚开始还以为是改变设备坐标的原点,例如 SetViewportOrgEx(hdc, cxClient/2, cyClient / 2, NULL);是将设备坐标原点直接移动到客户区中央的位置,但其实不是这样
注意:不论如何操作,客户区设备坐标原点始终是在左上角(0,0)处!!
SetViewportOrgEx()函数其实是这样:
例如SetViewportOrgEx(hdc, cxClient/2, cyClient / 2, NULL); 是把逻辑坐标点(0,0)映射到设备坐标点(cxClient/2,cyClient/2)的地方,如果不知道映射是啥意思可以理解为转换。
以此类推:逻辑坐标(-1,-1)会被映射(转换)为设备坐标(cxClient/2 - 1,cyClient/2 - 1)
注意:设备坐标原点没有变化!!!!,依旧是在(0,0)处!!!!,windows只能依靠设备坐标画图,逻辑坐标要变换为设备坐标windows才可以使用!!!
再使用TextOut函数的时候(注意:我们编程的时候从来都只能使用逻辑坐标,只不过以前我们接触的都是逻辑坐标和设备坐标重合)
TextOut(hdc,0,0,TEXT("HELLO"),5);会打印到逻辑坐标区域(0,0)的位置,但是这里逻辑坐标不和设备坐标重合,所以设备坐标会被映射为(cxClient/2,cyclient/2)的位置
再来说下SetWindowsOrgEx()函数,和上个函数正好相反,这个函数会把逻辑坐标(x,y)的值映射为设备坐标(0,0)的位置
以此类推,使用该函数,逻辑坐标(x-1,y-1)映射(转换)设备坐标的位置(-1,-1)
所以如果使用这个函数,我们想把文字什么的使用逻辑坐标(0,0)的位置就能打印在客户区中间,需要这样设置:SetWindowsOrgEx(hdc, -cxClient/2, -cyClient/2,NULL)
这样的意思是:( -cxClient/2, -cyClient/2)会被映射到设备坐标(0,0)的位置,以此类推,逻辑坐标(0,0)的位置就是设备坐标(cxClient/2, cyClient/2)的位置
|
|