以C#形式绘制线条/矩形

时间:2013-08-01 19:55:35

标签: c# .net winforms

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

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

this.Controls.Add(newLabel);

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

我在互联网上看到了一些例子,但是所有这些例子都需要Paint()事件来使用Graphics等,并且添加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()函数,控制此绘制的线程一直说”正在运行“,有人知道可能会发生什么?

1 个答案:

答案 0 :(得分:2)

  

以上代码在某些情况下有效,而不是所有时间

它总是“有效”,你只是不完全明白你在做什么。

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

您从外部OnPaint进行绘制,因此当窗口下次更新时,您所做的任何操作都会被覆盖。另外,每次拨打Graphics时,您都会泄漏CreateGraphics个对象。

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

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

进一步阅读: