我可以在透明的WinForm上绘制一个面板吗?

时间:2013-12-25 17:26:45

标签: c# winforms drawing transparency

在看到桌面绘图非常混乱之后,我决定只是研究一下。我发现有很多人建议创建一个透明的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();
    }

编辑:经过一些测试后,我注意到随着不透明度的降低,字母的不透明度也会降低,我可以这么做,所以面板是透明的,但我画的内部字符串不是吗?

1 个答案:

答案 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,也可以操作主表单。试试吧。 我的结果如下: result of transparent drawing.