Вращение курсора по данным повернутого TextBox

У меня есть a TextBox то, что я позволяю моим пользователям вращаться. Но то, что я любил бы в своих пользователей, должно иметь их Cursor вращайтесь к тому же углу что TextBox был повернут в. Например, если они вращались TextBox к 28 °, затем когда Cursor вводит это TextBox Cursor должен также повернуть себя к 28 °.

Любая справка вообще будет значительно цениться.

Спасибо :)

10
задан 14 May 2010 в 15:47
поделиться

2 ответа

Вы можете вращать курсор, используя класс 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.

9
ответ дан 4 December 2019 в 01:55
поделиться

ммм, я не уверен .. ... но поскольку курсором управляет Windows ... Я думаю, вам нужно будет скрыть курсор, когда он входит в текстовое поле, и нарисовать свой собственный (который будет легко повернуть, поскольку вы вращаете другие элементы управления).

Хех, погуглил, как это сделать, первый результат, естественно, был получен из SO, вы можете проверить принятый ответ (если вы используете wpf):

Пользовательский курсор в WPF?

0
ответ дан 4 December 2019 в 01:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: