我想在CScrollView里,随着鼠标的移动,坐标更着鼠标一起移动。
程序如下:
void CLieMap::OnMouseMove(UINT nFlags, CPoint point)
{
CRect rect;
GetWindowRect(rect);
if(rect.PtInRect(point))
{
ScreenToClient(&point);
ClientToLogical(point);
} CClientDC dc(this);
CPen pen(PS_DASH,1,RGB(0,0,0));
CPen* oldpen=dc.SelectObject(&pen);
if(m_BROP2)
{
dc.SetROP2(R2_NOTXORPEN);
dc.MoveTo(pointold);
dc.LineTo(pointy1);//擦掉以前的线
dc.MoveTo(pointold);
dc.LineTo(pointy2);
dc.MoveTo(pointold);
dc.LineTo(pointx1);
dc.MoveTo(pointold);
dc.LineTo(pointx2);
}
pointy1.x =point.x ;pointy1.y =rect.top;
pointy2.x=point.x;pointy2.y=rect.bottom;
pointx1.x=rect.left;pointx1.y =point.y;
pointx2.x=rect.right; pointx2.y=point.y;
pointold=point; dc.MoveTo(point);
dc.LineTo(pointy1);//画新线
dc.MoveTo(point);
dc.LineTo(pointy2);
dc.MoveTo(point);
dc.LineTo(pointx1);
dc.MoveTo(point);
dc.LineTo(pointx2);
dc.SelectObject(oldpen);
m_BROP2=TRUE;
CScrollView::OnMouseMove(nFlags, point);
}void CLieMap::ClientToLogical(CPoint &point)
{
CClientDC dc(this);
OnPrepareDC(&dc,NULL);
dc.DPtoLP(&point);
}
这程序有一下问题:
每次启动,第一条绘制的x,y坐标直线不能被删除。
鼠标离x,y直线的交叉点用一定的距离,这问题是利用了dc.DPtoLP(&point);
语句,但是一定要得到逻辑坐标啊,不然每次用鼠标移动滚动条上次的绘制的线不能被删去。
每次涮新给人感觉不好!
程序如下:
void CLieMap::OnMouseMove(UINT nFlags, CPoint point)
{
CRect rect;
GetWindowRect(rect);
if(rect.PtInRect(point))
{
ScreenToClient(&point);
ClientToLogical(point);
} CClientDC dc(this);
CPen pen(PS_DASH,1,RGB(0,0,0));
CPen* oldpen=dc.SelectObject(&pen);
if(m_BROP2)
{
dc.SetROP2(R2_NOTXORPEN);
dc.MoveTo(pointold);
dc.LineTo(pointy1);//擦掉以前的线
dc.MoveTo(pointold);
dc.LineTo(pointy2);
dc.MoveTo(pointold);
dc.LineTo(pointx1);
dc.MoveTo(pointold);
dc.LineTo(pointx2);
}
pointy1.x =point.x ;pointy1.y =rect.top;
pointy2.x=point.x;pointy2.y=rect.bottom;
pointx1.x=rect.left;pointx1.y =point.y;
pointx2.x=rect.right; pointx2.y=point.y;
pointold=point; dc.MoveTo(point);
dc.LineTo(pointy1);//画新线
dc.MoveTo(point);
dc.LineTo(pointy2);
dc.MoveTo(point);
dc.LineTo(pointx1);
dc.MoveTo(point);
dc.LineTo(pointx2);
dc.SelectObject(oldpen);
m_BROP2=TRUE;
CScrollView::OnMouseMove(nFlags, point);
}void CLieMap::ClientToLogical(CPoint &point)
{
CClientDC dc(this);
OnPrepareDC(&dc,NULL);
dc.DPtoLP(&point);
}
这程序有一下问题:
每次启动,第一条绘制的x,y坐标直线不能被删除。
鼠标离x,y直线的交叉点用一定的距离,这问题是利用了dc.DPtoLP(&point);
语句,但是一定要得到逻辑坐标啊,不然每次用鼠标移动滚动条上次的绘制的线不能被删去。
每次涮新给人感觉不好!
解决方案 »
- 求思路,时间格式不一样怎么比较先后
- 如何将读取到的内容存放到一个char数组里面,求教!
- 谁有matlab可以发送几个文件给我么?
- LPCTSTR转换到LPWSTR
- 使用ADO连接SQLSERVER,是否每次运行程序都要启动SQLSERVER服务???
- 怎样使用#ifdef #else #endif?
- ★★工程不能建立“.bsc”文件怎么办?★★
- 高手请进,如何在IDL中输出HINSTANCE?(不够再给)
- 怎样在对话框中使时间控件在程序执行后显示当前时间?
- 请问大虾用SQL语句动态创建ACCESS表的时候,怎样设定字段的属性中的"允许空字符串"
- 怎么将位图缩小?
- 控制台程序调用另一控制台程序怎样才能将调用的结果显示在原窗口中
不能放在OnDraw(),我刚试过,不然不管鼠标这样移动,x,y坐标线不会动!
2、可能不是dp lp问题,是cursor焦点设置问题。
if(rect.PtInRect(point))
{
ScreenToClient(&point);
ClientToLogical(point);
}
鼠标在x,y直线的交叉点傍边。但是每次用鼠标移动滚动条上次的绘制的线不能被删去。请问这样克服这些问题啊!
是不是我的思路误道大家啊!
用于我在CScrollView里显示一幅jpg图象,
在OnMouseMove()中计算完,最后加入Invalidate()那么图象闪烁很历害
这样估计不行!
void CBlat2View::OnDraw(CDC* pDC)
{
CBlat2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc); // load IDB_BITMAP1 from our resources
CBitmap bmp;
if (bmp.LoadBitmap(IDB_BITMAP1))
{
// Get the size of the bitmap
BITMAP bmpInfo;
bmp.GetBitmap(&bmpInfo); // Create an in-memory DC compatible with the
// display DC we're using to paint
CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC); // Select the bitmap into the in-memory DC
CBitmap* pOldBitmap = dcMemory.SelectObject(&bmp); // Find a centerpoint for the bitmap in the client area
CRect rect;
GetClientRect(&rect);
int nX = rect.left + (rect.Width() - bmpInfo.bmWidth) / 2;
int nY = rect.top + (rect.Height() - bmpInfo.bmHeight) / 2; // Copy the bits from the in-memory DC into the on-
// screen DC to actually do the painting. Use the centerpoint
// we computed for the target offset.
pDC->BitBlt(nX, nY, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory,
0, 0, SRCCOPY); dcMemory.SelectObject(pOldBitmap);
}
else
TRACE0("ERROR: Where's IDB_BITMAP1?\n");
}
效果还是一样的
ScreenToClient(&point); 有意义吗?
你在ClientToLogical(point); 中已经用OnPrePareDC调整视口原点。
“但是每次用鼠标移动滚动条、、、”用鼠标移动滚动条又不会引起OnMouseMove,所以没有删除线的逻辑。谢谢你的提示帮我克服了鼠标离x,y直线的交叉点用一定的距离,把ScreenToClient(&point);删除就行了。还有帮我找出问题的原因用鼠标移动滚动条又不会引起OnMouseMove,所以没有删除线的逻辑。
但是这样克服呢????每次启动,第一条绘制的x,y坐标直线就是不能被删除。
好烦啊!今天人气好旺!!!!!!!!!!希望多些人关注!!!
但是这样克服呢????
每次启动,第一条绘制的x,y坐标直线就是不能被删除。
好烦啊!今天人气好旺!!!!!!!!!!希望多些人关注!!!讨论!!!
if(m_BROP2)
{
删除或更新窗口
m_BROP2=FALSE;
}