C # лучший способ смоделировать устройство с экраном и затемнить его - PullRequest
0 голосов
/ 21 октября 2011

Я возился с этим пару месяцев, и я до сих пор не уверен, что я могу сделать, чтобы добиться желания.

Мне нужно создать реальное устройство, то есть, который существует в реальном мире и имеет экран на нем.До сих пор я делал это несколькими различными способами, например, используя панели для имитации слоев и т. Д. Сейчас я в настоящее время создаю каждый элемент управления с помощью кода.

Дело в том, есть ли лучший способнарисовать этот экран?Как я могу затемнить его, сделать его темнее или четче?Я продолжаю получать прозрачный фон за панелями после того, как избавляюсь от них.Есть ли способ убрать этот побочный эффект?

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 21 октября 2011

Наименее инвазивным способом, вероятно, будет черный или серый полупрозрачный оверлей.Просто продолжайте регулировать прозрачность по мере необходимости, пока она не будет выглядеть так, как вы хотите.

Я не знаю, работает ли это или нет, но это должно, по крайней мере, проиллюстрировать технику:

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;
    }
}
1 голос
/ 21 октября 2011

По сути, вы хотите наложение поверх вашей формы.

Проект с открытым исходным кодом ObjectListView реализует аналогичное наложение. Я взломал немного, и это работает.
Вы можете скачать решение по адресу:
https://github.com/hamxiaoz/Misc/tree/master/DimScreen

Постройте решение и перетащите трекбар, чтобы увидеть, что форма затемнена. И вы можете нажать через наложение. Я думаю, это то, что вы хотите.

0 голосов
/ 08 февраля 2013

Я добавил что-то, чтобы сделать его более продуктивным.Вот мой код.

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;
        }
    }
}
...