最好有源码,谢谢各位了。

解决方案 »

  1.   

    1。 在mousemove中不断的画啊,画啊……
    2。 拖动时生成一个小窗口,把区域位图放到它上面,然后mousemove中移动窗口
      

  2.   

    用CRectTracker
    全局变量
    CRect rect;
    CRectTracker tracker;
    //
    OnDraw()
    tracker.m_rect=rect;
    //
    OnSetCursor()
    tracker.SetCursor();
    //
    OnInitUpdate()
    tracker.m_nStyle=CRectTracker::resizeOutside;
    tracker.m_rect=CRect(0,0,100,100);
    //
    OnMouseDown()
    if(rect.PtInRect(point))
    {
       tracker.Track(this,point);
    }
    //
    OnMouseUp()
    {
        rect=tracker.m_rect;
    }
      

  3.   

    请大家不用把封装和实现功能等同!实现功能可以没有类,这时所关注的是如何实现(这里面很大一部分工作是与windows之间的"合作"); 然后可以考虑怎么实现更好,当然可以使用oo。这两步是头脑中的基本步骤,不一定是程序要写两边。大系统可以使用软工方法,小程序脑子想清楚就行了。
      

  4.   

    简单演示一下,刷新需要优化。
    在CImageEditView定义加
    protected:
    CBitmap  m_bmpDrag;
    CDC m_dcDrag; CRect  m_rcDrag; BOOL  m_bDown; CRect  m_rcOldDrag;void CImageEditView::OnDraw(CDC* pDC)
    {
        // 根据无效区画背景图
    }void CImageEditView::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    SetCapture(); CDC* pDC = GetDC();

    m_dcDrag.SelectObject(&m_bmpDrag); m_dcDrag.BitBlt(0, 0, m_rcDrag.Width(), m_rcDrag.Height(), pDC, 
    point.x - m_rcDrag.Width()  / 2, 
    point.y - m_rcDrag.Height() / 2, 
    SRCCOPY); ReleaseDC(pDC); m_rcOldDrag.left = point.x - m_rcDrag.Width()  / 2;
    m_rcOldDrag.top  = point.y - m_rcDrag.Height() / 2;
    m_rcOldDrag.right  = m_rcOldDrag.left + m_rcDrag.Width();
    m_rcOldDrag.bottom = m_rcOldDrag.top  + m_rcDrag.Height(); m_bDown = TRUE; CScrollView::OnLButtonDown(nFlags, point);
    }void CImageEditView::OnLButtonUp(UINT nFlags, CPoint point) 
    {
    ReleaseCapture();

    m_bDown = FALSE; CScrollView::OnLButtonUp(nFlags, point);
    }void CImageEditView::OnMouseMove(UINT nFlags, CPoint point) 
    {
    if(m_bDown)
    {
    InvalidateRect(m_rcOldDrag);
    UpdateWindow();
    // 以上两行可以优化,可在此直接用位图画无效区

    CDC* pDC = GetDC(); pDC->BitBlt(point.x - m_rcDrag.Width()  / 2, 
    point.y - m_rcDrag.Height() / 2,
    m_rcDrag.Width(), 
    m_rcDrag.Height(), 
    &m_dcDrag, 
    0, 0, SRCCOPY); m_rcOldDrag.left = point.x - m_rcDrag.Width()  / 2;
    m_rcOldDrag.top  = point.y - m_rcDrag.Height() / 2;
    m_rcOldDrag.right  = m_rcOldDrag.left + m_rcDrag.Width();
    m_rcOldDrag.bottom = m_rcOldDrag.top  + m_rcDrag.Height(); ReleaseDC(pDC);
    } CScrollView::OnMouseMove(nFlags, point);
    }int CImageEditView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
    if (CScrollView::OnCreate(lpCreateStruct) == -1)
    return -1;

    m_rcDrag.SetRect(0, 0, 150, 90); CDC* pDC = GetDC(); m_bmpDrag.CreateCompatibleBitmap(pDC, m_rcDrag.Width(), m_rcDrag.Height());

    m_dcDrag.CreateCompatibleDC(pDC); ReleaseDC(pDC); return 0;
    }