カーソルファイルをカスタマイズしてプロジェクトに追加するにはどうすればよいですか?



How Customize Add Cursor Files Project



解決:

このようなカーソルを取得するには、カスタムカーソルを取得(または作成)する必要があります。 Windowsにはそのようなカーソルは組み込まれていません。独自のカーソルの作成は、VisualStudioの組み込みを使用して行うことができます アイコンの画像エディタ

独自のカーソルを作成する

  1. を開くことから始めるには[新しいアイテムの追加]ダイアログ。



    新しいアイテムを追加する


  1. 次に、下にスクロールして選択しますカーソルファイル、お好みの名前を付けてください。



    選択する


  1. これで、いわゆる新しいカーソルファイルが開きます。 アイコンの画像エディタ 。これで、鉛筆またはその他のさまざまな描画ツールを使用して描画を開始できます(画像を貼り付けることもできますが、ご覧のとおり、カーソルは最初は1ビットのカラー形式です。つまり、黒と白の2色しかありません。新しい画像タイプを追加することで変更できます)。

    これらの説明を読んでいますか? :)




  1. ここで、を指定する必要があります ホットスポット カーソル用。ホットスポットは、ポインタが実際に配置されている場所を追跡するためにWindowsが使用するアイコン内の位置です(簡単にするために、カーソルのクリックポイントと呼ぶことができます)。通常のWindows7 Aero Arrowのホットスポットは(0、0)(左上隅)にあります。

    カーソルのホットポットを指定するには、ホットスポットツールを設定します。次に、カーソルアイコンのホットスポットとして使用する特定のピクセルをクリックします。このカーソルには(9、8)を選択しました。

    ホットスポットツールを設定する

    ホットスポットを(9、8)に設定する:

    実際のホットスポットの設定


  1. すべてを保存してから、ソリューションエクスプローラーで、プロジェクトを右クリックしてを押しますプロパティ。次に、[リソース]タブをクリックしてクリックしますリソースを追加し、既存のファイルを追加...

    次に、プロジェクトのフォルダーを見つけて、カーソルファイルを選択して開きます。

    新しいリソースを追加する

    カーソルファイルを選択します


  1. コード以外の最後の手順は、カーソルを選択することです。ソリューションエクスプローラー、に移動しますプロパティペインとセットアクションを構築してなし。これは、すでにリソースとして追加されているため、コンパイルされた実行可能ファイルに2回追加されないようにするためです。

    重要: 行う いいえ にあるカーソルファイルに対してこれを行いますリソースフォルダ!

    カーソルのビルドアクションを[なし]に設定します。


アプリケーションでカスタムカーソルを使用する

次に、実際にはかなり単純なコードについて説明します。カーソルがバイト配列リソースとして追加されたので、それをにロードするだけで済みます。次に、MemoryStreamは、そのメモリストリームをのコンストラクタに渡します。カーソルクラス。単純さと読みやすさのために、私はこのコードを別のクラスに入れました。

public static class CursorHelper {public static Cursor FromByteArray(byte [] array){using(MemoryStream memoryStream = new MemoryStream(array)){return new Cursor(memoryStream); }}}

これで、フォーム/コントロールなどでクラスレベルでカーソルを宣言できます。そして、あなたはそれを使用する準備ができています!

プライベートカーソルOpenHand = CursorHelper.FromByteArray(Properties.Resources.CursorOpenHand); public MainWindow(){InitializeComponent(); this.Cursor = OpenHand; }

使用例

私はあなたの仕様に従って例を作りました。マウスを押し続けるとつかむ手に変わる通常の開いた手:

プライベートカーソルOpenHand = CursorHelper.FromByteArray(Properties.Resources.CursorOpenHand); private Cursor GrabbingHand = CursorHelper.FromByteArray(Properties.Resources.CursorGrabbingHand); public MainWindow(){InitializeComponent(); this.Cursor = OpenHand; this.MouseDown + = this.MainWindow_MouseDown; this.MouseUp + = this.MainWindow_MouseUp; } private void MainWindow_MouseDown(object sender、MouseEventArgs e){((Control)sender).Cursor = GrabbingHand; } private void MainWindow_MouseUp(object sender、MouseEventArgs e){((Control)sender).Cursor = OpenHand; }

利益!

カスタムカーソルのアニメーション


使用したカーソルは次のとおりです。

  • http://www.mydoomsite.com/sourcecodes/HandOpen.cur

  • http://www.mydoomsite.com/sourcecodes/HandGrabbing.cur


他の人が述べているように、この形状にはカスタムカーソルが必要です。

私はこのコードを特に誇りに思っていませんが、プロジェクトに新しいリソースがない状況で自分自身を追い詰める必要があったので、これはこの特定のスタンドアロンのカスタムカーソルクリエーターですカーソル。

例として、作成したHandCursorを他のカーソルと同じようにフォームに割り当てることができます。

public Example(){PictureBox box = new PictureBox(); box.Bounds = new Rectangle(10、10、100、100); box.Cursor = HandCursor; box.MouseDown + = Box_MouseDown; box.MouseUp + = Box_MouseUp; box.BorderStyle = BorderStyle.Fixed3D; Controls.Add(box); } void Box_MouseUp(object sender、MouseEventArgs e){((Control)sender).Cursor = HandCursor; } void Box_MouseDown(object sender、MouseEventArgs e){((Control)sender).Cursor = HandGrabCursor; }

そして、これがコードのコアです:

カーソルm_HandCursor = null;カーソルHandCursor {get {if(m_HandCursor == null){m_HandCursor = CursorFromString( 'AAACAAEAICAAABAAFACoEAAAFgAAACgAAAAgAAAAQ {A5} EAI {A62} aBgM3GgYD / xoGA / 8a' + 'BgP / GgYD / xoGA / 8aBgP / G GgYDNxoGA73Ny8r / 39 / f / 93d3f / a2 '+' tr / 2NjY / 9bW1v / V1dX / 09PT / xoGA94 {A6a} BoGAzcaBgO909HR / + Xl5f / j4 + P / 4eHh / 97e '+' 3v / c3Nz / 2tra / 9jY2 / GgYD3hoGAz {A61} aBgM3GgYDvdnX1 // s7Oz / 6urq / + fn5 / '+' / l5eX / 4 + Pj / + Dg4P / e3t7 / 3Nzc / 9ra2v8aBgOHGgYDhw {A5f} BoGA73f3dz / 8 7Ozs / + np6f / n5 + f / 5OTk / + Li4v / g4OD / 3d3d / 7Kurf8aBgPV {A5b} aBgNjGgYDtP '+' n5 + f / IxMP / 9fX1 // Ly8v / w8PD / 7u7u / + vr6 // p6en / 5ub Tk5P / i4uL / 39 / f / xoGA94a '+' BgMw {A50} GgYDNhoGA7rm5OT // Pz8 / 4N5d // + Pj / 9vb2 // T09P / y8vL / 8PDw / + 3t7f / r6 '+' + v / 6Ojo / + bm5v / j4 + P / GgYDhxoGA4c {A50} aBgO66Obl {/ 7} + / v7 / GgYD // v7 + // 6 + vr / + '+' Pj4 // b29v / 09PT / 8vLy / + / v7 // t7e3 / 6urq / + jo6P + 6trX / GgYD1Q {A4f} BoGA // o5uX / 6 '+' Obl / xoGA7oaBgP // v7 + // 39 / f / 7 + / v / + fn5 // j4 + P / 19fX / 8 / Pz / / Hx8f / v7 + // 7Ozs / + r '+' q6v8aBgP / {A50} GgYDuhoGA / 8aBgO6GgYDNhoGA {/ d} 7 + / v / 8 / Pz / + / v7 // n5 + f / 39 / f / 9 '+ 'fX1 // Pz8 // x8 fH / 7u7u / xoGA / 8 {A65} GgYD {/ 17} 9 / f3 // Pz8 // r6 + v / 5 + fn / GgYD // X19 '+' f / y8vL / GgYD / w {A65} aBgP { / c} Pysr {/ b} 8aBgP // f39 // z8 / P8aBgP / + Pj4 // b29v8aBg '+' P / {A60} GgYDMDgmJP {/ b} 4Z7ev {/ b} xoGA {/ 8} v7 + / xoGA / / 7 + / v / + vr6 / xoGA / 8 {A60} a '+' BgOHhnt6 {/ c} QC8t {/ c} GgYD {/ c} GgYD // 7 + / v / 9 / f3 / GgYD / w { A5f} BoGA9XPysr {/ 6} 8 '+' / Kyv8aBgP {/ b} 8aBgP {/ b} 8aBgP {/ 6} 8 / Kyv8aBgO6 {A60} GgYD {/ c} GgYDhxoGA {/ c} xo '+' GA {/ c} xoGA // Pysr / GgYDuhoGAxo {A60} aBgP {/ b} 8aBgOHGgYD {/ c} GgYD {/ 7} Pysr / Gg '+' YD / xoGA7oaBgMa {A65} BoGA7r {/ a} xoGA4caBgP {/ b} 8aBgP / GgYD / xoGA7oaBgM2 {A70} '+' GgYDNhoGA7oaBgO6GgYDNhoGA7r {/ a} xoGA7o {A95} GgYDNhoGA7oaBgO6GgYDNg {A84a} '+' // AD /// gA /// wAH // 4AB // A / 4AAP / + AAD // gAA /// gAP // 4AD // 8AA // '+' / AAP // wAD // 8AA /// AAf // wAf // 8A //// 8P {/ 41} 8 = '); } return m_HandCursor; }}カーソルm_HandGrabCursor = null;カーソルHandGrabCursor {get {if(m_HandGrabCursor == null){m_HandGrabCursor = CursorFromString( 'AAACAAEAICAAABAAFACoEAAAFgAAACgAAAAgAAAAQ {A5} EAI {A62} aBgM3GgYD / xoGA / 8a' + 'BgP / GgYD / xoGA / 8 GgYDNxoGA73Pzc3 / 4eHh / 97e3v / b2 '+' 9v / 2dnZ / 9bW1v / U1NT / 0tLS / xoGA94 {A6a} BoGAzcaBgO919XV / + rq6v / n5 + f / 4 + Pj / + Dg '+' 4P / d3d3 / 29vb / 9 W1tb / GgYD3hoGAz {A61} aBgM3GgYDvd / d3P / y8vL / 7 + / v / + zs7P '+' / p6en / 5ubm / + Pj4 // g4OD / 3d3d / 9ra2v8aBgOHGgYDhw {A5f} BoGA73l4 + '/ 19fX / 8vLy / + / v7 // r6 + v / 6Ojo / + Xl5f / i4uL / 39 / f / 7Ovrv8aBgPV {A5b} aBgNjGgYDtP' + '{/ 5} Nycj / + / v7 // n5 + f / 39 / f / 9PT0 // Hx8f / u7u7 / 6 + vr / + fn5 // k5OT / 4eHh / xoGA94aB '+' gMw {A50} GgYDNhoGA7ro5uX {/ 6} 4Z7ev // + / v7 // f39 // v7 + // 5 + fn / 9vb2 // Pz8 // w8PD / '+' 7e3t / + rq6v / n5 + f / GgYDhxoGA4c {A50} aBgO66Obl {/ c} GgYD {/ d} v7 + // z8 / P / 6 + vr / + P '+' j4 // X19f / y8vL / 7 + / v / + zs7P + 9ubj / GgYD1Q {A4f} BoGA // o5uX / 6Obl / xoGA7oaBgP {/ 1 '+' 7} 7 + / v / 8 / Pz / + vr6 // f39 // 19fX / 8vLy / + / v7 / 8aBgP / {A50} GgYDuhoGA / 8aBgO6GgYDN '+' hoGA {/ 22} 9 / f3 / + / v7 // n5 + f / 39 / f / 9PT0 / xoGA / 8 {A65} GgYD {/ 27} + / v7 / GgYD // v7 + / '+' / 5 + fn / GgYD / w {A65} aBgP {/ b} 8aBgP {/ b} 8aBgP {/ b} 8aBgP // v7 + / 8zIx / 8aBgO6 {A65} '+' BoGA {/ c} xoGA {/ c} xoGA {/ c} xoGA // Pysr / GgYDuhoGAxo {A65} GgYD / 8 / Kyv {/ 6} GgYD {'+' / c} GgYD {/ 7} Pysr / GgYD / xoGA7oaBgMa {A6b} aBgM2GgYDuhoGA / 8aBgO6 {/ a } 8aBgO6Gg '+' YD / xoGA7oaBgM2 {A85} BoGAzYaBgO6GgYDuhoGAzY {Aaf5} // AD /// gA /// wAH // 4AB // + '+' AAf // AAD // gAA // 4AAP // AAD // gAA /// gAP // 4AD // + AA /// gAf // 4Af /// w {/ 57} 8 = '); } return m_HandGrabCursor; }}カーソルCursorFromString(string data){byte [] bits = Convert.FromBase64String(Regex.Replace(data、 '\ {(。)([0-9a-f] +)\}'、delegate(Match m ){return new string(m.Groups [1] .Value [0]、int.Parse(m.Groups [2] .Value、System.Globalization.NumberStyles.HexNumber));}));ビット[2] = 1; using(MemoryStream stream = new MemoryStream(bits)){return new Cursor(stream); #if false //(Icon icon = new Icon(stream)){WinAPI.ICONINFO info = new WinAPI.ICONINFO();を使用したWindowsフォームのバージョンWinAPI.GetIconInfo(icon.Handle、out info); info.fIcon = false; info.xHotspot =ビット[10]; info.yHotspot =ビット[12]; IntPtr hCursor = WinAPI.CreateIconIndirect(ref info);カーソルret = new Cursor(hCursor); retを返します。 } #endif}} static class WinAPI {[DllImport( 'user32.dll')] public static extern bool GetIconInfo(IntPtr hIcon、out ICONINFO piconinfo); [DllImport( 'user32.dll')] public static extern IntPtr CreateIconIndirect(ref ICONINFO piconinfo); [StructLayout(LayoutKind.Sequential)] public struct ICONINFO {public bool fIcon; public Int32 xHotspot; public Int32 yHotspot; public IntPtr hbmMask; public IntPtr hbmColor; }}