C#用屏幕模拟设备并调暗它的最佳方法

时间:2011-10-21 19:09:58

标签: c# screen

我已经搞乱了几个月,而且我仍然不确定我能做些什么才能实现想要。

我需要构建一个真实的设备,即存在于现实世界中并且在其上有一个屏幕。到目前为止,我已经通过几种不同的方式完成了它,例如,使用面板来模拟层,等等。现在我正在使用代码构建每个控件。

问题是,有没有更好的方法来绘制这个屏幕? 我该如何调暗它,让它更暗或更清晰? 处理后我在面板后面保持透明背景。有没有办法消除这种鬼影效果?

提前致谢!

3 个答案:

答案 0 :(得分:1)

基本上,您需要一个位于表单顶部的叠加层。

开源项目ObjectListView实现了类似的叠加层。我砍了一点就行了。
您可以在以下位置下载解决方案:
https://github.com/hamxiaoz/Misc/tree/master/DimScreen

构建解决方案并拖动轨迹栏,您可以看到窗体变暗。您可以点击叠加层。我想这就是你想要的。

答案 1 :(得分:1)

侵入性最小的方式可能是黑色或灰色的半透明覆盖层。只需根据需要调整透明度,直到它看起来像你想要的那样。

我不知道这是否有效,但至少应该说明这项技术:

using System;
using System.Drawing;
using System.Windows.Forms;

static class Utils {
    public static Form Plexiglass(Form tocover) {
        var frm = new Form();
        frm.BackColor = Color.DarkGray;
        frm.Opacity = 0.30;
        frm.FormBorderStyle = FormBorderStyle.None;
        frm.ControlBox = false;
        frm.ShowInTaskbar = false;
        frm.StartPosition = FormStartPosition.Manual;
        frm.AutoScaleMode = AutoScaleMode.None;
        frm.Location = tocover.Location;
        frm.Size = tocover.Size;
        frm.Show(tocover);
        return frm;
    }
}

答案 2 :(得分:0)

我添加了一些东西以提高效率。这是我的代码。

using System;
using System.Drawing;
using System.Windows.Forms;

static class Utils
{
    static Form ChildForm;
    public static Form OpenMask(Form tocover)
    {
        Form frm = new Form();
        ChildForm = frm;
        tocover.SizeChanged += AdjustPosition;
        tocover.Move += AdjustPosition;

        //frm.Move += AdjustPosition;
        //frm.SizeChanged += AdjustPosition;
        frm.BackColor = Color.Black;
        frm.Opacity = 0.50;
        frm.FormBorderStyle = FormBorderStyle.None;
        frm.ControlBox = false;
        frm.ShowInTaskbar = false;
        frm.StartPosition = FormStartPosition.Manual;
        frm.AutoScaleMode = AutoScaleMode.None;
        //frm.Location = tocover.Location;
        frm.Location = tocover.PointToScreen(System.Drawing.Point.Empty);
        frm.Size = tocover.ClientSize;
        frm.Show(tocover);
        return frm;
    }

    public static void CloseMask()
    {
        if (ChildForm != null)
        {
            ChildForm.Close();
            ChildForm.Dispose();
        }
    }

    private static void AdjustPosition(object sender, EventArgs e)
    {
        Form parent = sender as Form;
        if (ChildForm != null)
        {
            ChildForm.Location = parent.PointToScreen(System.Drawing.Point.Empty);
            ChildForm.ClientSize = parent.ClientSize;
        }
    }
}