Compartilhar via


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 somente ao código Visual C++ não gerenciado.

Versão original do produto: Visual C++
Número original do KB: 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 do mouse padrão (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 de viga I é mais adequado do que a seta para uma janela do editor de texto no Bloco de Notas. Isso pode envolver a alteração do ponteiro para toda a execução do aplicativo.
  • Quando um aplicativo executa uma operação demorada, como E/S de disco, um ponteiro de ampulheta é mais apropriado do que a seta. Ao alterar o ponteiro para uma ampulheta, você fornece um bom feedback visual ao 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: substitua a CWnd::OnSetCursor() função. Chame a função da 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 para o ponteiro padrão. Esse esquema funciona apenas durante uma única mensagem. Se o mouse for movido antes de uma chamada ser 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() 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. Indica se um tipo de ponteiro diferente precisa ser exibido.

Código para o método 1

Altere o ponteiro do mouse para o objeto substituindo CWnd::OnSetCursor() a CMyView função. Use o Assistente de Classe para estabelecer a função CMyView::OnSetCursor() de mapa de mensagens 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 contendo 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 Nota técnica 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 and 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 como TRUE logo antes da chamada para BeginWaitCursor(), e defina-o novamente como FALSE após a chamada para EndWaitCursor(). m_ChangeCursor