【问题标题】:How to draw ellipses in movement?如何在运动中画椭圆?
【发布时间】:2014-10-08 10:05:03
【问题描述】:

我通过自己的 SDK 从外部控制器获取 X 和 Y 坐标。

所以,我想把这个坐标转换成一个半透明的圆圈并模拟鼠标光标。

我有以下代码,但我只能绘制半透明的圆圈,我不能“擦除”以前的圆圈。

我想画半透明的圆圈,当我画下一个圆圈时把它们擦掉。我应该在坐标和以下坐标之间绘制某种过渡来模拟“运动”。 我发现的另一个问题是,我无法在标准组件上画圈,如按钮、文本框等……

//...
System.Drawing.Graphics g = this.CreateGraphics();
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

System.Drawing.Color translucentYellow = System.Drawing.Color.FromArgb(128, Color.Yellow);
System.Drawing.SolidBrush aBrush = new System.Drawing.SolidBrush(translucenYellow);

g.CompositingQuality = system.Drawing.Drawing2D.CompositingQuality.GammaCorrected;

g.FillEllipse(aBrush, X, Y, width, height);
//.….

【问题讨论】:

  • 也许更改实际的鼠标光标以显示该图像会更容易?至于另一个问题:无论你画什么,都应该在 Paint 事件中绘制或触发;这将照顾'旧' paixels。但是在表单上绘图不会在控件上绘图。所以,回到我的第一个建议..
  • @TaW 所以,你建议我把光标移动到这个坐标,改变它的外观,不是吗?
  • 嗯,这真的取决于你的用例。它应该仍然充当光标还是仅在外部移动?在后一种情况下,请寻求 usr 的答案:将面板移动到表单或可能的另一个表单之上..!
  • 真的,这些坐标是从一个凝视控制器得到的,想法是用凝视代替鼠标光标,所以,这应该是一个光标。
  • 在这种情况下,我想我会将光标设置为一个图标并通过代码移动它..

标签: c# .net graphics


【解决方案1】:

当系统为您做得更好时,不要绘制光标。

理想情况下,您需要做的就是:

Cursor = new Cursor("D:\\circle1.cur");

不幸的是,这不适用于许多版本的 cur 文件。准确地说,任何超过 32x32 像素和颜色的东西。

所以你会想要使用更灵活的例程,我找到了on this post,见下文..!

这样使用

Cursor = CreateCursorNoResize(bmp, 16, 16);

并像这样设置光标位置:

Cursor.Position = new Point(yourX, yourY);

每当控制器提出更改时..

这里是一个稍微修改过的例程:

using System.Runtime.InteropServices;
// ..

public struct IconInfo
{
    public bool fIcon;
    public int xHotspot;
    public int yHotspot;
    public IntPtr hbmMask;
    public IntPtr hbmColor;
}
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetIconInfo(IntPtr hIcon, ref IconInfo pIconInfo);
[DllImport("user32.dll")]
public static extern IntPtr CreateIconIndirect(ref IconInfo icon);

public static Cursor CreateCursorNoResize(Bitmap bmp, int xHotSpot, int yHotSpot)
{
    IntPtr ptr = bmp.GetHicon();
    IconInfo tmp = new IconInfo();
    GetIconInfo(ptr, ref tmp);
    tmp.xHotspot = xHotSpot;
    tmp.yHotspot = yHotSpot;
    tmp.fIcon = false;
    ptr = CreateIconIndirect(ref tmp);
    return new Cursor(ptr);
}

注意事项:

  • full code 有更多选择
  • 光标将在具有自己光标的控件(如文本框)上转向不同的控件..

光标在rw-designer:

【讨论】:

  • Cursor = new Cursor("…"); 这次不工作了(图片无效)。所以我想尝试第二个选项,但我不知道我必须将代码放在哪里……在我的表单之外?在同一个命名空间中?提前致谢。
  • 表单中的任何位置。顶部的 using 子句以及其他子句,其余的与您的函数一起使用,我想说.. 澄清:包含的光标不是光标而是 png 文件,因此不应该与光标的构造函数一起使用。我已将 Greenfish 图标编辑器(推荐)中该链接的原始 .cur 文件保存为 png ..
  • 这不是说在动画进行中用户不能使用鼠标吗?
  • 鼠标可以使用,但是如果同时尝试移动它,是的,那就是冲突了;这就是为什么我在第一条评论中询问它的原因。更新多久会发生一次?用户多久干预一次?如果一个事件是罕见的,则可以尝试使用计时器来保护用户移动免受控件的干预..
  • 您需要将其转换为 png 文件。许多工具可以做到这一点。我使用了免费的 Greenfish Icon 编辑器..
【解决方案2】:

为一个简单的控件(例如Panel)绘制一个静态椭圆。将该面板移到屏幕上。这样您就可以控制重叠的其他窗口和控件。您也不必一直重画椭圆。

如果您想与其他窗口或应用程序重叠,您需要将此椭圆绘制成FormTopMost = true。您可以从表单中删除边框。

您也可以为Form 设置透明度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 2022-06-18
    • 1970-01-01
    相关资源
    最近更新 更多