프로그래밍/VC++

CRectTracker 쓰는 법(간단)

panpro 2006. 9. 25. 13:48
CRectTracker 는 사각형 영역을 잡는데 쓴다.




















위와 같은 그림은 많이 봐왔을거다.

MFC에 들어있는 클래스이고,

#include "afxext.h"

를 해줘야 한다.

헤더파일에
private:
CRectTracker m_tracker;
이렇게 선언해 주고,

사용해야 할 곳에서(예를 들어 버튼을 누른다거나)

CRect rect(10, 10, 100, 100);
m_tracker.m_rect = rect;
m_tracker.m_nStyle = 0;
m_tracker.m_nStyle |= CRectTracker::dottedLine;
m_tracker.m_nStyle |= CRectTracker::resizeOutside;

this->Invalidate();


그리고 LButtonDown 이벤트에서 다음과 같이 해준다.
void CTrackerDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
if (m_tracker.HitTest(point) < 0)
{
CRectTracker track;
if (track.TrackRubberBand(this, point, true)) {
track.m_rect.NormalizeRect();
m_tracker.m_rect = track.m_rect;
//SetImageRectSelection(pDoc,&(m_tracker.m_rect));
} else {
m_tracker.m_rect = CRect(0,0,0,0);
}
} else {
if (m_tracker.Track(this, point, true)){
m_tracker.m_rect.NormalizeRect();
//SetImageRectSelection(pDoc,&(m_tracker.m_rect));
} else {
m_tracker.m_rect = CRect(0,0,0,0);
}
}

this->Invalidate();


CDialog::OnLButtonDown(nFlags, point);
}

OnPaint 혹은 OnDraw 함수에서 다음과 같이 넣어준다.
CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트
if ( (m_tracker.m_rect.Width() > 0) && (m_tracker.m_rect.Height() > 0) )
m_tracker.Draw(&dc);

CDialog::OnPaint();


Draw 함수를 호출하면 거기로 트랙커가 그려지는거다.

다음 트랙커의 각 점위로 마우스가 올라가면 그 마우스의 모양이 변하도록 하기 위해, WM_SETCURSOR를 재정의한다.
BOOL CTrackerDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

if (m_tracker.SetCursor( pWnd, nHitTest ))
return TRUE;
return CDialog::OnSetCursor(pWnd, nHitTest, message);
}