57 votes

Cursor.Current vs. this.Cursor

Est-il une différence entre Cursor.Current et this.Cursor (où this est un WinForm).Net? J'ai toujours utilisé l' this.Cursor et avons eu une très bonne chance avec elle, mais j'ai récemment commencé à utiliser CodeRush et juste incorporé un peu de code dans un "Curseur d'Attente" de bloc et CodeRush utilisé l' Cursor.Current de la propriété. J'ai vu sur Internet et au travail, où d'autres programmeurs ont eu quelques problèmes avec l' Cursor.Current de la propriété. Il m'a appris à me demander si il y a une différence entre les deux. Merci à l'avance.

J'ai fait un petit test. J'ai deux winforms. Je clique sur un bouton à form1, définissez l' Cursor.Current de la propriété d' Cursors.WaitCursor et de montrer ensuite form2. Le curseur ne change pas sur le formulaire. Il reste Cursors.Default (pointeur) curseur.

Si j'ai mis en this.Cursor de Cursors.WaitCursor dans l'événement click du bouton à form1 et de montrer form2, le curseur d'attente affiche uniquement sur form1 et le curseur par défaut est sur form2 qui est prévu. Donc, je ne sais toujours pas ce qu' Cursor.Current .

90voto

Hans Passant Points 475940

Windows envoie la fenêtre qui contient le curseur de la souris au message WM_SETCURSOR, lui donnant la possibilité de changer la forme du curseur. Un contrôle de zone de texte prend avantage de cette, de changer le curseur en I-bar. Le Contrôle.Curseur de la propriété détermine quelle forme sera utilisée.

Le Curseur.Immobilier actuel modifications de la forme directement, sans attendre une WM_SETCURSOR réponse. Dans la plupart des cas, cette forme est peu susceptible de survivre longtemps. Dès que l'utilisateur déplace la souris, WM_SETCURSOR le modifie à Contrôler.Le curseur.

Le UseWaitCursor propriété a été ajoutée .NET 2.0 pour faciliter l'affichage de la forme d'un sablier. Malheureusement, il ne fonctionne pas très bien. Il requiert un message WM_SETCURSOR à modifier la forme et qui ne se produit pas lorsque vous définissez cette propriété sur true, puis faire quelque chose qui prend un certain temps. Essayez ce code par exemple:

private void button1_Click(object sender, EventArgs e) {
  this.UseWaitCursor = true;
  System.Threading.Thread.Sleep(3000);
  this.UseWaitCursor = false;
}

Le curseur ne change jamais. Pour frapper que dans la forme, vous aurez besoin d'utiliser le Curseur.Aussi bien. Voici une petite classe d'aide pour le rendre facile:

using System;
using System.Windows.Forms;

public class HourGlass : IDisposable {
  public HourGlass() {
    Enabled = true;
  }
  public void Dispose() {
    Enabled = false;
  }
  public static bool Enabled {
    get { return Application.UseWaitCursor; }
    set {
      if (value == Application.UseWaitCursor) return;
      Application.UseWaitCursor = value;
      Form f = Form.ActiveForm;
      if (f != null && f.Handle != IntPtr.Zero)   // Send WM_SETCURSOR
        SendMessage(f.Handle, 0x20, f.Handle, (IntPtr)1);
    }
  }
  [System.Runtime.InteropServices.DllImport("user32.dll")]
  private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
}

Et de l'utiliser comme ceci:

private void button1_Click(object sender, EventArgs e) {
  using (new HourGlass()) {
    System.Threading.Thread.Sleep(3000);
  }
}

11voto

James Curran Points 55356

Je crois que Cursor.Current est le curseur de la souris actuellement utilisé (quel que soit son emplacement à l'écran), alors que this.Cursor est le curseur sur lequel il sera placé, lorsque la souris passera sur votre fenêtre.

6voto

Joel Coehoorn Points 190579

this.Cursor est le curseur qui sera utilisé lorsque la souris survolera la fenêtre référencée par this . Cursor.Current est le curseur de la souris actuel, qui peut être différent de this.Cursor si la souris survole une autre fenêtre.

6voto

Valdis Iljuconoks Points 394

En fait, si vous souhaitez utiliser HourGlass à partir d’un autre thread qui vous restitue une exception d’analyse croisée car vous essayez d’accéder à f.Handle à partir d’un autre thread que celui qui a été créé à l'origine du formulaire. Utilisez GetForegroundWindow () à la place de user32.dll.

 [DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();
 

et alors

 public static bool Enabled
{
    get
    {
        return Application.UseWaitCursor;
    }

    set
    {
        if (value == Application.UseWaitCursor)
        {
            return;
        }

        Application.UseWaitCursor = value;
        var handle = GetForegroundWindow();
        SendMessage(handle, 0x20, handle, (IntPtr)1);
    }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X