1. 程式人生 > >從FrameworkElement物件建立Cursor物件

從FrameworkElement物件建立Cursor物件

原文: 從FrameworkElement物件建立Cursor物件

 

理論上可以從任何派生自 Visual的物件建立游標物件,但是由於

FrameworkElement擁有 ActualWidth ActualHeight屬性,這就省去了指定游標大小的麻煩。建立過程很簡單,可執行程式碼如下:

public static class CursorHelper

  {

    // 表示每英寸的畫素點數

    private const int DPI = 96;

 

    public static Cursor CreateCursorFromFrameworkElement(FrameworkElement e, Point hotSpot)

{

       // 把介面元素呈現到點陣圖上

      RenderTargetBitmap renderTargetBitmap =

        new RenderTargetBitmap ((int )e.ActualWidth, (int )e.ActualHeight, DPI, DPI, PixelFormats .Pbgra32);

      renderTargetBitmap.Render(e);

 

      PngBitmapEncoder bitmapEncoder = new PngBitmapEncoder ();

      BitmapFrame bitmapFrame = BitmapFrame .Create(renderTargetBitmap);

      bitmapEncoder.Frames.Add(bitmapFrame);

 

      using (var stream = new System.IO.MemoryStream ())

      {

        // 把點陣圖儲存到一個 Stream

        bitmapEncoder.Save(stream);

 

        stream.Seek(0, System.IO.SeekOrigin .Begin);

        System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap (stream);

        // 游標檔案 .cur 檔案其實是基於圖示檔案的( .ico , 所以先將點陣圖轉換為圖示

        IntPtr iconHandle = bitmap.GetHicon();

        System.Drawing.Icon icon = System.Drawing.Icon .FromHandle(iconHandle);

 

        using (System.IO.Stream iconStream = new System.IO.MemoryStream ())

        {

          icon.Save(iconStream);

 

     // 第二個位元組表示該圖形是圖示還是游標, 2 表示游標

           iconStream.Seek(2, System.IO.SeekOrigin .Begin);

          iconStream.WriteByte(2);

     // 第十個位元組處存放熱點座標的 x 座標,熱點就是用來點選螢幕的點,該點的座標就是其在點陣圖中的座標,此處引數用的是相對座標。此處轉換為絕對座標

          iconStream.Seek(10, System.IO.SeekOrigin .Begin);

          iconStream.WriteByte((byte )(int )(e.ActualWidth * hotSpot.X));

<![endif]-->

   // 第十二個位元組處存放熱點座標的 y 座標

          iconStream.Seek(12, System.IO.SeekOrigin .Begin);

          iconStream.WriteByte((byte )(int )(e.ActualHeight * hotSpot.Y));

          iconStream.Seek(0, System.IO.SeekOrigin .Begin);

          return new Cursor (iconStream);

        }

      }

    }