我想在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);
语句,但是一定要得到逻辑坐标啊,不然每次用鼠标移动滚动条上次的绘制的线不能被删去。
       每次涮新给人感觉不好!       

解决方案 »

  1.   

    画线不要在这里,这里只要把坐标计算好,在OnDraw()中画.
      

  2.   

    zeroweb(低手低手低低手) 
    不能放在OnDraw(),我刚试过,不然不管鼠标这样移动,x,y坐标线不会动!
      

  3.   

    1、R2_NOT就可以,不要用R2_NOTXORPEN
    2、可能不是dp lp问题,是cursor焦点设置问题。
      

  4.   

    只要去掉 
    if(rect.PtInRect(point))
       {  
           ScreenToClient(&point);  
           ClientToLogical(point);  
         } 
    鼠标在x,y直线的交叉点傍边。但是每次用鼠标移动滚动条上次的绘制的线不能被删去。请问这样克服这些问题啊!
    是不是我的思路误道大家啊!
      

  5.   

    在OnDraw()中画,在OnMouseMove()中计算完,最后加入Invalidate()
      

  6.   

    zeroweb(低手低手低低手) 
    用于我在CScrollView里显示一幅jpg图象,
    在OnMouseMove()中计算完,最后加入Invalidate()那么图象闪烁很历害
    这样估计不行!
      

  7.   

    CPoint pt=GetScrollPosition();//得到移动滚动条后设备坐标和逻辑坐标的偏差。然后在需要画线的地方加上这个偏差。
      

  8.   

    用双缓冲来画会好一些,那创建一个内存DC,在此内存DC上画,然后BitBlt在屏幕DC上,另外还可以在WM_ERASEBKGROUD消息中处理一下,也会有一些改善.这种资料网上很多,比如这里的程序员大本营和VCKBASE.com等.下面是在MSDN中的一段有关双缓冲的代码:
    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");
    }
      

  9.   

    zeroweb(低手低手低低手)
    效果还是一样的
      

  10.   

    shu() :
    ScreenToClient(&point);  有意义吗?
    你在ClientToLogical(point);  中已经用OnPrePareDC调整视口原点。
    “但是每次用鼠标移动滚动条、、、”用鼠标移动滚动条又不会引起OnMouseMove,所以没有删除线的逻辑。谢谢你的提示帮我克服了鼠标离x,y直线的交叉点用一定的距离,把ScreenToClient(&point);删除就行了。还有帮我找出问题的原因用鼠标移动滚动条又不会引起OnMouseMove,所以没有删除线的逻辑。
    但是这样克服呢????每次启动,第一条绘制的x,y坐标直线就是不能被删除。
    好烦啊!今天人气好旺!!!!!!!!!!希望多些人关注!!!
      

  11.   

    鼠标移动滚动条又不会引起OnMouseMove,所以没有删除线的逻辑。
    但是这样克服呢????
    每次启动,第一条绘制的x,y坐标直线就是不能被删除。
    好烦啊!今天人气好旺!!!!!!!!!!希望多些人关注!!!讨论!!!
      

  12.   

    你只是希望移动滚动条时删除pointold决定的两条直线吗?我不理解你这样做的目的是什么,但如果仅是这样,你可以映射滚动条滚动的消息OnHScroll OnVScroll,在其中加上删除的逻辑或直接更新窗口(因为你在ondraw什么也没干),要结合一个变量只重画一次,下次鼠标移动画新线时就不要删除了:
    if(m_BROP2)
    {
      删除或更新窗口
      m_BROP2=FALSE;
    }