不是很全的一个例子:void CTest_singleView::OnMouseMove(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default
if(m_bDrawing)
{
   CDC*pDC=GetDC();
   CBitmap* pOldBitmap=m_pMemDC->SelectObject(m_pBitmap);
   CPen pen;
   pen.CreatePen(PS_SOLID,m_nLineWidth,m_cLineColor);
   CPen* pOldPen=pDC->SelectObject(&pen);    CBrush* pOldBrush=(CBrush*)pDC->SelectStockObject(NULL_BRUSH);    CRect rectOld(m_ptStart,m_ptOld);
   rectOld.NormalizeRect();
//    rectOld.InflateRect(m_nLineWidth,m_nLineWidth);    pDC->BitBlt(rectOld.left,rectOld.top,rectOld.Width(),rectOld.Height(),m_pMemDC,rectOld.left,rectOld.top,SRCCOPY);    CRect rectNew(m_ptStart,point);
   switch (m_nDrawType)
   {
   case 0:
      pDC->MoveTo(m_ptStart);
  pDC->LineTo(point);
  break;
       case 1:pDC->Rectangle(rectNew);
      break;
   case 2:pDC->Ellipse(rectNew);
      break;
   case 3:
   default: break;
   }
  m_pMemDC->SelectObject(pOldBitmap);
  pDC->SelectObject(pOldPen);
  pDC->SelectObject(pOldBrush);  ReleaseDC(pDC);  m_ptOld=point;

解决方案 »

  1.   

    yavid(隐风)
    能给全的代码吗??分全是你的
      

  2.   

    如何实现一个橡皮区矩形
     
    CRectTracker是一个很有用的类,可以通过调用CRectTracker::TrackRubberBand 响应WM_LBUTTONDOWN消息来创建一个橡皮区矩形。
    下例表明使用CRectTracker移动和重置视窗中的蓝色椭圆的大小是很容易的事情。
    首先,在文件档中声明一个CRectTracker数据成员:
    class CSampleView : Public CView
    {
     …
     public :
     CrectTracker m_tracker
     …
    }
    其次,在文档类的构造函数中初始化CRectTracker 对象:
    CSampleDoc:: CSampleDOC ()
    {
     //Initialize tracker position, size and style.
     m_tracker.m_rect.SetRect (0, 0, 10, 10)
     m_tracker.m_nStyle=CRectTracker:: resizeInside | CRectTracker ::dottedLine
    }
    然后,在OnDraw函数中画椭圆和踪迹矩形:
    void CSampleView:: OnDraw (CDC* pDC)
    {
     CSampleDoc* pDoc=GetDocument ()
     ASSERT_VALID (pDoc)
     //Select blue brush into device context.
     CBrush brush (RGB (0, 0, 255))
     CBrush* pOldBrush=pDC->SelectObject (&brush)
     //draw ellipse in tracking rectangle.
     Crect rcEllipse
     pDoc->m_tracker.GetTrueRect (rcEllipse)
     pDC->Ellipse (rcEllipse)
     //Draw tracking rectangle.
     pDoc->m_tracker.Draw (pDC)
     //Select blue brush out of device context.
     pDC->Selectobject (pOldBrush)
    }
    最后,使用ClassWizard处理WM_LBUTTONDOWN消息,并增加下述代码。该段代码根据鼠标击键情况可以拖放、移动或者重置椭圆的大小。
    void CSampleView::OnLButtonDown (UINT nFlags, CPoint point)
    {
     //Get pointer to document.
     CSampleDoc* pDoc=GetDocument ()
     ASSERT_VALID (pDoc)
     //If clicked on ellipse, drag or resize it.Otherwise create a
     //rubber-band rectangle nd create a new ellipse.
     BOOL bResult=pDoc->m_tracker.HitTest (point)!= CRectTracker::hitNothing
     //Tracker rectangle changed so update views.
     if (bResult)
     {
     pDoc->m_tracker.Track (this,point,TRue)
     pDoc->SetModifiedFlag ()
     pDoc->UpdateAllViews (NULL)
     }
     else
     pDoc->m-tracker.TrackRubberBand(this,point,TRUE)
     CView:: onLButtonDown (nFlags,point)