У меня есть a TextBox
то, что я позволяю моим пользователям вращаться. Но то, что я любил бы в своих пользователей, должно иметь их Cursor
вращайтесь к тому же углу что TextBox
был повернут в. Например, если они вращались TextBox
к 28 °, затем когда Cursor
вводит это TextBox
Cursor
должен также повернуть себя к 28 °.
Любая справка вообще будет значительно цениться.
Спасибо :)
Вы можете вращать курсор, используя класс System.Drawing.Icon из WinForms в сочетании с возможностью вращения растровых изображений в WPF.
Для этого нужно загрузить значок, преобразовать его в BitmapSource, использовать Image и RenderTargetBitmap для поворота, преобразовать его обратно в значок, сохранить его и, наконец, обновить байты 2, 10 и 11, которые делают его .cur вместо .ico.
Вот как выглядит код:
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);
}
Если вы хотите избежать цикла, вы можете заменить его небольшим кусочком usafe кода для вызова конструктора System.Drawing.Bitmap, который принимает данные инициализации:
fixed(int* bits = pixels)
{
resultBitmap = new System.Drawing.Bitmap(width, height, width, System.Drawing.Imaging.PixelFormat.Format32bppPargb, new IntPtr(bits));
}
Вам нужно будет вызывать его каждый раз, когда вращение TextBox меняется. Это можно сделать либо из кода, который вращает TextBox, либо из PropertyChangedCallback на значение, которое связано с вращением TextBox.
ммм, я не уверен .. ... но поскольку курсором управляет Windows ... Я думаю, вам нужно будет скрыть курсор, когда он входит в текстовое поле, и нарисовать свой собственный (который будет легко повернуть, поскольку вы вращаете другие элементы управления).
Хех, погуглил, как это сделать, первый результат, естественно, был получен из SO, вы можете проверить принятый ответ (если вы используете wpf):