Cambiar el puntero del mouse para una ventana de MFC mediante Visual C++

En este artículo se explica cómo cambiar el puntero del mouse para una ventana en MFC mediante Visual C++. La información de este artículo solo se aplica a código no administrado de Visual C++.

Versión del producto original:   Visual C++
Número de KB original:   131991

Resumen

En una aplicación basada en Windows, siempre se crea una ventana basada en una clase de ventana. La clase Window identifica varias características de las ventanas basadas en ella, incluido el puntero del mouse (cursor) predeterminado. En algunos casos, es posible que una aplicación quiera cambiar el puntero asociado a determinadas ventanas que crea. En este artículo se describen tres métodos que una aplicación MFC puede usar para mostrar diferentes punteros en diferentes momentos.

Situaciones en las que las aplicaciones MFC muestran punteros diferentes

Estas son algunas situaciones en las que es posible que desee que una aplicación MFC muestre distintos punteros en momentos diferentes:

  • Cuando el puntero predeterminado no es un buen objeto de interfaz de usuario para una aplicación determinada. Por ejemplo, un puntero en I es más adecuado que la flecha para una ventana del editor de texto en el Bloc de notas. Esto puede implicar cambiar el puntero para toda la ejecución de la aplicación.
  • Cuando una aplicación realiza una operación prolongada, como e/s de disco, un puntero de reloj de arena es más apropiado que la flecha. Al cambiar el puntero a un reloj de arena, proporciona al usuario buenos comentarios visuales. Esto puede implicar cambiar el puntero durante un período de tiempo limitado.

Tres métodos para cambiar el puntero del mouse en una ventana

A continuación se muestran tres formas en las que una aplicación puede cambiar el puntero del mouse en una ventana:

  • Método 1: reemplazar la CWnd::OnSetCursor() función. Llamar SetCursor() a la función de la API de Windows para cambiar el puntero.
  • Método 2: Registre su propia clase de ventana con el puntero del mouse deseado, reemplace la CWnd::PreCreateWindow() función y use la clase de ventana recién registrada para crear la ventana.
  • Método 3: para mostrar el puntero del reloj de arena estándar, una aplicación puede llamar al CCmdTarget::BeginWaitCursor() , que muestra el reloj de arena y llamar CmdTarget::EndWaitCursor() a para volver al puntero predeterminado. Este esquema sólo funciona mientras dure un solo mensaje. Si el mouse se mueve antes de que EndWaitCursor se realice una llamada, Windows envía un WM_SETCURSOR mensaje a la ventana situada debajo del puntero. El control predeterminado de este mensaje restablece el puntero al tipo predeterminado, el registrado con la clase, por lo que debe invalidarlo CWnd::OnSetCursor() para esa ventana y restablecer el puntero de nuevo al reloj de arena.

En los ejemplos de código siguientes se muestra cómo cambiar el puntero del mouse de una CView ventana de clase derivada mediante los tres métodos.

m_ChangeCursores una variable miembro de CMyView clase y es de tipo BOOL . Indica si es necesario mostrar un tipo de puntero diferente.

Código para el método 1

Cambiar el puntero del mouse por el CMyView objeto reemplazando la CWnd::OnSetCursor() función. Use el Asistente para clases para establecer la función CMyView::OnSetCursor() de mapa de mensajes de Windows Message WM_SETCURSOR y proporcione el cuerpo de la función de la siguiente manera:

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 el método 2

Registre su propia clase de ventana que contenga el puntero del mouse (ratón) deseado mediante la AfxRegisterClass() AfxRegisterWndClass() función or. A continuación, cree la ventana de vista basada en la clase de ventana registrada. Para obtener más información sobre el registro de clases de ventana en MFC, vea registro de clases de ventanas en la nota técnica de MFC 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 el método 3

Llamar BeginWaitCursor() a las EndWaitCursor() funciones y para cambiar el puntero del mouse.

Nota

CWinApp::DoWaitCursor(1)y CWinApp::DoWaitCursor(-1) funcionan de manera similar a BeginWaitCursor() y EndWaitCursor() , respectivamente.

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

Si las llamadas a BeginWaitCursor() y EndWaitCursor() no están en el mismo controlador, debe invalidar OnSetCursor lo siguiente:

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

En este ejemplo, m_ChangeCursor se establece en true justo antes de la llamada a BeginWaitCursor() y la vuelve a establecer en false después de la llamada a EndWaitCursor() .