我有一个表格,我使用透明背景,所以我可以在屏幕上显示文本而不隐藏其他应用程序。
基本上我有一个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()函数,控制此绘制的线程一直说”正在运行“,有人知道可能会发生什么?
答案 0 :(得分:2)
以上代码在某些情况下有效,而不是所有时间
它总是“有效”,你只是不完全明白你在做什么。
如果你想在控件上绘图,那么你应该在OnPaint
处理程序(或覆盖)中进行绘制。 Windows由消息循环更新。当窗口获得WM_PAINT
消息时,它会根据其当前的OnPaint
实现(消息处理程序)重绘自身。
您从外部OnPaint
进行绘制,因此当窗口下次更新时,您所做的任何操作都会被覆盖。另外,每次拨打Graphics
时,您都会泄漏CreateGraphics
个对象。
因此,要实现绘图表面,您需要跟踪输入处理程序(KeyDown,MouseDown,MouseUp等)中的输入。您将此上下文信息保存为 data ,然后在OnPaint
处理程序中绘制该数据所代表的内容。
您可以通过调用Invalidate()
来强制刷新控件。这将向其发送WM_PAINT
消息,并且将调用您的OnPaint
处理程序。
进一步阅读: