Le plus simple c'est LocationChanged.
Tu créé un timer qui décrémente de 10 à 1 tous les 50ms, et quand il arrive à zéro, tu considère que la fenêtre a cessé de bouger.
Quand LocationChanged se produit :
- si le timer est nul, tu le créé et tu mets le compteur à 10
- si le timer n'est pas nul, tu mets seulement le compteur à 10
- quand le timer arrive à zéro, penser à le détruire correctement
Code :
- // le timer
- Timer _timer = null;
- // le compteur
- int _counter = -1;
- protected override void OnLocationChanged(EventArgs e)
- {
- base.OnLocationChanged (e);
- // si le timer n'est pas encore créé
- if(this._timer == null)
- {
- // créer le timer sur 50 ms
- this._timer = new Timer();
- this._timer.Interval = 50;
- this._timer.Tick += new EventHandler(_timer_Tick);
- this._timer.Start();
- }
- // met le compteur à 10
- this._counter = 10;
- }
- private void _timer_Tick(object sender, EventArgs e)
- {
- // decrémente l compteur
- this._counter--;
- // si le déplacement est arrivé à expiration
- if(this._counter <= 0)
- {
- // on détruit proprement le timer
- this._timer.Stop();
- this._timer.Dispose();
- this._timer = null;
- // et on fait l'appel qui convient
- this.OnWindowStoppedMoving();
- }
- }
|
Si ca ne te convient pas (y'a pas la détection du MouseUp), y'a aussi une solution en jouant avec la WndProc, mais elle ne marchera pas correctement avec les thèmes de Windows XP.
Normallement, on n'est pas sensés toucher aux barres qui entourent les fenêtres, c'est sont géré par le systeme d'exploitation. Si c'est une demande d'un client, tu peux lui refuser, ou bien refuser tout support là dessus.