Partager via


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 du produit d’origine : Visual C++
Numéro de 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 de fenêtre identifie plusieurs caractéristiques des fenêtres en fonction de celle-ci, y compris 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 à différents moments.

Situations où les applications MFC affichent différents pointeurs

Voici quelques situations où vous souhaiterez peut-être qu’une application MFC affiche différents pointeurs à différents moments :

  • Lorsque le pointeur par défaut n’est pas un bon objet d’interface utilisateur pour une application particulière. Par exemple, un pointeur i-beam est plus approprié que la flèche d’une fenêtre d’éditeur de texte dans le Bloc-notes. Cela peut impliquer la modification du pointeur pour l’exécution entière de l’application.
  • Lorsqu’une application effectue une longue opération, telle que les E/S de disque, un pointeur de sablier est plus approprié que la flèche. En modifiant le pointeur en verre, vous fournissez de bons commentaires visuels à 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 pour une application de modifier le pointeur de la souris dans une fenêtre :

  • Méthode 1 : remplacer la CWnd::OnSetCursor() fonction. Appelez la fonction API SetCursor() Windows pour modifier le pointeur.
  • Méthode 2 : inscrivez votre propre classe de fenêtre avec le pointeur de la 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 ne fonctionne que pour la durée d’un seul message. Si la souris est déplacée avant qu’un appel soit EndWaitCursor effectué, Windows envoie un WM_SETCURSOR message à la fenêtre sous le pointeur. La gestion par défaut de ce message réinitialise le pointeur au type par défaut, celui enregistré auprès de la classe. Vous devez donc remplacer CWnd::OnSetCursor() cette fenêtre et réinitialiser le pointeur vers le verre d’heure.

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 CMyView classe et est de type BOOL. Elle indique si un type de pointeur différent 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 fournissez 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 ou AfxRegisterWndClass() de la AfxRegisterClass() fonction. 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 l’inscription de classes de fenêtre dans la note technique 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)
}

Code de la méthode 3

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

Note

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

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

Si les appels vers BeginWaitCursor() et EndWaitCursor() ne se trouvent 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, définissez m_ChangeCursor la valeur TRUE juste avant l’appelBeginWaitCursor(), puis définissez-la sur FALSE après l’appel EndWaitCursor().