C#WPF - 大型自定义鼠标光标大小

时间:2017-12-22 17:27:57

标签: c# wpf cursor

我使用的代码我将文本渲染为光标

Here's the website with the code

我复制了以下代码以防万一:

public class CursorHelper
{
    private static class NativeMethods
    {
        public struct IconInfo
        {
            public bool fIcon;
            public int xHotspot;
            public int yHotspot;
            public IntPtr hbmMask;
            public IntPtr hbmColor;
        }

        [DllImport("user32.dll")]
        public static extern SafeIconHandle CreateIconIndirect(ref IconInfo icon);

        [DllImport("user32.dll")]
        public static extern bool DestroyIcon(IntPtr hIcon);

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool GetIconInfo(IntPtr hIcon, ref IconInfo pIconInfo);
    }

    [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)]
    private class SafeIconHandle : SafeHandleZeroOrMinusOneIsInvalid
    {
        public SafeIconHandle()
            : base(true)
        {
        }

        override protected bool ReleaseHandle()
        {
            return NativeMethods.DestroyIcon(handle);
        }
    }

    private static Cursor InternalCreateCursor(System.Drawing.Bitmap bmp)
    {
        var iconInfo = new NativeMethods.IconInfo();
        NativeMethods.GetIconInfo(bmp.GetHicon(), ref iconInfo);

        iconInfo.xHotspot = 0;
        iconInfo.yHotspot = 0;
        iconInfo.fIcon = false;

        SafeIconHandle cursorHandle = NativeMethods.CreateIconIndirect(ref iconInfo);
        return CursorInteropHelper.Create(cursorHandle);
    }

    public static Cursor CreateCursor(string cursorText)
    {
        // Text to render
        FormattedText fmtText = new FormattedText(cursorText,
                new CultureInfo("en-us"),
                FlowDirection.LeftToRight,
                new Typeface(new FontFamily("Arial"), FontStyles.Normal, FontWeights.Normal, new FontStretch()),
                12.0,  // FontSize
                Brushes.Black);

        // The Visual to use as the source of the RenderTargetBitmap.
        DrawingVisual drawingVisual = new DrawingVisual();
        DrawingContext drawingContext = drawingVisual.RenderOpen();
        drawingContext.DrawText(fmtText, new Point());
        drawingContext.Close();

        // The BitmapSource that is rendered with a Visual.
        RenderTargetBitmap rtb = new RenderTargetBitmap(
            (int)drawingVisual.ContentBounds.Width,
            (int)drawingVisual.ContentBounds.Height,
            96,   // dpiX
            96,   // dpiY
            PixelFormats.Pbgra32);
        rtb.Render(drawingVisual);

        // Encoding the RenderBitmapTarget into a bitmap (as PNG)
        PngBitmapEncoder encoder = new PngBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(rtb));

        using (var ms = new MemoryStream())
        {
            encoder.Save(ms);
            using (var bmp = new System.Drawing.Bitmap(ms))
            {
                return InternalCreateCursor(bmp);
            }
        }
    }
}

我遇到的问题是当尺寸太大时,光标无法渲染。从我所看到的情况来看,一旦文本的维度超过96,就会发生这种情况。

这是游标大小的限制吗?有没有办法绕过这个?我知道我可以制作一个画布并渲染一个图像并让它跟随我的鼠标位置或类似的东西,但我对使用WPF Cursor类的实际解决方案感到好奇。

0 个答案:

没有答案