/// <summary>
/// This class allow you create a Cursor form a Bitmap
/// </summary>
internal class BitmapCursor : SafeHandle
{
public override bool IsInvalid
{
get
{
return handle == (IntPtr)(-1);
}
}
public static Cursor CreateBmpCursor(Bitmap cursorBitmap)
{
var c = new BitmapCursor(cursorBitmap);
return CursorInteropHelper.Create(c);
}
public static Bitmap BitmapSourceToBitmap(BitmapSource source)
{
using (var stream = new MemoryStream())
{
var e = new BmpBitmapEncoder();
e.Frames.Add(BitmapFrame.Create(source));
e.Save(stream);
var bmp = new Bitmap(stream);
return bmp;
}
}
protected BitmapCursor(Bitmap cursorBitmap)
: base((IntPtr)(-1), true)
{
handle = cursorBitmap.GetHicon();
}
protected override bool ReleaseHandle()
{
bool result = DestroyIcon(handle);
handle = (IntPtr)(-1);
return result;
}
private static Cursor CreateMyCursor()
{
const int w = 25;
const int h = 25;
const int f = 4;
var bmp = new Bitmap(w, h);
Graphics g = Graphics.FromImage(bmp);
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
var pen = new Pen(Brushes.Black, 2.0F);
g.DrawEllipse(pen, new Rectangle(f, f, w - 2 * f, w - 2 * f));
g.Flush();
g.Dispose();
pen.Dispose();
return BitmapCursor.CreateBmpCursor(bmp);
}
[DllImport("user32")]
private static extern bool DestroyIcon(IntPtr hIcon);
}
WPF 中每个光标通过一个System.Windows.Input.Cursor表示,获取Cursor对象的最简单方法是使用Cursor类(位于System.Windows.Input名称空间)的静态属性。
如:
this.Cursor=Cursors.wait; 或<Button Cursor="wait">help</Button>
但是有一个例外,通过使用ForceCursor属性,父元素会覆盖子元素的光标位置,当把该属性设置为true时,会忽略子元素的Cursor属性,并且父元素的光标会被应用到内部的所有内容。
为了移除应用程序范围的光标覆盖设置,需要将Mouse.OverrideCursor属性设置为null。
所有评论(0)