본문 바로가기
programming/임시

객체크기에 맞게 마우스on 기능

by hotdogya 2011. 3. 18.

객체 위에 마우스 올렸을때 마우스 이벤트 발생(?) 어케 표현해야 하지?;; ㅋ

우선 마우스를 쓸거니깐 WM_MOUSEMOVE 메시지를 추가해야겠죠?

요렇게 추가하면

void CTest::OnMouseMove(UINT nFlags, CPoint point)
{

// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

CDialog::OnMouseMove(nFlags, point);
}

요런게 파일이름Dlg.cpp 파일에 생기죠.

우선 첫번째 방법은?

void CTest::OnMouseMove(UINT nFlags, CPoint point)
{
if (point.x > 8 && point.x <209 && point.y >10 && point.y < 160)
{
strOut.FormatMessage("첫 번째 객체");
}
else if (point.x > 232 && point.x < 433 && point.y >10 && point.y < 160)
{
strOut.FormatMessage("두 번째 객체");
}

UpdateData(0);
CDialog::OnMouseMove(nFlags, point);
}

보통 이런 식으로 마우스 포인트 범위 지정해서 마우스 이동위치를 체크해서 객체위에 마우스가 올라간것과 같은 표현을해 줄 수 있습니다.

일종의 눈속임??

이럴 경우 사용자가 일일이 픽셀 체크해서 범위를 지정해야 하는 압박이 ㅡㅡ;;

이에 대한 해결법은...?

void CTest::OnMouseMove(UINT nFlags, CPoint point)
{

CWnd* pWnd1 = GetDlgItem(IDC_BITMAP1);

CWnd* pWnd2 = GetDlgItem(IDC_BITMAP2);

CRect rect1;

CRect rect2;
pWnd1->GetWindowRect(&rect1);

pWnd2->GetWindowRect(&rect2);
ScreenToClient(&rect);

if(rect.PtInRect(point))
strOut=_T("첫 번째 객체");
else
strOut=_T("두 번째 객체");
UpdateData(0);


CDialog::OnMouseMove(nFlags, point);
}

요로케 하면 되는데

위에 빨갛게 표시해둔건 마우스가 올라갈때 선택될 객체입니다. 객체의 ID가 들어가죠. 전 IDC_BITMAP으로 이미지를 추가했습니다.

그담엔 CRect로 rect 객체를 만듭니다. CRect는 사각형을 만드는 클래스입죠.

이렇게 만든 rect에 GetDlgItem으로 얻은 객체의 주소를 넣어서 이용하는데,

요기서 뽀인트가 PtInRect입니다.

마우스가 지정한 사각형안에 들어가게 되면 이벤트가 발생합니다.

왠만하면 객체 생성은 BOOL CTest::OnInitDialog(){}안에 넣어주는게 좋겠죠? ㅋ

이상 과제하다가 해본거 적어봤습니다.

소스 출처가 어딘지 기억이 안나네요;;;

요것도 참고하세요 ▼

GetWindowRect
윈도우의 현재 위치와 크기를 구해준다. (left, top)은 윈도우의 현재 좌상단 위치를 나타내는데 이 좌표는 전체 화면을 기준으로 한 좌표이다. (right, bottom)은 윈도우의 우하단 위치를 나타내며 역시 전체 화면을 기준으로 한 좌표이다. 윈도우의 현재 크기(폭과 높이)를 구하고 싶으면 right-left, bottom-top을 계산하면 된다.

GetClientRect
윈도우의 작업영역 크기를 계산해 준다. 크기만 계산해 주기 때문에 좌상단(left, top)값은 항상 0,0이며 우하단 좌표(right, bottom)가 곧 윈도우의 크기를 나타낸다. 작업영역이란 윈도우의 타이틀바, 스크롤 바, 경계선, 메뉴 등을 제외한 영역이며 윈도우가 그리기를 하는 대상 영역이다

ScreenToClient
화면의 원점을 기준으로 하는 좌표 lpPoint를 hWnd의 작업 영역을 기준으로 하는 좌표로 변환한다. hWnd윈도우의 작업 영역 원점의 화면 좌표가 cx, cy일 때 lpPoint는 lpPoint.x - cx, lpPoint - cy로 변환된다. GetCursorPos, MoveWindow, GetWindowRect 등과 같이 화면 좌표를 리턴하는 함수로부터 작업 영역의 좌표로 변환하고자 할 때 이 함수를 사용한다.