2013-08-25 3 views
5

Я пытаюсь получить абсолютное положение элемента управления на экране. Я использую два монитора, и результаты на самом деле не так велики ...C# абсолютное положение управления на экране

Что я делаю, это открытие другой формы для захвата изображения, затем передача этого изображения в основную форму и закрытие формы захвата. Затем я хочу, чтобы основная форма появлялась в том же месте, где была захвачена фотография. Чтобы получить суть того, что я пытаюсь сделать в качестве примера, откройте инструмент Snipping Tool на Windows и запишите снипп. Затем окно появится в том месте, где было выполнено изображение.

Это текущий код, я использую, чтобы сделать это:

Location = new Point(Cursor.Position.X - CaptureBox.Width - CapturePanel.Location.X - CaptureBox.Location.X - 8, Cursor.Position.Y - CaptureBox.Height - CapturePanel.Location.Y - CaptureBox.Location.Y - 30); 

CapturePanel содержит элемент управления, который хранит CaptureBox картину. Я также беру 8 из местоположения X и 30 из местоположения te Y, чтобы компенсировать границу формы и строку заголовка, но единственная проблема заключается в том, что некоторые компьютеры будут использовать другой стиль окна, и эти числа будут меняться.

Если есть способ, который можно использовать для захвата границы и ширины заголовка/высоты окон, это было бы здорово.

EDIT

Решение этой проблемы было бы:

Location = new Point(
    Cursor.Position.X - 
    CaptureBox.Width - 
    CapturePanel.Location.X - 
    CaptureBox.Location.X - 
    SystemInformation.HorizontalResizeBorderThickness, 
    Cursor.Position.Y - 
    CaptureBox.Height - 
    CapturePanel.Location.Y - 
    CaptureBox.Location.Y - 
    SystemInformation.CaptionHeight - 
    SystemInformation.VerticalResizeBorderThickness 
); 

С помощью King King указывая мне о системе.

ответ

5

Чтобы получить Height из ваших Window caption, вы можете попробовать это:

int captionHeight = yourForm.PointToScreen(Point.Empty).Y - yourForm.Top;  

Чтобы получить Width вида границы, вы можете попробовать это:

int borderWidth = yourForm.PointToScreen(Point.Empty).X - yourForm.Left; 

Также вы можете посмотрите высоту надписи по умолчанию на SystemInformation.CaptionHeight.

Если вы хотите, чтобы получить расположение CaptureBox в координатах экрана, вы можете использовать метод PointToScreen:

Point loc = CaptureBox.PointToScreen(Point.Empty); 
+0

Первый метод работает, SystemInformation.CaptionHeight был меньше, чем должно быть. Как насчет размера границы окна? – Dragonphase

+0

@ Dragonphase, если вы хотите получить местоположение 'CaptureBox', см. Мой обновленный ответ, нет необходимости вычислять' Размер границы'. –

+0

Это не сработает, так как я не передаю местоположение захваченного изображения в основную форму. Если я это сделаю, это приведет к тому, что абсолютное положение (например, 1440) будет добавлено к местоположению текущей выбранной формы на основном мониторе. Однако я придумал решение, это на моем главном посту. – Dragonphase

Смежные вопросы