더북(TheBook)

ImageTool 프로그램은 스크롤 기능과 영상 확대 기능을 제공하기 때문에 마우스가 가리키는 픽셀 좌표를 출력할 때 이러한 사항을 고려해주어야 한다. 실제 마우스가 가리키는 영상의 픽셀 좌표를 알아내기 위해서는 다음과 같은 형태로 코드를 작성해야 한다.

CPoint pt = point + GetScrollPosition();
pt.x /= m_nZoom;
pt.y /= m_nZoom;

위 코드에서 pointOnMouseMove 함수에 의해 넘어온 마우스의 좌표이고, CPoint 타입의 변수 pt는 마우스가 가리키고 있는 영상의 픽셀 좌표를 저장한다. GetScrollPosition 함수는 CScrollView 클래스의 멤버 함수로써, 현재 스크롤된 위치를 CPoint 타입으로 반환하는 함수이다. 영상의 확대 배율을 나타내는 변수가 m_nZoom이므로, 위치 정보를 m_nZoom으로 나누면 실제 픽셀 좌표를 구할 수 있다.

이제 상태바에 마우스 좌표를 보여주기 위한 준비 작업은 완료되었다. 실제 헤더 파일과 소스 파일에 입력해야 할 코드는 소스 5-27과 소스 5-28에 각각 나타내었다.

소스 5-27 상태바에 영상 정보 표시를 위한 함수 선언(ImageToolView.h)
class CImageToolView : public CScrollView
{
…
    void SetScrollSizeToFit();
    void ShowImageInfo(CPoint point);
…
};
소스 5-28 상태바에 영상 정보 표시를 위한 함수 정의(ImageToolView.cpp)
#include "MainFrm.h"
#include "ImageToolDoc.h"
#include "ImageToolView.h"

void CImageToolView::OnMouseMove(UINT nFlags, CPoint point)
{
    // 상태바에 마우스 좌표 및 이미지 정보 표시
    CPoint pt = point + GetScrollPosition();
    pt.x /= m_nZoom;
    pt.y /= m_nZoom;
    ShowImageInfo(pt);

    CScrollView::OnMouseMove(nFlags, point);
}

void CImageToolView::ShowImageInfo(CPoint point)
{
    CMainFrame* pFrame = (CMainFrame *)AfxGetMainWnd();
    CImageToolDoc* pDoc = GetDocument();
    int w = pDoc->m_Dib.GetWidth();
    int h = pDoc->m_Dib.GetHeight();
    int c = pDoc->m_Dib.GetPaletteNums();

    CString strText;

    // 상태바에 마우스 좌표 표시

    if (point.x >= 0 && point.y >= 0 && point.x < w && point.y < h)
    {
        strText.Format(_T("(%d, %d)"), point.x, point.y);
        pFrame->m_wndStatusBar.SetPaneText(0, strText);
    }

    // 상태바에 이미지 정보 표시

    if (c == 0)
    {
        strText.Format(_T("w:%d h:%d c:16M"), w, h);
    }
    else
    {
        strText.Format(_T("w:%d h:%d c:%d"), w, h, c);
    }
    pFrame->m_wndStatusBar.SetPaneText(1, strText);
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.