C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[57510] Re:ListView 의 Multiselect 같은 것들을,,
skjoon [skjoon] 1114 읽음    2009-07-08 11:51
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가 없는 다른 컨트롤에서 구현해 보고 싶은데...
: 사각형을 그리고  그 영역 안에 컨트롤 들이 있는지 없는지를 판단하게 해주는
: 루틴을 쉽게 할 수 있는 방법이 있다면 힌트나 조언 부탁드리겠습니다^^

+ -

관련 글 리스트
57508 ListView 의 Multiselect 같은 것들을,, 비몽 876 2009/07/08
57510     Re:ListView 의 Multiselect 같은 것들을,, skjoon 1114 2009/07/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.