Modifier le pointeur de la souris pour une fenêtre dans MFC à l’aide de Visual C++

Cet article explique comment modifier le pointeur de la souris pour une fenêtre dans MFC à l’aide de Visual C++. Les informations contenues dans cet article s’appliquent uniquement au code Visual C++ non managé.

Version d’origine du produit : Visual C++
Numéro de la base de connaissances d’origine : 131991

Résumé

Dans une application Windows, une fenêtre est toujours créée en fonction d’une classe de fenêtre. La classe window identifie plusieurs caractéristiques des fenêtres en fonction de celles-ci, notamment le pointeur de la souris par défaut (curseur). Dans certains cas, une application peut vouloir modifier le pointeur associé à certaines fenêtres qu’elle crée. Cet article décrit trois méthodes qu’une application MFC peut utiliser pour afficher différents pointeurs à des moments différents.

Situations où les applications MFC affichent différents pointeurs

Voici quelques situations dans lesquelles vous pouvez souhaiter qu’une application MFC affiche différents pointeurs à des moments différents :

  • Lorsque le pointeur par défaut n’est pas un bon objet d’interface utilisateur pour une application particulière. Par exemple, un pointeur de faisceau I est plus approprié que la flèche pour une fenêtre d’éditeur de texte dans le Bloc-notes. Cela peut impliquer la modification du pointeur pour l’ensemble de l’exécution de l’application.
  • Lorsqu’une application effectue une opération longue, telle que les E/S disque, un pointeur de sablier est plus approprié que la flèche. En changeant le pointeur en sablier, vous fournissez un bon retour visuel à l’utilisateur. Cela peut impliquer la modification du pointeur pendant une période limitée.

Trois méthodes pour modifier le pointeur de la souris dans une fenêtre

Voici trois façons dont une application peut modifier le pointeur de la souris dans une fenêtre :

  • Méthode 1 : remplacer la CWnd::OnSetCursor() fonction. Appelez la fonction d’API SetCursor() Windows pour modifier le pointeur.
  • Méthode 2 : inscrivez votre propre classe de fenêtre avec le pointeur de souris souhaité, remplacez la CWnd::PreCreateWindow() fonction et utilisez la classe de fenêtre nouvellement inscrite pour créer la fenêtre.
  • Méthode 3 : pour afficher le pointeur de sablier standard, une application peut appeler le CCmdTarget::BeginWaitCursor(), qui affiche le sablier, et appeler CmdTarget::EndWaitCursor() pour revenir au pointeur par défaut. Ce schéma fonctionne uniquement pendant la durée d’un seul message. Si la souris est déplacée avant qu’un appel à EndWaitCursor ne soit effectué, Windows envoie un WM_SETCURSOR message à la fenêtre située sous le pointeur. La gestion par défaut de ce message réinitialise le pointeur au type par défaut, celui inscrit auprès de la classe . Vous devez donc remplacer CWnd::OnSetCursor() pour cette fenêtre et réinitialiser le pointeur vers le sablier.

Les exemples de code suivants montrent par exemple comment modifier le pointeur de la souris d’une CView fenêtre de classe dérivée à l’aide des trois méthodes .

m_ChangeCursor est une variable membre de la CMyView classe et est de type BOOL. Il indique si un autre type de pointeur doit être affiché.

Code de la méthode 1

Modifiez le pointeur de la souris pour l’objet CMyView en remplaçant la CWnd::OnSetCursor() fonction . Utilisez l’Assistant Classe pour établir la fonction CMyView::OnSetCursor() de mappage de messages pour le message WM_SETCURSOR Windows et fournir le corps de la fonction comme suit :

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

Code de la méthode 2

Inscrivez votre propre classe de fenêtre contenant le pointeur de souris souhaité à l’aide de la AfxRegisterClass() fonction ou AfxRegisterWndClass() . Créez ensuite la fenêtre d’affichage en fonction de la classe de fenêtre inscrite. Pour plus d’informations sur l’inscription de classes de fenêtre dans MFC, consultez Inscription de classes de fenêtre dans 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)
}

Code pour la méthode 3

Appelez les BeginWaitCursor() fonctions et EndWaitCursor() pour modifier le pointeur de la souris.

Remarque

CWinApp::DoWaitCursor(1) et CWinApp::DoWaitCursor(-1) fonctionnent de la même façon que BeginWaitCursor() et EndWaitCursor(), respectivement.

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

Si les appels à BeginWaitCursor() et ne EndWaitCursor() sont pas dans le même gestionnaire, vous devez remplacer OnSetCursor comme suit :

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

Dans cet exemple, affectez m_ChangeCursor la valeur TRUE juste avant l’appel à BeginWaitCursor()et rétablissez-la sur FALSE après l’appel à EndWaitCursor().