您可以使用WinForms中的System.Drawing.Icon类和WPF的位图旋转功能来旋转光标。
具体操作是:加载图标,将其转换为BitmapSource,使用Image和RenderTargetBitmap对其进行旋转,再将其转换回Icon,保存后更新使其成为.cur而非.ico的2、10和11字节。
以下是代码示例:
public Cursor GetRotatedCursor(byte[] curFileBytes, double rotationAngle)
;
var width = origBitmap.Width;
var height = origBitmap.Height;
var resultSource = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
resultSource.Render(image);
var pixels = new int[width*height];
resultSource.CopyPixels(pixels, width, 0);
var resultBitmap = new System.Drawing.Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppPargb);
for(int y=0; y<height; y++)
for(int x=0; x<width; x++)
resultBitmap.SetPixel(x, y, Color.FromArgb(pixels[y*width+x]));
var resultStream = new MemoryStream();
new System.Drawing.Icon(resultBitmap.GetHIcon()).Save(resultStream);
resultStream.Seek(2); resultStream.WriteByte(curFileBytes, 2, 1);
resultStream.Seek(10); resultStream.WriteByte(curFileBytes, 10, 2);
resultStream.Seek(0);
return new Cursor(resultStream);
}
如果你想避免循环,你可以用一小段不安全的代码来替换它,调用带有初始化数据的System.Drawing.Bitmap构造函数:
fixed(int* bits = pixels)
{
resultBitmap = new System.Drawing.Bitmap(width, height, width, System.Drawing.Imaging.PixelFormat.Format32bppPargb, new IntPtr(bits));
}
每次您的文本框旋转时,都需要调用此方法。这可以通过旋转文本框的代码或绑定到文本框的旋转值的 PropertyChangedCallback 完成。