ScrollBox滚动之后,怎么获得一个固定点的逻辑坐标?
我放一个Label到ScrollBox上,我的窗口滚动了之后,label->Left
的值会跟着改变,用逻辑坐标标识Label的左上点会解决这个问题,可是我用
了逻辑坐标后,label->left仍然在滚动之后会变,老大们帮我看看是不是映射方法有误
void __fastcall ScrollBox1::Label1Click(TObject *Sender)
{
HDC dc=::GetDC(ScrollBox1->Handle);
dc.SetMapMode(MM_TWIPS);
TPoint p;
p.x=Label1->Left;
p.y=Label1->Top;
DPtoLP(FrmDraw->Canvas->Handle,&p,1);//我设想的应该是,经过这个变换之后,p 成了逻辑坐标,应该不会变了,可是还是变化的
Label1->Caption=p.x +"," +p.y;
}
当一个窗口有滚动条的话,该怎么正确计算各点逻辑坐标?
问题点数:0、回复次数:1Top
1 楼vdragon(紫龙)回复于 2003-12-04 19:37:58 得分 0
下面是我找到一个VC的文档
坐标间转换:在以上的函数中point参数对应的都是窗口的设备坐标,我们应该将设备坐标和逻辑坐标相区别,在图32_g1由于窗口使 用了滚动条,所以传入的设备坐标是对应于当前窗口左上角的坐标,没有考虑是否滚动,而逻辑坐标必须考虑滚动后对应的坐标。看得出同一点在滚动后的坐标值是不同的,这一规则同样适用于改变了映射方 式的窗口,假设你将映射方式设置为每点为0.01毫米,那么设备坐标所对应的逻辑坐标也需要重新计算。进行这种转换需要写一段代 码,所幸的是系统提供了进行转换的功能DC的DPtoLP,LPtoDP,下面给出代码完成由设备坐标到逻辑坐标的转换。
CPoint CYourView::FromDP(CPoint point)
{
CClientDC dc(this);
CPoint ptRet=point;
dc.PrepareDC();//必须先准备DC,这在使用滚动时让DC重新计算坐标
//如果你作图设置了不同的映射方式,则在下面需要设置
dc.SetMapMode(...)
//
dc.DPtoLP(&ptRet);//DP->LP进行转换
return ptRet;
}
怎么按照这个方法在CB里实现逻辑坐标的转换呢,在
CB里 dc.PrepareDC()是用不了的....
Top




