Bạn có thể xoay của bạn con trỏ bằng cách sử dụng lớp System.Drawing.Icon từ WinForms kết hợp với khả năng xoay bitmap của WPF.
Cách để thực hiện việc này là tải biểu tượng, chuyển đổi nó sang BitmapSource, sử dụng hình ảnh và RenderTargetBitmap để xoay nó, chuyển đổi nó trở lại biểu tượng, lưu và cuối cùng cập nhật byte 2, 10 và 11 làm cho nó một .cur thay vì một .ico.
Đây là những gì mã trông giống như:
public Cursor GetRotatedCursor(byte[] curFileBytes, double rotationAngle)
{
// Load as Bitmap, convert to BitmapSource
var origStream = new MemoryStream(curFileBytes);
var origBitmap = new System.Drawing.Icon(origStream).ToBitmap();
var origSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(origBitmap.GetHBitmap());
// Construct rotated image
var image = new Image
{
BitmapSource = origSource,
RenderTransform = new RotateTransform(rotationAngle)
};
// Render rotated image to RenderTargetBitmap
var width = origBitmap.Width;
var height = origBitmap.Height;
var resultSource = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
resultSource.Render(image);
// Convert to System.Drawing.Bitmap
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]));
// Save to .ico format
var resultStream = new MemoryStream();
new System.Drawing.Icon(resultBitmap.GetHIcon()).Save(resultStream);
// Convert saved file into .cur format
resultStream.Seek(2); resultStream.WriteByte(curFileBytes, 2, 1);
resultStream.Seek(10); resultStream.WriteByte(curFileBytes, 10, 2);
resultStream.Seek(0);
// Construct Cursor
return new Cursor(resultStream);
}
Nếu bạn muốn tránh các vòng lặp, bạn có thể thay thế nó bằng một đoạn mã nhỏ usafe để gọi constructor System.Drawing.Bitmap mà mất dữ liệu khởi tạo :
fixed(int* bits = pixels)
{
resultBitmap = new System.Drawing.Bitmap(width, height, width, System.Drawing.Imaging.PixelFormat.Format32bppPargb, new IntPtr(bits));
}
Bạn sẽ cần phải gọi điều này mỗi lần xoay hộp văn bản của bạn thay đổi. Điều này có thể được thực hiện hoặc từ mã quay TextBox của bạn, hoặc từ một PropertyChangedCallback trên một giá trị được ràng buộc để xoay TextBox.
Có thể ... Vì "Con trỏ" là chính nó là một Điều khiển thực, nó có thể được xoay giống như cách tôi xoay các Điều khiển khác của mình. Hừm, tôi sẽ thử cái này và đăng lại. –
Nup ... Không hoạt động! Argh! –
Khi bạn nói Cursor bạn có nghĩa là con trỏ chuột tức là. Tôi Beam hoặc bạn đang đề cập đến Caret được hiển thị để chỉ ra nơi nhân vật tiếp theo sẽ được chèn vào/xóa, vv Tôi chỉ hỏi vì tôi mười nghe con trỏ từ được sử dụng để hàm ý cả hai. Tôi giả sử bạn có nghĩa là con trỏ chuột vì dấu nháy mắt không xoay, nhưng tôi nghĩ sẽ hỏi. –