关于MFC坐标问题

fleiou2008 2009-06-22 12:47:44
如何在单文档的视图区域定义属于自己的坐标系,或者说如何定义工作区坐标。eg:左上角是0,0 右下角是500,400
...全文
191 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
通过SetWindowExt吧……我记得,我尝试写一个例子出来看看
oysoft 2009-06-22
  • 打赏
  • 举报
回复
CDC::SetViewportOrg
virtual CPoint SetViewportOrg( int x, int y );

virtual CPoint SetViewportOrg( POINT point );
  • 打赏
  • 举报
回复
 SetWindowOrg 、SetViewportOrg、SetWindowExt、SetViewportExt区别
按习惯,(0,0)就原点,原点就是(0,0),但是如果用此来理解windows的map mode,就会走弯路。其实,稍微改变一下观念,windows的map mode就比较好理解了。举例说明:
page space---->device space
pDC->SetMapMode(MM_LOMETRIC);
pDC->SetWindowOrg(40,0);  //这句“设定”page space的原点为(40,0),注意,
//这时(40,0)就是原点,原点就是(40,0)这个点,其实,(0,0)与原点没有必然联系。这一句对下面的画图函数在page space中所作的图不会有任何影响。一句话:SetWindowOrg就是指定一下,page space中哪个点为原点。
pDC->Rectangle(0,0,100,-100);
pDC->Rectangle(0,-100,50,-200);
同理,SetViewportOrg也是指定一下,device space中哪个点为原点,两个坐标系映射时,两个原点重合。
SetWindowExt设定page space的大小,SetViewportOrg设定device space的大小,其实,真正有意义的只是两者的比例关系,例如,在一个1024*768的显示屏上:
pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowExt(10240,7680);
pDC->SetViewportExt(1024,768);
pDC->Rectangle(0,0,100,100);
就会画一个10 pixels*10 pixels的矩形。其本质就是,X方向,每个逻辑单位有1024/10240个象素,Y方向每个逻辑单位有768/7680个象素。因此,下面的代码有相同的作用:
pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowExt(102400,76800);
pDC->SetViewportExt(10240,7680);
pDC->Rectangle(0,0,100,100);
softist 2009-06-22
  • 打赏
  • 举报
回复
void CBbbbbView::OnMouseMove(UINT nFlags, CPoint point)
{
CView::OnMouseMove(nFlags, point);

CClientDC dc(this);
CRect r;
GetClientRect(&r);
dc.SetMapMode(MM_ANISOTROPIC);
dc.SetWindowExt(500,-400);
dc.SetViewportExt(r.Width(), r.Height());

point.x = point.x * 500 / r.Width();
point.y = -point.y * 400 / r.Height();
dc.SetPixel(point.x, point.y, RGB(255,0,0));

CString strText;
strText.Format(_T("x=%d, y=%d"), point.x, -point.y);
((CFrameWnd*)AfxGetMainWnd())->SetMessageText(strText);
}


楼主是否要这样的程序。
SetMapMode的说明可以看看容易懂得解说。好多书是越看越糊涂
http://www.softist.com/programemo/setext/setext.htm

  • 打赏
  • 举报
回复
你更改了映射模式了么?或者使用过pDC->SetWindowOrg之类的函数么

如果没有的话,发生这么奇妙的事情我也不知道该怎么解释了……
fleiou2008 2009-06-22
  • 打赏
  • 举报
回复
是这样, 我定义了一个鼠标移动的消息用来跟着鼠标显示当前的位置, 代码是这样的:
void CT1View::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CString st;
st.Format(("%d %d"),point.x,point.y);
CDC *pDC=GetDC();
pDC->TextOut(500,0,st);
ReleaseDC(pDC);

CView::OnMouseMove(nFlags, point);
}
但是运行的时候我的左上角不是0,0。 而是别的不确定的数。就是说 X的坐标移动到哪都对,而Y的坐标放哪都不对
fleiou2008 2009-06-22
  • 打赏
  • 举报
回复
是这样, 我定义了一个鼠标移动的消息用来跟着鼠标显示当前的位置, 代码是这样的:
void CT1View::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CString st;
st.Format(("%d %d"),point.x,point.y);
CDC *pDC=GetDC();
pDC->TextOut(500,0,st);
ReleaseDC(pDC);

CView::OnMouseMove(nFlags, point);
}
但是运行的时候我的左上角不是0,0。 而是别的不确定的数。
  • 打赏
  • 举报
回复
这个例子要说明的就是,设置500,400为窗口的固定坐标,这个固定坐标由整个客户区表示的,无论你放大还是缩小客户区,窗口的大小都是500*400
  • 打赏
  • 举报
回复
例子写好了,不知道是不是你想要的
pDC->SetMapMode(MM_ANISOTROPIC); //更改当前的映射模式,X轴与Y轴的范围可以不同
pDC->SetWindowExt(500,400); //设定窗口(逻辑坐标范围)为500*400
CRect rectWnd;
this->GetClientRect(rectWnd); //获得客户端窗口的设备坐标下的范围
pDC->SetViewportExt(rectWnd.Width(),rectWnd.Height()); //更改视口(设备坐标)为整个客户区
pDC->DPtoLP(rectWnd); //将设备坐标转为逻辑坐标
pDC->Rectangle(rectWnd); //画一个充满窗口的矩形
pDC->Ellipse(rectWnd); //画一个充满窗口的圆形
pDC->Ellipse(200,150,300,250); //画一个半径是50逻辑坐标的圆形

楼主可以把这些代码扔到OnDraw里面查看一下效果

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧