你的信箱([email protected])我发不过去,你有MSDN吗?如有,找一个叫tracker的例子
\s(amples\VC98\mfc\general\tracker)

解决方案 »

  1.   

    void CHugoMapXCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    m_bLButtonDown=TRUE;
    m_OldPoint=point;
    m_OldMovePoint=point;
    SetCapture();
    COleControl::OnLButtonDown(nFlags, point);
    }void CHugoMapXCtrl::OnLButtonUp(UINT nFlags, CPoint point) 
    {
    m_bLButtonDown=FALSE;
    ReleaseCapture();
    m_bZoomRect=FALSE;
    COleControl::OnLButtonUp(nFlags, point);
    }void CHugoMapXCtrl::OnMouseMove(UINT nFlags, CPoint point) 
    {
    if (m_bLButtonDown)
    {
    HWND hWnd=(HWND)GetHwnd();
    HDC hdc=::GetDC(hWnd);
    CDC cdc;
    cdc.Attach(hdc);
    SIZE size;
    size.cx=1;
    size.cy=1;
    if (m_OldPoint != point)
    {
    CRect newRect(min(m_OldPoint.x,point.x),
      min(m_OldPoint.y,point.y),
      max(m_OldPoint.x,point.x),
      max(m_OldPoint.y,point.y));
    CRect oldRect(min(m_OldPoint.x,m_OldMovePoint.x),
      min(m_OldPoint.y,m_OldMovePoint.y),
      max(m_OldPoint.x,m_OldMovePoint.x),
      max(m_OldPoint.y,m_OldMovePoint.y)); cdc.DrawDragRect(&newRect,size,&oldRect,size,NULL,NULL);
    m_ZoomRect=newRect;
    m_bZoomRect=TRUE;
    }
    cdc.Detach(); m_OldMovePoint=point;
    }
    COleControl::OnMouseMove(nFlags, point);
    }
      

  2.   

    void CHugoMapXCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
    {
         m_bLButtonDown=TRUE;
         m_OldPoint=point;
         m_OldMovePoint=point;
         SetCapture();
         COleControl::OnLButtonDown(nFlags, point);
    }void CHugoMapXCtrl::OnLButtonUp(UINT nFlags, CPoint point) 
    {
        m_bLButtonDown=FALSE;
        ReleaseCapture(); 
        m_bZoomRect=FALSE;
        COleControl::OnLButtonUp(nFlags, point);
    }void CHugoMapXCtrl::OnMouseMove(UINT nFlags, CPoint point) 
    {
       if (m_bLButtonDown)
       {
         HWND hWnd=(HWND)GetHwnd();
         HDC hdc=::GetDC(hWnd);
         CDC cdc;
         cdc.Attach(hdc);
         if (m_OldPoint != point)
         {
          CRect newRect(min(m_OldPoint.x,point.x),
                       min(m_OldPoint.y,point.y),
                       max(m_OldPoint.x,point.x),
                       max(m_OldPoint.y,point.y));
          CRect oldRect(min(m_OldPoint.x,m_OldMovePoint.x),
                       min(m_OldPoint.y,m_OldMovePoint.y),
                       max(m_OldPoint.x,m_OldMovePoint.x),
                       max(m_OldPoint.y,m_OldMovePoint.y));      cdc.DrawDragRect(&newRect,size,&oldRect,size,NULL,NULL);
          m_ZoomRect=newRect;
          m_bZoomRect=TRUE;
         }
        cdc.Detach();    m_OldMovePoint=point;
       }
    COleControl::OnMouseMove(nFlags, point);
    }
      

  3.   

    void CHugoMapXCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
    {
        m_bLButtonDown=TRUE;
        m_OldPoint=point;
        m_OldMovePoint=point;
        SetCapture();
        COleControl::OnLButtonDown(nFlags, point);
    }void CHugoMapXCtrl::OnLButtonUp(UINT nFlags, CPoint point) 
    {
        m_bLButtonDown=FALSE;
        ReleaseCapture(); 
        m_bZoomRect=FALSE;
        COleControl::OnLButtonUp(nFlags, point);
    }void CHugoMapXCtrl::OnMouseMove(UINT nFlags, CPoint point) 
    {
      if (m_bLButtonDown)
      {
        HWND hWnd=(HWND)GetHwnd();
        HDC hdc=::GetDC(hWnd);
        CDC cdc;
        cdc.Attach(hdc);
        SIZE size;
        size.cx=1;
        size.cy=1;
        if (m_OldPoint != point)
        {
          CRect newRect(min(m_OldPoint.x,point.x),
                      min(m_OldPoint.y,point.y),
                      max(m_OldPoint.x,point.x),
                      max(m_OldPoint.y,point.y));
          CRect oldRect(min(m_OldPoint.x,m_OldMovePoint.x),
                      min(m_OldPoint.y,m_OldMovePoint.y),
                      max(m_OldPoint.x,m_OldMovePoint.x),
                      max(m_OldPoint.y,m_OldMovePoint.y));      cdc.DrawDragRect(&newRect,size,&oldRect,size,NULL,NULL);
          m_ZoomRect=newRect;
          m_bZoomRect=TRUE;
        }
        cdc.Detach();    m_OldMovePoint=point;
      }
    COleControl::OnMouseMove(nFlags, point);
    }
      

  4.   

    其实就是用XOR方式画而已,第一次画就出现(OnLButtonDown),当你鼠标移动时(OnMouseMove),就在上一次画的地方再画一次,就摸去了上次的虚线框,然后在现在的位置再画一次,把虚线框显示出来。
    如果你用CDC::DrawDragRect的话,摸去上次的虚线框是自动做的,所以你只要在OnLButtonDown,OnMouseMove,OnLButtonUp里直接call CDC::DrawDragRect 画当前的矩形就行了
      

  5.   

    给你一个例子,照写就可以了,相关的api函数声明和常数,变量声明略去了。注意看其中的注释。Private Sub pctScreen_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
        Dim clipR As RECT, clipP As POINTAPI
        If Button And vbLeftButton Then
            'The first corner of the rectangle is recorded in the viewX1
            'and dviewY1 variables. The other corner is set to the same point.
            dviewX1! = X
            dviewY1! = Y
            dviewX2! = dviewX1!
            dviewY2! = dviewY1!
            
    'Clip the cursor to the picture control:        'Get the SCREEN coordinates of the form's origin
            clipP.X = 0
            clipP.Y = 0
            dummy& = ClientToScreen(Me.hWnd, clipP)
            
            'Set the clip rectangle
            clipR.Top = pctScreen.Top + clipP.Y ' Top of pctScreen + top of form
            clipR.Left = pctScreen.Left + clipP.X ' left of pctScreen + left of form, etc.
            clipR.Right = pctScreen.Left + pctScreen.Width + clipP.X
            clipR.Bottom = pctScreen.Top + pctScreen.Height + clipP.Y
            dummy& = ClipCursor&(clipR) ' Clip the cursor to the clipR rectangle
        End If
    End Sub
    Private Sub pctScreen_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
        If Button And vbLeftButton Then ' If the button is down then
            'Draw mode is XOR. We will draw a second box in the place of the
            'previous one, erasing it.
            pctScreen.Line (dviewX1!, dviewY1!)-(dviewX2!, dviewY2!), QBColor(10), B        ' Record where we are.
            dviewX2! = X
            dviewY2! = Y
            
            'Draw a dotted box to simulate a dragging rectangle
            pctScreen.Line (dviewX1!, dviewY1!)-(dviewX2!, dviewY2!), QBColor(10), B
        End If
    End Sub
    Private Sub pctScreen_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
        'Unclip the cursor
        dummy& = ClipCursorBynum&(0&)
        
        'If any of the box's dimensions are 0, then quit
        If dviewX1 = dviewX2 Or dviewY1 = dviewY2 Then Exit Sub
        
        'Erase the box from the screen by re-drawing it.
        pctScreen.Line (dviewX1!, dviewY1!)-(dviewX2!, dviewY2!), QBColor(10), B
        
        'Set the Viewport Variables to the box dimensions
        viewOrgX& = CLng(dviewX1!)
        viewOrgY& = CLng(dviewY1!)
        viewExtX& = CLng(dviewX2!) - CLng(dviewX1!)
        viewExtY& = CLng(dviewY2!) - CLng(dviewY1!)
        
        'Redraw the screen.
        pctScreen.Refresh
    End Sub