Visual C++를 사용하여 MFC의 창에 대한 마우스 포인터 변경

이 문서에서는 Visual C++를 사용하여 MFC의 창에 대한 마우스 포인터를 변경하는 방법을 소개합니다. 이 문서의 정보는 관리되지 않는 Visual C++ 코드에만 적용됩니다.

원래 제품 버전: Visual C++
원래 KB 번호: 131991

요약

Windows 기반 애플리케이션에서는 항상 창 클래스를 기반으로 창이 만들어집니다. 창 클래스는 기본 마우스 포인터(커서)를 포함하여 창의 여러 특성을 기준으로 식별합니다. 경우에 따라 애플리케이션이 만드는 특정 창과 연결된 포인터를 변경하려고 할 수 있습니다. 이 문서에서는 MFC 애플리케이션이 서로 다른 시간에 다른 포인터를 표시하는 데 사용할 수 있는 세 가지 방법을 설명합니다.

MFC 애플리케이션이 다른 포인터를 표시하는 상황

MFC 애플리케이션이 다른 시간에 다른 포인터를 표시하도록 할 수 있는 몇 가지 상황은 다음과 같습니다.

  • 기본 포인터가 특정 애플리케이션에 적합한 사용자 인터페이스 개체가 아닌 경우 예를 들어 I 빔 포인터는 메모장에서 텍스트 편집기 창의 화살표보다 더 적합합니다. 여기에는 애플리케이션의 전체 실행에 대한 포인터를 변경하는 작업이 포함될 수 있습니다.
  • 애플리케이션이 디스크 I/O와 같은 긴 작업을 수행하는 경우 모래 시계 포인터가 화살표보다 더 적합합니다. 포인터를 모래 시계로 변경하여 사용자에게 좋은 시각적 피드백을 제공합니다. 여기에는 제한된 기간 동안 포인터를 변경하는 작업이 포함될 수 있습니다.

창에서 마우스 포인터를 변경하는 세 가지 방법

애플리케이션이 창에서 마우스 포인터를 변경할 수 있는 세 가지 방법은 다음과 같습니다.

  • 메서드 1: 함수를 재정의합니다 CWnd::OnSetCursor() . Windows API SetCursor() 함수를 호출하여 포인터를 변경합니다.
  • 방법 2: 원하는 마우스 포인터로 고유한 창 클래스를 등록하고, 함수를 재정의 CWnd::PreCreateWindow() 하고, 새로 등록된 창 클래스를 사용하여 창을 만듭니다.
  • 방법 3: 표준 모래 시계 포인터를 표시하기 위해 애플리케이션은 모래시계를 표시하는 를 호출CCmdTarget::BeginWaitCursor()하고 를 호출하여 기본 포인터로 되돌리기 다시 호출 CmdTarget::EndWaitCursor() 할 수 있습니다. 이 체계는 단일 메시지 기간 동안에만 작동합니다. 를 호출 EndWaitCursor 하기 전에 마우스를 이동하면 Windows에서 포인터 아래의 창으로 메시지를 보냅니 WM_SETCURSOR 다. 이 메시지의 기본 처리는 클래스에 등록된 기본 형식인 포인터를 다시 설정하므로 해당 창에 대해 재정 CWnd::OnSetCursor() 의하고 포인터를 모래 시계로 다시 설정해야 합니다.

다음 코드 샘플에서는 세 가지 메서드를 사용하여 파생 클래스 창의 마우스 포인터를 CView 변경하는 방법을 보여 줍니다.

m_ChangeCursor 는 클래스의 CMyView 멤버 변수이며 형식입니다 BOOL. 다른 포인터 형식을 표시해야 하는지 여부를 나타냅니다.

메서드 1에 대한 코드

함수를 재정의하여 개체의 CMyView 마우스 포인터를 변경합니다 CWnd::OnSetCursor() . 클래스 마법사를 사용하여 Windows 메시지에 WM_SETCURSOR 대한 메시지 맵 함수 CMyView::OnSetCursor() 를 설정하고 다음과 같이 함수 본문을 제공합니다.

BOOL CMyView::OnSetCursor(CWnd *pWnd, UINT nHitTest, UINT message)
{
    if (m_ChangeCursor)
    {
        ::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));
        return TRUE;
    }
    return CView::OnSetCursor(pWnd, nHitTest, message);
}

메서드 2에 대한 코드

또는 AfxRegisterWndClass() 함수를 사용하여 원하는 마우스 포인터를 포함하는 고유한 창 클래스를 AfxRegisterClass() 등록합니다. 그런 다음 등록된 창 클래스에 따라 보기 창을 만듭니다. MFC에서 창 클래스를 등록하는 방법에 대한 자세한 내용은 MFC Tech Note 1의 창 클래스 등록 을 참조하세요.

BOOL CMyView::PreCreateWindow(CREATESTRUCT &cs)
{
    cs.lpszClass = AfxRegisterWndClass(
        CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW, // use any window styles
        AfxGetApp()->LoadStandardCursor(IDC_WAIT),
        (HBRUSH)(COLOR_WINDOW + 1)); // background brush
    return CView::PreCreateWindow(cs)
}

메서드 3에 대한 코드

BeginWaitCursor()EndWaitCursor() 함수를 호출하여 마우스 포인터를 변경합니다.

참고

CWinApp::DoWaitCursor(1)CWinApp::DoWaitCursor(-1) 는 각각 및 와 EndWaitCursor()유사하게 BeginWaitCursor() 작동합니다.

void CMyView::PerformLengthyOperation()
{
    BeginWaitCursor(); // or AfxGetApp()->DoWaitCursor(1)
    //...
    EndWaitCursor(); // or AfxGetApp()->DoWaitCursor(-1)
}

EndWaitCursor() 에 대한 BeginWaitCursor() 호출이 동일한 처리기에 없는 경우 다음과 같이 재정 OnSetCursor 의해야 합니다.

BOOL CMyView::OnSetCursor(CWnd *pWnd, UINT nHitTest, UINT message)
{
    if (m_ChangeCursor)
    {
        RestoreWaitCursor();
        return TRUE;
    }
    return CView::OnSetCursor(pWnd, nHitTest, message);
}

이 예제에서는 를 호출하기 직전에 TRUEBeginWaitCursor()설정하고 m_ChangeCursor 를 호출한 후 FALSEEndWaitCursor()다시 설정합니다.