MouseMove 이벤트 핸들러에서 선택영역을 그리며(DrawFocusRect) Shape들을 멀티셀렉트하는 방법입니다.
몇 년전에 썼었던 방식인데.. 일단 참고하시라고 간단하게 정리해서 올립니다.
유닛파일은 첨부하였습니다.
void __fastcall TForm3::FormMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if( Shift.Contains(ssLeft) ) {
HRGN hrgn = NULL;
HDC DC = GetDC( Handle );
TRect rectShp;
SetROP2(DC, R2_NOTXORPEN); // 이전 드래그 셀렉트 영역을 지우기 위함.
DrawFocusRect(DC, &m_rectSelect);
SetRect(&m_rectSelect, min(X, m_pntStart.x), min(Y, m_pntStart.y), max(X, m_pntStart.x), max(Y, m_pntStart.y) );
// 마우스 드래그에 의해 선택된 영역을 설정
hrgn = CreateRectRgn(m_rectSelect.left, m_rectSelect.top, m_rectSelect.right, m_rectSelect.bottom);
for(int i = 0; i < MAX_SHAPES; i++) {
if(m_pShapes[i]) {
SetRect(&rectShp,
m_pShapes[i]->Left,
m_pShapes[i]->Top,
m_pShapes[i]->Left + m_pShapes[i]->Width,
m_pShapes[i]->Top + m_pShapes[i]->Height);
// Shape들이 선택영역 안에 위치하는지 확인
if(RectInRegion(hrgn, &rectShp)) {
if(m_pShapes[i]->Brush->Color != clBlue)
// Shape들이 선택영역 안에 위치하면 파랑색으로...
m_pShapes[i]->Brush->Color = clBlue;
} else {
if(m_pShapes[i]->Brush->Color != clWhite)
// Shape들이 선택영역 안에 위치하지 않으면 하양색으로...
m_pShapes[i]->Brush->Color = clWhite;
}
}
}
DeleteObject( hrgn );
hrgn = NULL;
DrawFocusRect(DC, &m_rectSelect); // 새로 드래그 셀렉트 영역을 그림
ReleaseDC(Handle, DC);
DC = NULL;
}
}
//---------------------------------------------------------------------------
비몽 님이 쓰신 글 :
: 다른 컨트롤에서 어떻게 구현할 수 있을까요?
:
: 단순히 리스트 뷰에서 multiselect를 true로 주면
: 마우스로 드래깅시 사각영역이 생기고 그안의 아이템들이 선택되어지는
: 이러한 기능을 multiselect가 없는 다른 컨트롤에서 구현해 보고 싶은데...
: 사각형을 그리고 그 영역 안에 컨트롤 들이 있는지 없는지를 판단하게 해주는
: 루틴을 쉽게 할 수 있는 방법이 있다면 힌트나 조언 부탁드리겠습니다^^