| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1121 人关注过本帖
标题:MFC中逻辑坐标(文档坐标)和设备坐标(视图坐标)之间的转换
取消只看楼主 加入收藏
liguangcai_5
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2011-3-19
收藏
 问题点数:0 回复次数:1 
MFC中逻辑坐标(文档坐标)和设备坐标(视图坐标)之间的转换
各位朋友:
    大家好!我这里有一个程序,希望各位帮我看一下,应该如何修改,指点一下,谢谢!
这个程序的内容是:在一个可拆分窗口中,视图类(View类)是继承CScrollView来的,将视图窗口拆分为左右两块,在任何一边任何位置画圆(按下鼠标左键时产生一个随意大小的圆),在另一边也能同时同步显示,补充一下,滚动条移动后也能作图,在另一边也能同步显示。各个类代码如下:
添加新类:
class CDrawRect : public CObject  
{
public:
    CRect m_DrawRect;
};

文档类(当然,在StdAfx.h中添加#include<afxtempl.h>):
class CExp6_4Doc : public CDocument
{
public:
  CArray<CRect,CRect&> m_Rectag;
};

CExp6_4Doc::CExp6_4Doc()
{
    // TODO: add one-time construction code here
    m_Rectag.SetSize(256,256);
}

视图类:
class CExp6_4View : public CScrollView
{
public:
CDrawRect *m_ViewDrRect;
};

CExp6_4View::CExp6_4View()
{
    // TODO: add construction code here
    m_ViewDrRect=new CDrawRect;
}
void CExp6_4View::OnInitialUpdate()
{
    CScrollView::OnInitialUpdate();

    //CSize sizeTotal;
    // TODO: calculate the total size of this view
    //sizeTotal.cx = sizeTotal.cy = 100;
    //SetScrollSizes(MM_TEXT, sizeTotal);

    CSize sizeTotal(3000,2000);
    CSize sizePage(50,50);
    CSize sizeLine(10,10);
    SetScrollSizes(MM_TEXT,sizeTotal,sizePage,sizeLine);
}

void CExp6_4View::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO: Add your message handler code here and/or call default
   
    CClientDC dc(this);//获得视图类dc
    OnPrepareDC(&dc);//这是一个和坐标映射相关的函数
    dc.DPtoLP(&point);//在绘图之前把鼠标位置坐标转换为逻辑坐标*/
     
    CExp6_4Doc *pDoc=GetDocument();
    int r=rand()%50+5;
    CRect Ret(point.x-r,point.y-r,point.x+r,point.y+r);
    pDoc->m_Rectag.Add(Ret);
    m_ViewDrRect->m_DrawRect=Ret;

    dc.LPtoDP(&Ret);//在显示数据之前把逻辑坐标转换为设备坐标
    InvalidateRect(Ret,FALSE);
    pDoc->UpdateAllViews(this,0L,m_ViewDrRect);
    CScrollView::OnLButtonDown(nFlags, point);
}

问题主要在这个函数中间红色部分:
void CExp6_4View::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
    // TODO: Add your specialized code here and/or call the base class
    CDrawRect *pDrawRect=(CDrawRect*)pHint;
   
    CRect Rect;
    Rect=pDrawRect->m_DrawRect;
    CClientDC dc(this);
    OnPrepareDC(&dc);
    dc.LPtoDP(&Rect);//在显示数据之前把逻辑坐标转换为设备坐标   
   
    InvalidateRect(Rect,FALSE);
}

void CExp6_4View::OnDraw(CDC* pDC)
{
    CExp6_4Doc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    //pDC->TextOut(10,10,"View");
    for(int i=0;i<pDoc->m_Rectag.GetSize();i++)
    {
        pDC->Ellipse(pDoc->m_Rectag[i]);
    }
}
小弟是初学者,希望高手帮帮小弟,谢谢!
搜索更多相关主题的帖子: 朋友 
2011-03-20 11:25
liguangcai_5
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2011-3-19
收藏
得分:0 
高手们,别看热闹了,帮帮小弟吧,本程序没有达到要求的功能,如何改,谢谢!
2011-03-23 21:03
快速回复:MFC中逻辑坐标(文档坐标)和设备坐标(视图坐标)之间的转换
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.035850 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved