C # - несколько приложений для рабочего стола - проблемы с логикой - PullRequest
0 голосов
/ 06 января 2011

Я сейчас рву волосы с этой проблемой.

Где я до:

Я могу

  • Создать изображение для каждогоscreen
  • Создание мегаизображения для двух соседних экранов.
  • Установка этого изображения в качестве плиточных обоев.

Что я хочу сделать:

  • Поддержка любого количества мониторов
  • Поддержка всех смещений мониторов, таких как мониторы выше или ниже или диагональные.

Я читал эту статью MSDNи нашел это очень полезным:

http://blogs.msdn.com/b/oldnewthing/archive/2007/09/24/5083738.aspx

Но я все еще застрял на логике, которую мне нужно использовать для:

  • Подсчитайте, какой размер изображения мне нужендля любого варианта мониторов
  • Создание обоев с применением смещения мониторов

Моя программа имеет следующую структуру:

Класс ScreenInfo:

public Bitmap ChosenWallPaper { get; private set; }
public Rectangle ScreenArea { get; private set; }

int ScreenNumber { get; set; }

public string ScreenDescription { get { return "Screen: " + ScreenNumber + " " + ScreenArea.ToString(); } }

public ScreenInfo(int screenNumber)
{
    this.ScreenNumber = screenNumber;
    ScreenArea = new Rectangle(Screen.AllScreens[screenNumber].Bounds.X, Screen.AllScreens[screenNumber].Bounds.Y, Screen.AllScreens[screenNumber].Bounds.Width, Screen.AllScreens[screenNumber].Bounds.Height);
}

Класс ScreenCollection

public List<ScreenInfo> ScreenList { get; private set; }

public ScreenCollection()
{
    ScreenList = new List<ScreenInfo>();

    for (int i = 0; i < Screen.AllScreens.Count(); i++)
    {
        ScreenList.Add(new ScreenInfo(i));
    }
}

public Rectangle CalculateMainBitmapSize()
{

}

Остальная часть моего исходного кода еще не реализована.

Спасибо!

РЕДАКТИРОВАТЬ:

Я понял, как представлять два монитора друг с другом ДЕЙСТВИТЕЛЬНО хакерским, ужасным кодом, но я начинаю понимать, как мониторы расположены немного больше ...

private void SizeScreens()
{
    pictureBox1.Height = Desktops.ScreenList[0].ScreenArea.Height / 10;
    pictureBox1.Width = Desktops.ScreenList[0].ScreenArea.Width / 10;

    pictureBox2.Height = Desktops.ScreenList[1].ScreenArea.Height / 10;
    pictureBox2.Width = Desktops.ScreenList[1].ScreenArea.Width / 10;
}

private void PositionScreens()
{
    Point Screen1Location = new Point(Desktops.ScreenList[0].ScreenArea.X,Desktops.ScreenList[0].ScreenArea.Y);
    Point Screen2Location = new Point(Origin.X + (Desktops.ScreenList[1].ScreenArea.X / 10),Origin.Y + (Desktops.ScreenList[1].ScreenArea.Y / 10));

    pictureBox1.Location = Origin;
    pictureBox2.Location = Screen2Location;
}

1 Ответ

1 голос
/ 06 января 2011

Вы можете запросить размер виртуального экрана, используя функцию GetSystemMetrics с параметрами SM_CXVIRTUALSCREEN и SM_CYVIRTUALSCREEN. Это должно дать вам размер вашего изображения.

Позиции мониторов можно получить с помощью «EnumDisplayMonitors», но это немного сложнее, поскольку для этого требуется функция обратного вызова.

// edit: не знал о Screen.AllScreens, но я полагаю, вы получаете позиции экранов там.
Вы должны просто поставить обои на эти позиции, оборачивая экраны с отрицательными координатами вправо. Источник виртуального экрана находится в верхнем левом углу основного монитора.

...