根据旋转的文本框旋转光标

9
我有一个TextBox,允许用户旋转。但是我希望我的用户在旋转TextBox时,他们的Cursor也能旋转到相同的角度。例如,如果用户将TextBox旋转28度,则当Cursor进入该TextBox时,Cursor也应自动旋转到28度。

也许...由于“光标”本身就是一个实际的控件,它可以像我旋转其他控件一样旋转。嗯,我会尝试这样做并重新发布。 - anon271334
当你说“光标”时,你是指鼠标光标,即I型光标,还是指显示插入/删除下一个字符的符号(插入符)?我之所以问这个问题,是因为我经常听到“光标”一词被用来暗示两者。我猜你是指鼠标光标,因为闪烁的插入符会旋转,但我还是想问一下。 - Chris Taylor
我正在提到 | Beam, :) - anon271334
2个回答

9

您可以使用WinForms中的System.Drawing.Icon类和WPF的位图旋转功能来旋转光标。

具体操作是:加载图标,将其转换为BitmapSource,使用Image和RenderTargetBitmap对其进行旋转,再将其转换回Icon,保存后更新使其成为.cur而非.ico的2、10和11字节。

以下是代码示例:

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);
}

如果你想避免循环,你可以用一小段不安全的代码来替换它,调用带有初始化数据的System.Drawing.Bitmap构造函数:

  fixed(int* bits = pixels)
  {
    resultBitmap = new System.Drawing.Bitmap(width, height, width, System.Drawing.Imaging.PixelFormat.Format32bppPargb, new IntPtr(bits));
  }

每次您的文本框旋转时,都需要调用此方法。这可以通过旋转文本框的代码或绑定到文本框的旋转值的 PropertyChangedCallback 完成。


@Ray Burns SepehrM 是对的,新版本框架中有些变化(我正在使用4.5),您能否更新一下代码? - Mauro Sampietro

0

嗯,我不太确定...但是由于光标是由Windows管理的...我猜当光标进入文本框时,您需要隐藏光标并绘制自己的光标(由于您正在旋转其他控件,这将很容易旋转)。

呵呵,搜索这个问题的方法,第一个结果自然是来自SO,如果您使用wpf,您可能要检查接受的答案:

在WPF中自定义光标?


谢谢你。:-) 省了我很多未来的麻烦和时间,哈哈。 - anon271334

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接