2009-07-11 5 views

Répondre

1

Il est en fait pas envoyé immédiatement après la création, mais peuvent être reçus à tout moment après la création si la fenêtre est une zone non-client défini. Les fenêtres ont deux grandes régions, Client et non-client: la zone non-client est la bordure/marge externe d'une fenêtre et la zone cliente peut être considérée comme le «corps» de la fenêtre. c'est la zone prévue d'une fenêtre où un utilisateur devrait interagir.Bien sûr, parfois d'autres parties feront des contrôles qui n'ont pas de zones non-client et encore affichent leurs propres frontières et d'autres détails

Pour presque tous les contrôles de stock (tout ce qui se trouve dans la bibliothèque de contrôle commune et les autres contrôles basés sur des fenêtres publiés par Microsoft), les zones suivantes sont traitées comme des zones non-client.

  • Captions Légende Détails
  • Menu Système/Réduire/Agrandir/Fermer
  • Frontières

Les messages qui sont préfixées avec NC représentent des événements qui se sont produits dans les zones non-client de la fenêtre. Les messages sans le préfixe se trouvent dans la zone Client.

De toute façon, je suppose que vous avez une fonction qui suit les événements de la souris sur une fenêtre spécifique. S'il est nécessaire de suivre un mouvement sur les zones non-client de la fenêtre (par exemple, pour les opérations de déplacement ou de survol), vous devez ajouter les messages suivants au suivi de votre souris.

  • WM_NCMOUSEMOVE

(position de la souris a été modifiée dans une zone non-client)

  • WM_NCLBUTTONDBLCLK
  • WM_NCLBUTTONDOWN
  • WM_NCLBUTTONUP

(actions bouton gauche dans la zone non-client)

  • WM_NCMBUTTONDBLCLK
  • WM_NCMBUTTONDOWN
  • WM_NCMBUTTONUP

(actions du bouton du milieu dans la zone non-client)

  • WM_NCRBUTTONDBLCLK
  • WM_NCRBUTTONDOWN
  • WM_NCRBUTTONUP

(actions bouton de droite dans la zone non-client)

En outre, en fonction de l'application, les messages suivants peuvent intéresser aussi bien.

  • WM_NCACTIVATE

(activation de la fenêtre a changé par action de l'utilisateur et la zone non-client doit être mis à jour)

  • WM_NCHITTEST

(gestionnaire de fenêtres veut savoir si la zone non-client suit l'activité de la souris)

  • WM_NCPAINT

(zone non-client doit être repeint)

Une astuce utile pour déterminer l'étendue visuelle d'une zone non-client est d'intercepter le message WM_NCPAINT et juste peindre le non zone -client dans une couleur de votre choix (rouge/rose ou une autre couleur qui se démarque). Ceci est utile pour les situations de débogage où vous avez plusieurs fenêtres adjacentes avec des zones non-client qui devraient apparaître transparentes. Enfin, voici un lien qui a un code source de démonstration qui peut valoir la peine d'être examiné pour voir comment fonctionnent les zones non-client.

Customizing the Non-client Area from CodeProject (VB)

+0

Merci pour votre réponse^_^ Mais ce n'est pas très utile pour ma question :( Mon problème est, je crée une fenêtre, et je veux suivre WM_NCMOUSELEAVE pour une raison quelconque, donc j'ai ajouté le gestionnaire WM_NCMOUSELEAVE dans WINPROC Mais j'ai remarqué qu'avant d'appeler TrackMouseEvent() pour suivre WM_NCMOUSELEAVE, mais après la création de la fenêtre, si je déplace le curseur sur la zone non-client, WINPROC recevra une seule fois WM_NCMOUSELEAVE Je ne sais pas pourquoi, alors j'ai posté la question J'ai essayé d'appeler TrackMouseEvent avec TME_CANCEL pour empêcher le message, mais cela ne fonctionne pas Mon système est WINXP avec sp3. – cyberscorpio

+0

Quand m'appellez TrackMouseEvent()? Selon la documentation de MSDN, si la souris ne se trouve pas dans la zone de fenêtre correspondante au moment où elle est appelée, elle publiera le message une seule fois et quittera. Essayez d'ajouter un gestionnaire pour WM_NCMOUSEMOVE à votre WndProc et de configurer votre appel à TrackMouseEvent() s'il n'est pas déjà actif. Une fois que vous avez reçu une notification WM_NCMOUSELEAVE, vous devez l'appeler à nouveau sur le prochain message WM_NCMOUSEMOVE. – meklarian

+0

Voici un lien pour TrackMouseEvent(). http://msdn.microsoft.com/en-us/library/ms646265(VS.85).aspx – meklarian

Questions connexes