void CScribbleView::OnLButtonDown(UINT, CPoint point)
{
CClientDC dc(this);
OnPrepareDC(&dc);
dc.DPtoLP(&point);
CRect rect(100,100,200,200);
//dc.DPtoLP(rect);
    ScreenToClient(rect);
    ..........
};
上面的那个rect(100,100,200,200)我把它作为作图区域,可为什么每次这个矩形出现的位置都不一样呢?

解决方案 »

  1.   

    OnLButtonDown //关键在这,你按下鼠标当前的位置传入了。rect(100,100,200,200) 只是你的巨形大小。
      

  2.   

    OnPrepareDC(&dc);
    这个,会根据该窗口的视点的变化情况,来改变DC的视口原点.
    所以同样是 100,100,200,200, 会因为视口的移动而移动.楼主,这是一个关于页面空间(窗口),设备空间(视口)的问题,VC++深入详解的书11章有详细说明.
    看过那个之后,你就明白你的问题了.
      

  3.   

    谢谢各位,那如果我要固定位置要怎么做呢?另外请问#2楼,你说的书是《深入浅出MFC》吗?
      

  4.   

    不是,那个书太深了,我是看孙鑫的VC++深入详解的.楼主,我不知道你说的固定位置是什么意思.
    固定跟着鼠标动?跟着滚动条动?
    这个OnPrepareDC 一般是在OnDraw时加.今天太晚,要睡觉了.
      

  5.   

    你改变了View原点坐标了???
      

  6.   


    CDC *pDC=GetDC();
    CPen pen;
    pen.CreatePen(PS_SOLID,1,RGB(255,255,255));
    pDC->SelectObject(&pen);
    CRect rect(100,100,200,200);
    pDC->Ellipse(rect);
    可以在你制定的rect里画图。
      

  7.   

    楼主,我觉得,如果你了解了下面这2个函数的用法,那么你的问题你自己就可以想通了.
    OnPrepareDC(&dc);  ScreenToClient(rect); 这2个函数你的代码里有用到.E:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC 目录里的 VIEWSCRL.CPP
    里面有 void CScrollView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) 的源代码
    他里面主要的工作,就是
    ptVpOrg = -GetDeviceScrollPosition(); //根据我们到底滚动了多少
    pDC->SetViewportOrg(ptVpOrg); //来重新设定我们的视口原点
    这个函数一般是放在OnDraw里面,这样当我们滚动了窗口之后,同样的数据,就会画在不同的地方,起到滚动的效果了.
    楼主可以去看看源代码,至于视口原点,窗口原点这些,还得去看看关于WINDOWS的坐标的知识.
    网上孙鑫的VC++深入详解视频第11章有比较详细的讲解.CWnd::ScreenToClient(rect);
    这个其实就是先假设你的这个rect是一个相对于显示器左上角的坐标.
    然后把这个相对于显示器左上角的坐标,转成相对于CWnd窗口的左上角的坐标.