【问题标题】:Rotating Cursor According to Rotated TextBox根据旋转的文本框旋转光标
【发布时间】:2011-02-19 14:24:28
【问题描述】:

我有一个TextBox,我允许我的用户轮换。但我希望我的用户能够让他们的Cursor 旋转到与TextBox 旋转相同的角度。例如,如果他们将 TextBox 旋转到 28°,那么当 Cursor 进入 TextBox 时,Cursor 也应该将自身旋转到 28°。

【问题讨论】:

  • 也许...由于“光标”本身就是一个实际的控件,因此可以像旋转其他控件一样旋转它。嗯,我会试试这个并重新发布。
  • 当您说光标时,您的意思是鼠标光标,即。 I Beam 还是您指的是显示的插入符号,以指示下一个字符将插入/删除的位置等。我只问是因为十个人中我听到了用于暗示两者的光标一词。我假设您的意思是鼠标光标,因为闪烁的插入符号确实会旋转,但我想我还是会问。
  • 我指的是 |梁,:)

标签: c# .net wpf rotation


【解决方案1】:

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

嘿,谷歌搜索一种方法来做到这一点,第一个结果自然来自 SO,你可能想检查接受的答案(如果你使用 wpf):

Custom cursor in WPF?

【讨论】:

  • 谢谢。 :-) 为我节省了很多未来的麻烦和时间,哈哈。
【解决方案2】:

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

这样做的方法是加载图标,将其转换为 BitmapSource,使用 Image 和 RenderTargetBitmap 对其进行旋转,将其转换回 Icon,保存,最后更新字节 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 的代码来完成,也可以通过绑定到 TextBox 旋转的值上的 PropertyChangedCallback 来完成。

【讨论】:

  • @Ray Burns SepehrM 是对的,新版本的框架(我使用的是 4.5)发生了一些变化,你能更新代码吗?
最近更新 更多