2010-11-29 16 views
3

私はSDG(Single Display Groupware)アプリケーションを開発しており、そのためには単一のウィンドウに対して複数のカーソル(色の異なるもの)が必要です。私はC#でそれを知るようになっただけで、私の問題を解決しない黒と白のカーソルを使うことができます。だからこの問題で私を助けてください。C#Windowsアプリケーションでのカスタムカラーカーソルの使用

ありがとうございます。

+0

カラーカーソルが正常に動作:次のように

コードがあります。黒と白のカーソルしか使えないことを知りたかったのはどうでしたか? –

+0

Windowsは1つ以上のカーソルを持つことができますか? –

+0

@Tim - C#フォーラムの1つで、デフォルトのCursorクラスを使用すると、黒と白のカーソル(グレースケールのカーソルも使用できません)しか使用できません。 – Himanshu

答えて

10

カーソルクラスはかなり不十分で行われます。不思議な理由のために、従来のCOMインターフェイス(IPicture)を使用しています。そのインターフェイスは、カラーおよびアニメーションカーソルをサポートしていません。それはいくつかのかなり醜い肘グリースで修正可能です:

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); 
} 

使用例:

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

あなたは動的に次のようにファイルからカーソルを読み込むことができます:あなたはそれをロードした後

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

、あなたがこのような任意のコントロールのカーソルを設定することができます。

myControl.Cursor = myCursor; 

は、カーソルも受け付けますストリームをコンストラクタパラメータとして返します。つまり、ファイルシステムからではなく、アプリケーションに埋め込まれたリソースからロードできます。

Windowsでは、複数のカーソルを持つことはできませんが、複数のコントロールをコントロール上に描画することはできます。あなたはそうのようなカーソルオブジェクトのDrawメソッドを使用することができます:あなたは、クライアントの間でカーソル・データを送信するためにTCP/IPを使用している場合、これが動作するために十分であるべき

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

しかし、1台のPCに複数の入力をサポートしているアプリケーションがいくつかあります。 (例えば、Rag Doll Kung Fu)このためには、.NETフレームワークがサポートしていないものがあります。

おそらく、いくつかのUSBコールをPInvokingする必要があります。 (私はここで多くの経験がないので、私は黙示的に表現することはできません)

+0

ありがとうジョン、しかし私は実際にこれを試みたが、それは私のために働かなかったし、私のWindowsアプリケーションの複数のマウスコントロールのために、基本的に私はすべての低レベルのものを処理するSDGToolkitと呼ばれるC#のAPIを使用しています。 – Himanshu

0

私はかつて動的カーソルを作成する必要がありました。これは、特に半透明が黒と混じってカーソルが暗すぎるため、奇妙な問題を引き起こすことが判明しました。最後に、私はSOのコミュニティからいくつかの助けを借りて問題を解決し、ソリューション全体がここに表示されます。

Windows Forms: Making a cursor bitmap partially transparent

2

私はまた別の何かをしようと、別の色のカーソルで動作するようだが、この作品の唯一の問題コードは、マウスカーソルのホットスポット座標が正確でない、すなわち、右にわずかに移動されるということです。しかし、これはコード内のオフセットを考慮することで修正できます。

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; 

     } 
    } 
} 
関連する問題