Alterar o ponteiro do mouse para uma janela no MFC usando o Visual C++

Este artigo apresenta como alterar o ponteiro do mouse para uma janela no MFC usando o Visual C++. As informações neste artigo se aplicam apenas ao código do Visual C++ não gerenciado.

Versão original do produto: Visual C++
Número de KB original: 131991

Resumo

Em um aplicativo baseado no Windows, uma janela é sempre criada com base em uma classe de janela. A classe de janela identifica várias características das janelas com base nela, incluindo o ponteiro padrão do mouse (cursor). Em alguns casos, um aplicativo pode querer alterar o ponteiro associado a determinadas janelas que ele cria. Este artigo descreve três métodos que um aplicativo MFC pode usar para exibir ponteiros diferentes em momentos diferentes.

Situações em que os aplicativos MFC exibem ponteiros diferentes

Aqui estão algumas situações em que você pode querer que um aplicativo MFC exiba ponteiros diferentes em momentos diferentes:

  • Quando o ponteiro padrão não é um bom objeto de interface do usuário para um aplicativo específico. Por exemplo, um ponteiro I-beam é mais adequado do que a seta para uma janela do editor de texto no NotePad. Isso pode envolver a alteração do ponteiro para toda a execução do aplicativo.
  • Quando um aplicativo executa uma operação longa, como e/S de disco, um ponteiro de ampulheta é mais apropriado que a seta. Ao alterar o ponteiro para uma ampulheta, você fornece bons comentários visuais para o usuário. Isso pode envolver a alteração do ponteiro por um período limitado de tempo.

Três métodos para alterar o ponteiro do mouse em uma janela

Aqui estão três maneiras pelas quais um aplicativo pode alterar o ponteiro do mouse em uma janela:

  • Método 1: substituir a CWnd::OnSetCursor() função. Chame a função de API SetCursor() do Windows para alterar o ponteiro.
  • Método 2: registre sua própria classe de janela com o ponteiro do mouse desejado, substitua a CWnd::PreCreateWindow() função e use a classe de janela recém-registrada para criar a janela.
  • Método 3: para mostrar o ponteiro de ampulheta padrão, um aplicativo pode chamar o CCmdTarget::BeginWaitCursor(), que exibe a ampulheta e chamar CmdTarget::EndWaitCursor() para reverter de volta para o ponteiro padrão. Esse esquema funciona apenas durante a duração de uma única mensagem. Se o mouse for movido antes que uma chamada seja EndWaitCursor feita, o Windows enviará uma WM_SETCURSOR mensagem para a janela abaixo do ponteiro. O tratamento padrão dessa mensagem redefine o ponteiro para o tipo padrão, aquele registrado com a classe, portanto, você precisa substituir CWnd::OnSetCursor() por essa janela e redefinir o ponteiro de volta para a ampulheta.

Os exemplos de código a seguir mostram por exemplo como alterar o ponteiro do mouse de uma CView janela de classe derivada usando os três métodos.

m_ChangeCursor é uma variável membro da CMyView classe e é do tipo BOOL. Ele indica se um tipo de ponteiro diferente precisa ser exibido.

Código para o método 1

Altere o ponteiro do mouse para o CMyView objeto substituindo a CWnd::OnSetCursor() função. Use o Assistente de Classe para estabelecer a função de mapa de mensagens CMyView::OnSetCursor() para a mensagem WM_SETCURSOR do Windows e forneça o corpo da função da seguinte maneira:

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);
}

Código para o método 2

Registre sua própria classe de janela que contém o ponteiro do mouse desejado usando a AfxRegisterClass() função ou AfxRegisterWndClass() . Em seguida, crie a janela de exibição com base na classe de janela registrada. Para obter mais informações sobre como registrar classes de janela no MFC, consulte Registro de Classe de Janela no 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)
}

Código para o método 3

Chame as BeginWaitCursor() funções e EndWaitCursor() para alterar o ponteiro do mouse.

Observação

CWinApp::DoWaitCursor(1) e CWinApp::DoWaitCursor(-1) funcionam de forma semelhante a BeginWaitCursor() e EndWaitCursor(), respectivamente.

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

Se as chamadas para BeginWaitCursor() e EndWaitCursor() não estiverem no mesmo manipulador, você deverá substituir OnSetCursor da seguinte maneira:

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

Neste exemplo, defina m_ChangeCursor como TRUE pouco antes da chamada para BeginWaitCursor(), e defina-o de volta como FALSE após a chamada como EndWaitCursor().