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’APISetCursor()
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 appelerCmdTarget::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 unWM_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 remplacerCWnd::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()
.