SetWindowOrg与SetViewportOrg函数的用法浅见
2008-09-21 15:29
309 查看
我最近也遇到了windows的坐标问题.到网上看了一些文章,一时也坠入云里雾里,自己在VC6.0里编码跟踪,终于觉悟,写出来供大家参考.
在View或其派生类中定义函数:
void CMyView::studySetViewportOrg(CDC * pDC)
{
int n=pDC->GetMapMode();//默认模式MM_TEXT
pDC->SetMapMode(MM_LOMETRIC); //映射为常用直角坐标系,注意坐标单位(0.1mm)
////视口设备坐标与逻辑坐标初始位置重合,在客户区左上角..
//第一次移动逻辑原点
pDC->SetViewportOrg(50 , 100);//逻辑原点移到视口设备坐标(50,100)处, 该函数以视口设备坐标为参考系
CPoint pV1=pDC->GetViewportOrg();//返回是逻辑原点在视口设备坐标中的位置(设备坐标),,即(50,100)
DrawOrdinate(pDC);//观察逻辑坐标位置.
//第二次移动逻辑原点
CRect rect1;
GetClientRect(&rect1);//GetClientRect取得的是客户区设备坐标,
int x=rect1.Width ()/2;
int y=rect1.Height ()/2;
pDC->SetViewportOrg (x,y); //逻辑原点移到窗口中心
CPoint pV=pDC->GetViewportOrg();//
DrawOrdinate(pDC);//观察逻辑坐标,已经在窗口中心.
//在SVO切换到SWO要特别注意,在调用SWO之时,视口设备坐标原点与当前逻辑原点重合.反之也然.
//这是令人费解的地方.我也曾在此被搞晕了.
GetClientRect(&rect1);//发现客户区设备坐标是不变的,
pDC->DPtoLP (&rect1);//转换成逻辑坐标.
//第三次移动逻辑原点
pDC->SetWindowOrg (50,100); //此函数以新的逻辑坐标系为参照,(50,100)是视口原点的逻辑坐标
//移动的依然是逻辑原点
//此时视口设备原点与最后一次SetViewportOrg()设置的逻辑原点是重合的.
CPoint pw=pDC->GetWindowOrg();//返回的是视口设备原点在新逻辑坐标中的位置(逻辑坐标)
DrawOrdinate(pDC);//观察坐标.
//第四次移动逻辑原点
pDC->SetWindowOrg (200,200); //.
CPoint pw=pDC->GetWindowOrg();//返回的是视口设备原点在新逻辑坐标中的位置(逻辑坐标)
DrawOrdinate(pDC);//观察
}
///////////////////////////
//绘制坐标
void MyView::DrawOrdinate(CDC* pDC)
{
pDC->MoveTo(-100,0);
pDC->LineTo (100,0);
pDC->MoveTo (0,-100);
pDC->LineTo (0,100);
pDC->MoveTo(100,0);
pDC->LineTo (70,30);
pDC->MoveTo (100,0);
pDC->LineTo (70,-30);
pDC->MoveTo(0,100);
pDC->LineTo (30,70);
pDC->MoveTo (0,100);
pDC->LineTo (-30,70);
}
以上代码已经调试.
提醒:
1,SWO和SVO移动的都是逻辑坐标.所以只要使用其中一个就行.
2.由SVO到SWO切换时,视口设备坐标原点同当前逻辑原点重合.说不定你在次晕头转向
在程序中最好不这样做.以便于理解.
3SWO和SVO使用的参照系不同,
4.屏幕坐标,窗口客户区坐标,视口坐标都是设备坐标,逻辑坐标由映射而生.
在View或其派生类中定义函数:
void CMyView::studySetViewportOrg(CDC * pDC)
{
int n=pDC->GetMapMode();//默认模式MM_TEXT
pDC->SetMapMode(MM_LOMETRIC); //映射为常用直角坐标系,注意坐标单位(0.1mm)
////视口设备坐标与逻辑坐标初始位置重合,在客户区左上角..
//第一次移动逻辑原点
pDC->SetViewportOrg(50 , 100);//逻辑原点移到视口设备坐标(50,100)处, 该函数以视口设备坐标为参考系
CPoint pV1=pDC->GetViewportOrg();//返回是逻辑原点在视口设备坐标中的位置(设备坐标),,即(50,100)
DrawOrdinate(pDC);//观察逻辑坐标位置.
//第二次移动逻辑原点
CRect rect1;
GetClientRect(&rect1);//GetClientRect取得的是客户区设备坐标,
int x=rect1.Width ()/2;
int y=rect1.Height ()/2;
pDC->SetViewportOrg (x,y); //逻辑原点移到窗口中心
CPoint pV=pDC->GetViewportOrg();//
DrawOrdinate(pDC);//观察逻辑坐标,已经在窗口中心.
//在SVO切换到SWO要特别注意,在调用SWO之时,视口设备坐标原点与当前逻辑原点重合.反之也然.
//这是令人费解的地方.我也曾在此被搞晕了.
GetClientRect(&rect1);//发现客户区设备坐标是不变的,
pDC->DPtoLP (&rect1);//转换成逻辑坐标.
//第三次移动逻辑原点
pDC->SetWindowOrg (50,100); //此函数以新的逻辑坐标系为参照,(50,100)是视口原点的逻辑坐标
//移动的依然是逻辑原点
//此时视口设备原点与最后一次SetViewportOrg()设置的逻辑原点是重合的.
CPoint pw=pDC->GetWindowOrg();//返回的是视口设备原点在新逻辑坐标中的位置(逻辑坐标)
DrawOrdinate(pDC);//观察坐标.
//第四次移动逻辑原点
pDC->SetWindowOrg (200,200); //.
CPoint pw=pDC->GetWindowOrg();//返回的是视口设备原点在新逻辑坐标中的位置(逻辑坐标)
DrawOrdinate(pDC);//观察
}
///////////////////////////
//绘制坐标
void MyView::DrawOrdinate(CDC* pDC)
{
pDC->MoveTo(-100,0);
pDC->LineTo (100,0);
pDC->MoveTo (0,-100);
pDC->LineTo (0,100);
pDC->MoveTo(100,0);
pDC->LineTo (70,30);
pDC->MoveTo (100,0);
pDC->LineTo (70,-30);
pDC->MoveTo(0,100);
pDC->LineTo (30,70);
pDC->MoveTo (0,100);
pDC->LineTo (-30,70);
}
以上代码已经调试.
提醒:
1,SWO和SVO移动的都是逻辑坐标.所以只要使用其中一个就行.
2.由SVO到SWO切换时,视口设备坐标原点同当前逻辑原点重合.说不定你在次晕头转向
在程序中最好不这样做.以便于理解.
3SWO和SVO使用的参照系不同,
4.屏幕坐标,窗口客户区坐标,视口坐标都是设备坐标,逻辑坐标由映射而生.
相关文章推荐
- SetForegroundWindow的正确用法
- [转]mfc编程中SetViewportOrg与SetWindowOrg的理解
- MFC编程中SetViewportOrg与SetWindowOrg的理解
- window.clearInterval与window.setInterval的用法
- Windows编程中SetViewportOrg与SetWindowOrg的理解
- SetWindowExt,SetViewportExt,SetWindowOrg和SetViewportOrg的理解
- JavaScript window.setTimeout() 的详细用法
- SetViewportOrg与SetWindowOrg的区别
- 理解SetWindowOrg,SetViewportOrg,SetWindowExt,SetViewportExt
- 对SetViewportOrg和SetWindowOrg的理解
- JavaScript window.setTimeout() 的详细用法
- Angular JS中$timeout的用法及其与window.setTimeout的区别
- SetForegroundWindow的正确用法
- SetMapMode,SetWindowOrg,SetViewportOrg,SetWindowExt,SetViewportE
- SetWindowOrg SetViewportOrg DC 的坐标
- SetWindowOrg和SetViewportOrg这两个函数到底应该如何理解
- SetWindowOrg,SetViewportOrg,SetWindowExt,SetViewportExt
- window.clearInterval与window.setInterval的用法(
- 理解SetWindowOrg,SetViewportOrg,SetWindowExt,SetViewportExt
- Windows编程中SetViewportOrg与SetWindowOrg的理解