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