Развернуть форму на обоих экранах (двойной экран монитора)
Я ищу какой-нибудь намек или решение относительно следующей проблемы.
У меня есть.NET 2.0 WinForm диалог, который работает в среде двойного экрана. Рабочая область устанавливается.NET Framework для отображения основного экрана. Я хочу максимизировать форму на оба экрана, но после нажатия "кнопки максимизации" диалоговое окно разворачивается только на "активный" экран (я имею в виду активный экран, на котором диалоговое окно в данный момент размещено).
Меня не интересует решение границ, это работает, но при нажатии кнопки "Развернуть" диалоговое окно возвращается на один из двух экранов.
Буду признателен за любую помощь или намеки.
6 ответов
Это может быть поздно, но вот простой способ сделать это. Это устанавливает размер формы от получения размера разрешения. затем он размещает форму так, чтобы ее можно было увидеть.
int screenLeft = SystemInformation.VirtualScreen.Left;
int screenTop = SystemInformation.VirtualScreen.Top;
int screenWidth = SystemInformation.VirtualScreen.Width;
int screenHeight = SystemInformation.VirtualScreen.Height;
this.Size = new System.Drawing.Size(screenWidth, screenHeight);
this.Location = new System.Drawing.Point(screenLeft, screenTop);
Объедините 2 размера экрана и установите форму в этом разрешении. Что-то вроде:
int height = 0;
int width = 0;
foreach (screen in System.Windows.Forms.Screen.AllScreens)
{
//take smallest height
height = (screen.Bounds.Height <= height) ? screen.Bounds.Height: height;
width += screen.Bounds.Width;
}
Form1.Size = new System.Drawing.Size(width, height);
Чтобы переопределить кнопку максимизации, вы можете проверить через WndProc событие максимизации
const int WM_SYSCOMMAND= 0x0112;
const int SC_MAXIMIZE= 0xF030;
protected override void WndProc(ref Message m)
{
if(m.Msg==WM_SYSCOMMAND)
{
if((int)m.WParam==SC_MAXIMIZE)
{
MessageBox.Show("Maximized!!");
return;
}
}
base.WndProc (ref m);
}
или зарегистрируйтесь в событии Resize формы (вы должны проверить, является ли это изменением размера или максимизацией) (MSDN)
Я знаю, что эта ветка очень старая, но я нашел здесь очень полезное и рабочее решение после того, как попробовал и столкнулся с проблемами с каждым из перечисленных здесь решений.
Что сработало для меня
Rectangle r = new Rectangle();
foreach (Screen s in Screen.AllScreens)
{
if (s != Screen.FromControl(this)) // Blackout only the secondary screens
r = Rectangle.Union(r, s.Bounds);
}
this.Top = r.Top;
this.Left = r.Left;
this.Width = r.Width;
this.Height = r.Height;
Единственное известное мне решение - использовать границы в сочетании с переопределением события Resize. В обработчике вы можете проверить свойство WindowState, чтобы увидеть, развернута ли форма или свернута. Если развернуто, измените размер окна снова со всеми границами экрана вместе.
Я вижу проблему с тем, что вы хотите.
Что делать, если второй экран меньше, чем первый (наоборот)...
Что, если второй экран расположен по диагонали (например, в верхнем левом углу) первого экрана (наоборот)...
Будут части, которые не будут видны!
Попросите пользователей изменить свои настройки отображения Windows (или изменить их для них).
Например, на картах NVidia поведение Windows по умолчанию называется "Dualview". Если вы включите "Горизонтальный промежуток", развернутые окна начнут вести себя так, как вы описываете.
Не делай этого.
Здесь мы идем: поведение определено ПОЛЬЗОВАТЕЛЕМ и операционной системой. Вы не должны отменять пожелания пользователя.
Склейка экранов (для формирования одного виртуального экрана) возможна с некоторыми аппаратными драйверами (ATI приходит мне в голову для современных карт, они называют это EyeFinity).
Хотя я вижу смысл этого - в большинстве случаев это нарушает ожидания пользователей в отношении того, как программа будет вести себя. И я говорю, что как кто-то часто работает с 3+ экранами;) Как в: использование одной программы на всех экранах;) Я бы не хотел этого;)