SOFTIST 编程方法筆記 目录

形区域定位(VC++)

CRectTracker  

在画面上,用鼠标拖拉来选择矩形範囲时,使用CRectTrackerク类。本文纪录使用方法。 

1.创建一个View/Frame工程,为了保存矩形的坐标,用CRect型定义一个m_rect变量。把afxext.h头文件包含进来。 

#include <afxext.h>
CRect m_rect;

2.矩形区域定位类使用的是屏幕坐标。

void CTestRTView::OnInitialUpdate() 
{
    CView::OnInitialUpdate();
    m_rect = CRect(10,10,100,100);
    ClientToScreen(&m_rect);
}

3.为了试验,在矩形区域中描画一个楕円。

void CTestRTView::OnDraw(CDC* pDC)
{
    CTestRTDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    pDC->Ellipse(&m_rect);
}

4.以鼠标的左键点击为开端,生成CRectTracker实体变量,调其功能。通过鼠标拖拉的操作确定矩形范围后,取出其坐标保存到m_rect中。重画楕円。

void CTestRTView::OnLButtonDown(UINT nFlags, CPoint point) 
{
    CClientDC dc(this);

    if (m_rect.PtInRect(point))
    {
        CRectTracker tracker;
        tracker.m_nHandleSize = 8;
        tracker.m_rect = m_rect;
        tracker.m_nStyle |= CRectTracker::resizeInside;
        tracker.m_nStyle |= CRectTracker::solidLine;    
        tracker.Draw(&dc);
        if (tracker.Track(this, point))
        {
            tracker.GetTrueRect(m_rect);
            Invalidate();
        }
    }
    CView::OnLButtonDown(nFlags, point);
}

5.为了操作方便,当鼠标移到矩形区域上方时,让鼠标形状変化。

BOOL CTestRTView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
    CClientDC dc(this);
    CRectTracker tracker;
    tracker.m_nHandleSize = 8;
    tracker.m_rect = m_rect;
    tracker.m_nStyle |= CRectTracker::resizeInside;
    tracker.m_nStyle |= CRectTracker::solidLine;    
    tracker.Draw(&dc);
    if (tracker.SetCursor(this, nHitTest))
        return TRUE;
    return CView::OnSetCursor(pWnd, nHitTest, message);
}