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)我把它作为作图区域,可为什么每次这个矩形出现的位置都不一样呢?
{
CClientDC dc(this);
OnPrepareDC(&dc);
dc.DPtoLP(&point);
CRect rect(100,100,200,200);
//dc.DPtoLP(rect);
ScreenToClient(rect);
..........
};
上面的那个rect(100,100,200,200)我把它作为作图区域,可为什么每次这个矩形出现的位置都不一样呢?
这个,会根据该窗口的视点的变化情况,来改变DC的视口原点.
所以同样是 100,100,200,200, 会因为视口的移动而移动.楼主,这是一个关于页面空间(窗口),设备空间(视口)的问题,VC++深入详解的书11章有详细说明.
看过那个之后,你就明白你的问题了.
固定跟着鼠标动?跟着滚动条动?
这个OnPrepareDC 一般是在OnDraw时加.今天太晚,要睡觉了.
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里画图。
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窗口的左上角的坐标.