2010-11-29 13 views
3

Ich entwickle eine SDG (Single Display Groupware) -Anwendung, und dafür brauche ich mehrere Cursor (für die einfachste der verschiedenen Farben) für das einzelne Fenster. Ich habe erfahren, dass Sie mit C# einfach schwarze und weiße Cursor verwenden können, was mein Problem nicht löst. Also bitte hilf mir bei diesem Problem.Verwenden von benutzerdefinierten farbigen Cursors in einer C# Windows-Anwendung

Vielen Dank im Voraus.

+0

Color Cursor funktionieren. Wie sind Sie dazu gekommen, herauszufinden, dass Sie nur schwarze und weiße Cursor verwenden können? –

+0

Und wird Windows mehr als 1 Cursor haben? –

+0

@Tim - Ich lese in einem der C# -Forum, dass Sie mit der Standard-Cursor-Klasse nur schwarz-weiß-Cursor (nicht einmal Graustufen) verwenden können. – Himanshu

Antwort

10

Die Cursor-Klasse ist eher schlecht gemacht. Aus irgendeinem mysteriösen Grund verwendet es eine ältere COM-Schnittstelle (IPicture), diese Schnittstelle unterstützt keine farbigen und animierten Cursor. Es ist fixierbar mit einigem ziemlich hässlich Fett Ellenbogen:

using System; 
using System.ComponentModel; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 
using System.Reflection; 

static class NativeMethods { 
    public static Cursor LoadCustomCursor(string path) { 
     IntPtr hCurs = LoadCursorFromFile(path); 
     if (hCurs == IntPtr.Zero) throw new Win32Exception(); 
     var curs = new Cursor(hCurs); 
     // Note: force the cursor to own the handle so it gets released properly 
     var fi = typeof(Cursor).GetField("ownHandle", BindingFlags.NonPublic | BindingFlags.Instance); 
     fi.SetValue(curs, true); 
     return curs; 
    } 
    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
    private static extern IntPtr LoadCursorFromFile(string path); 
} 

Verwendungsbeispiel:

this.Cursor = NativeMethods.LoadCustomCursor(@"c:\windows\cursors\aero_busy.ani"); 
1

können Sie Cursor laden aus Datei dynamisch wie folgt aus:

var myCursor = new Cursor("myCursor.cur"); 

Nachdem Sie es geladen haben, können Sie den Cursor jeder Kontrolle wie folgt einstellen:

myControl.Cursor = myCursor; 

Der Cursor nimmt auch ein stream als Konstruktorparameter. Dies bedeutet, dass Sie von einer Ressource laden können, die in Ihrer Anwendung eingebettet ist, und nicht vom Dateisystem.

Windows lässt nicht mehr als einen Cursor zu, aber Sie können mehr als einen auf Ihrem Steuerelement zeichnen. Sie können das Cursor-Objekt Draw Methode, wie so verwenden:

myCursor.Draw(g, new Rectangle(...)); 

Wenn Sie TCP/IP mit den Cursor-Daten zwischen Clients senden, dann sollte dies genug sein, um zu arbeiten.

Es gab jedoch einige Anwendungen, die mehrere Eingaben auf einem einzelnen PC unterstützt haben. (Zum Beispiel Rag Doll Kung Fu) Sie suchen nach etwas, das das .NET-Framework nicht unterstützt.

Wahrscheinlich müssen Sie sich einige USB-Anrufe ansehen. (Ich habe hier nicht viel Erfahrung, also kann ich nicht kooperieren.)

+0

Danke John, aber ich habe es tatsächlich versucht, aber es hat nicht funktioniert, und für die mehrfachen Maussteuerungen in meiner Windows-Anwendung verwende ich im Grunde eine C# API namens SDGToolkit, die alle Low-Level-Sachen verarbeitet. – Himanshu

0

Ich musste einmal dynamische Cursor auf dem Sprung erstellen. Dies stellte sich als merkwürdig heraus, zumal sich die Semitransparenz mit Schwarz mischte und die Cursor zu dunkel wurden. Am Ende löste ich das Problem, mit etwas Hilfe von der Gemeinschaft SO und die gesamte Lösung wird hier angezeigt:

Windows Forms: Making a cursor bitmap partially transparent

2

Ich habe auch versucht, etwas anderes und es scheint, mit verschiedenen farbigen Cursor zu arbeiten, aber das einzige Problem mit diesem Stück Code ist, dass die Hotspot-Koordinaten für die Mauscursor nicht exakt sind dh die sind etwas nach rechts verschoben. Dies kann jedoch durch Berücksichtigung eines Offsets im Code behoben werden.

Der Code ist wie folgt:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using System.IO; 
using System.Runtime.InteropServices; 

namespace MID 
{  
    public partial class CustomCursor : Form 
    { 
     [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
     public static extern IntPtr LoadCursorFromFile(string filename); 

     public CustomCursor() 
     { 
      InitializeComponent(); 

      Bitmap bmp = (Bitmap)Bitmap.FromFile("Path of the cursor file saved as .bmp"); 
      bmp.MakeTransparent(Color.Black); 
      IntPtr ptr1 = blue.GetHicon(); 

      Cursor cur = new Cursor(ptr1); 
      this.Cursor = cur; 

     } 
    } 
}