從FrameworkElement物件建立Cursor物件
理論上可以從任何派生自 Visual的物件建立游標物件,但是由於
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);
}
}
}