今天看到了ClientToScreen()与ScreenToClient()这两个函数,所以产生上面的疑惑,请指教。
解决方案 »
- 写的软件win7下出现appcrash的错误,大致原因是什么?
- PeekMessage(&Symsg,NULL,0,0,PM_REMOVE) 等于 GetMessage么?
- 这现象怎么结实(new操作相关)?
- 帮忙看看datetime类型字段如何处理?
- 怎么解决在导入dll时ADO中enum名字重定义问题?
- 关于winexec命令
- 如何把图片文件加到自己的文件格式当中?又如何取出来?
- 在vc里有没有能让用户自己写脚本定制用户自己业务逻辑的控件,类似delphi中的dream script的?
- regsvr32 mycom.dll出错,请高手指教!
- delphi好还是vc好,或者说哪个应用更广泛~~
- URL编码
- 如何实现对工具条的定制?MSDN说,可以的!
为了在不同的领域使用逻辑坐标,Windows提供了以下8种坐标模式: 分别为MM_TEXT、MM_HIENGLISH、MM_LOENGLISH、MM_HIMETRIC、MM_LOMETRIC、MM_TWIPS、MM_ANISOTROPIC和MM_ISOTROPIC。
三 实例解析 (一) 建立以左上角为原点,X轴和Y轴为1000的坐标,如下图
我们可以用以下代码: void CTtView::OnDraw(CDC* pDC)
{
CTtDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rect;
GetClientRect(&rect); pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetViewportOrg(0,0);
pDC->SetViewportExt(rect.right,rect.bottom); pDC->SetWindowOrg(0,0);
pDC->SetWindowExt(1000,1000); pDC->MoveTo(50,50);
pDC->LineTo(50,950);
pDC->LineTo(950,950);
pDC->LineTo(50,50);
} 代码分析: 1. GetClientRect(&rect); 取得客户区矩形区域,将其存放在rect中 2. 用pDC->SetMapMode(MM_ANISOTROPIC); 设置映射模式 3. 通过pDC->SetViewportOrg(0,0);设置逻辑坐标的原点 4. 通过pDC->SetViewportExt(rect.right,rect.bottom);和 pDC->SetWindowExt(1000,1000);来确定逻辑坐标下和设备坐标下的尺寸对应关系 5. 在MM_ANISOTROPIC模式下,X轴单位和Y轴单位可以不相同 6. 坐标方向的确定方法是如果逻辑窗范围和视口范围符号相同,则逻辑坐标的方向和视口的方向相同,即X轴向右为正,Y轴向下为正。 7. 如果将显示模式改为MM_ISOTROPIC,那么X轴单位和Y轴单位一定相同,感兴趣的读者可以自己使一下。 (二) 建立以视窗中心为原点的坐标,如下图
用如下代码: void CTtView::OnDraw(CDC* pDC)
{
CTtDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rect;
GetClientRect(&rect); pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetViewportOrg(rect.right/2,rect.bottom/2);
pDC->SetViewportExt(rect.right,rect.bottom); pDC->SetWindowOrg(0,0);
pDC->SetWindowExt(1000,-1000); pDC->MoveTo(150,150);
pDC->LineTo(-150,-200);
pDC->LineTo(150,-150);
pDC->LineTo(150,150);
} 代码分析: 1. 用 pDC->SetViewportOrg(rect.right/2,rect.bottom/2); 设置视口的原点。 2. 用pDC->SetViewportExt(rect.right,rect.bottom);和pDC->SetWindowExt(1000,-1000);来确定设备坐标和逻辑坐标的单位对应关系。 3. 因为逻辑窗范围和视口范围的符号不一致,纵坐标取反,所以Y轴向上为正。