0

我有一个使用透明背景的表单,这样我就可以在屏幕上显示文本而不隐藏其他应用程序。

基本上我有一个 Form 的实例,我在其中设置透明颜色等,然后​​我有一个函数 addtext("Hello World", X, Y) 在其中创建一个 Label 对象,设置设置并添加到此表单控件。

this.Controls.Add(newLabel);

好吧,现在我需要创建一些东西来添加一个 retangle,以便人们可以在屏幕上“绘制”东西,所以我需要类似于 Label 对象的东西。

我在互联网上看到了一些示例,但所有示例都需要 Paint() 事件才能使用图形等,并添加 LAbel 它不需要这样的所有内容。

我尝试使用该事件并尝试调用 Graphic 属性等,但没有奏效。

以下是我进行的一些测试:

private class Line : Control
        {
            public float FromX { get; set; }
            public float FromY { get; set; }
            public float ToX { get; set; }
            public float ToY { get; set; }
            public Pen PenColor { get; set; }

            public Line() { }
        }

Graphics g = this.CreateGraphics();
Line line = (Line)cc;
g.DrawRectangle(line.PenColor, line.FromX, line.FromY, line.ToX, line.ToY);

编辑:上面的代码在某些情况下有效,不是一直有效,如果我尝试调试代码,有时在执行 g.DrawRect~ 之后它不会移动到下一行,看起来它是“永远执行” g .DrawRectangle() 函数,控制此绘制的线程一直在说“正在运行”,有人知道会发生什么吗?

4

1 回答 1

2

上面的代码在某些情况下有效,而不是一直有效

它总是“有效”,您只是不完全了解自己在做什么。

如果您想在控件上绘图,那么您应该从OnPaint处理程序(或覆盖)中进行。Windows 由消息循环更新。当窗口收到WM_PAINT消息时,它会根据当前的OnPaint实现(消息处理程序)重新绘制自己。

您从外部对其进行绘制OnPaint,因此您所做的任何事情都会在下次窗口更新时被覆盖。附带说明一下,Graphics每次调用CreateGraphics.

因此,要实现绘图表面,您需要在输入处理程序(KeyDown、MouseDown、MouseUp 等)中跟踪输入。您将此上下文信息保存为数据,然后在OnPaint处理程序中绘制该数据表示的内容。

您可以通过调用它来强制刷新控件Invalidate()。这将向它发送一条WM_PAINT消息,并且您的OnPaint处理程序将被调用。

进一步阅读:

于 2013-08-01T21:51:16.927 回答