C # лучший способ смоделировать устройство с экраном и затемнить его

#c# #screen

#c# #экран

Вопрос:

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

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

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

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

Ответ №1:

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

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

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

Комментарии:

1. Разве это не мой ответ, только что расширенный??

2. Конечно, концепция та же, но я думаю, что самое важное — это как ее реализовать (параметры создания сообщений Windows / окна / pinvoke и т. Д.)

Ответ №2:

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

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

 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. другое дело … у него есть сенсорный экран, так что это должно быть доступно по щелчку мыши…

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

Ответ №3:

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

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