C # Как разместить родительскую форму, используя клиентские координаты?

У меня есть основная форма (родительская форма приложения), которая устанавливается на задний план с помощью p/Invoke SetWindowPos. SetWindowPos запрашивает координаты X, Y окна, которые должны быть в координатах клиента.

Когда я запускаю программу, окно отображается в центре экрана. Затем я перемещаю окно и сохраняю новое местоположение в Properties.Settings.Default.frmMainLocation, которое привязано к свойству frmMain.Location.

Я останавливаю программу, а затем перезапускаю ее, и форма возвращается в исходное центральное положение.

Как настроить SetWindowPos для размещения окна в координатах X, Y, которые получены из координат формы Location.X, Location.Y?


person Dave Gordon    schedule 30.04.2015    source источник
comment
Вы не забыли включить Properties.Settings.Default.Save() ?   -  person Zack Campbell    schedule 30.04.2015
comment
Из любопытства, почему вы используете p/invoke для установки местоположения формы?   -  person Ron Beyer    schedule 30.04.2015
comment
Я сохранил свойства, да, @RonBeyer, а не я - я использую P/Invoke SetWindowPos, чтобы установить порядок Z.   -  person Dave Gordon    schedule 30.04.2015
comment
Если вы используете SetWindowPos() только для изменения Z-порядка, вам следует передать SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE в качестве последнего аргумента. Так что не имеет значения, что вы передаете в качестве аргументов x, y, cx, cy.   -  person Hans Passant    schedule 30.04.2015
comment
@HansPassant Это правда, но это не значит, что я не могу установить положение окна, а SetWindowPos расположить окно там, где я указываю!   -  person Dave Gordon    schedule 30.04.2015
comment
@DaveGordon, можешь объяснить Гансу этот комментарий? Это не имеет большого смысла для меня. SetWindowPos() по умолчанию прочитает параметры x, y, cx и cy и переместит туда ваше окно; вы должны использовать именованные флаги, чтобы избежать такого поведения.   -  person andlabs    schedule 30.04.2015
comment
@andlabs Я сбрасываю SWP_NOMOVE при перемещении формы и потом сбрасываю его ...   -  person Dave Gordon    schedule 01.05.2015


Ответы (2)


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

Point pos = new Point
    (
        Properties.Settings.Default.posX,
        Properties.Settings.Default.posY
    );

this.Location = pos;

Я установил это в методе Form_Load() моей формы для события Form.Load() с несколькими различными наборами простых координат, и это каждый раз меняло положение, в котором форма отображалась при загрузке. Это просто прыжок, прыжок и прыжок, чтобы он загрузил координаты из Properties.Settings.Default, как я показал в примере.

person Zack Campbell    schedule 30.04.2015

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

Когда приложение запускается, вам нужно SetWindowPos без флага SWP_NOMOVE Затем SetWindowPos с установленным флагом SWP_MOVE Затем, когда вы хотите изменить положение, повторите процесс запуска приложения.

person Dave Gordon    schedule 03.05.2015