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 APISetCursor()
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 appelerCmdTarget::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 soitEndWaitCursor
effectué, Windows envoie unWM_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 remplacerCWnd::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()
.