[kaze's test] プログラミングメモ →目次

 

矩形トラッカー(VC++)

画面上で、マウスのドラッグで、矩形の範囲を指定する為のCRectTrackerクラスの使い方のメモです。 



1.ビュー/フレームベースのプロジェクトを作成して、矩形のデータを保存する為に、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);
}