在看到桌面绘图非常混乱之后,我决定只是研究一下。我发现有很多人建议创建一个透明的WinForm,它的大小与屏幕大小相同,然后使用它来绘制图形。所以我测试了它但遇到了很多错误。起初,我的第二个表单(Form2)不会显示,所以我不得不把它放到另一个线程中并将Form2.ShowDialog();
放在该线程上。在我解决了这个问题之后,我实际上已经进入了面板。现在我的表单永远不会显示,但我可以看到它在我的任务栏上运行。每当我尝试将其作为聚焦窗口时,它就永远不会起作用,每当我悬停任务时,我都可以看到正在创建的图形。我的问题是,是否可以在透明的WinForm上绘制一个面板并使其可见?这是我使用的代码,它主要用于查找错误(绘制状态和内容)。
void Draw()
{
while (true)
{
SolidBrush redpen = new SolidBrush(Color.Red);
Font font = new Font("Arial", 16);
PointF point = new PointF(700, 150);
Graphics g = panel1.CreateGraphics();
g.DrawString(Main.state.ToString(), font, redpen, point);
Main.beginTime.Stop();
Main.TimeRan = Main.beginTime.Elapsed;
string amountOfTime = string.Format("{0:00}:{1:00}:{2:00}.{3:00}", Main.TimeRan.Hours, Main.TimeRan.Minutes, Main.TimeRan.Seconds, Main.TimeRan.Milliseconds / 10);
point = new PointF(700, 200);
g.DrawString(amountOfTime, font, redpen, point);
Thread.Sleep(10);
panel1.Refresh();
}
}
private void Form2_Shown(object sender, EventArgs e)
{
Draw();
}
我班主任的某个地方
// In a method
Thread F2T = new Thread(FormHandlers);
F2T.Start();
private void FormHandlers()
{
Form2 Form2 = new Form2();
Form2.Opacity = 0.00;
Form2.ShowDialog();
}
编辑:经过一些测试后,我注意到随着不透明度的降低,字母的不透明度也会降低,我可以这么做,所以面板是透明的,但我画的内部字符串不是吗?
答案 0 :(得分:4)
我想你想在透明的子表单上绘制一条消息?如果是这样,我认为你可以这样做:因为form.Opacity =0.00
使其中的所有控件都是透明的,所以我们看不到任何东西。另一种方式,我们使用form.TransparencyKey
来获得它。像这样的代码:
public Form2()
{
InitializeComponent();
//hide the border of form
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.BackColor = Color.White;
//set the TransparencyKey the same as the back color
this.TransparencyKey = this.BackColor;
}
protected override void OnPaint(PaintEventArgs e)
{
SolidBrush redpen = new SolidBrush(Color.Red);
Font font = new Font("Arial", 16);
PointF point = new PointF(400, 150);
Graphics g = e.Graphics;
string state = "running";
g.DrawString(state, font, redpen, point);
string amountOfTime = string.Format("{0:00}:{1:00}:{2:00}.{3:00}", 1, 2, 3, 11111 / 10);
PointF point2 = new PointF(500, 150);
g.DrawString(amountOfTime, font, redpen, point2);
//base.OnPaint(e);
}
顺便提一下,您希望以子代码形式显示消息,我不喜欢使用多线程,您只需调用Show()
中的Form2而不是ShowDialog()
中的Form2,并且设置Form2.TopMost=True
,也可以操作主表单。试试吧。
我的结果如下: