Изменение позиции восстановления окна с помощью SetWindowPlacement не работает для каждого окна - PullRequest
2 голосов
/ 27 июня 2010

Я использую функцию SetWindowPlacement для (1) максимизации и (2) изменения положения восстановления внешних окон на рабочем столе.Но когда я использую эту команду в окнах WinForm, она, похоже, неправильно устанавливает местоположение для восстановления.(Окно WinForm, с которым я тестирую, - это просто приложение WinForms VS2008, запускаемое без изменений.) Так, например, если окно находится в восстановленном состоянии, расположенном в (0, 0), и я использую SetWindowPlacement, чтобы развернуть его иустановите его позицию восстановления в (100,100), затем нажмите кнопку восстановления окна, оно восстановится не в (100,100), а в (0,0).На самом деле кажется, что окно сначала восстанавливает место, которое я установил, ТО затем возвращается к своему последнему месту восстановления до того, как им манипулируют программно.Я не понимаю, почему это может происходить только в окнах WinForm - каждое окно, не относящееся к WinForm, которое я пробую, корректно восстанавливает положение, указанное мною SetWindowPlacement.

Я знаю, что это не так уж и много., но мне было интересно, если у кого-нибудь здесь были какие-либо идеи о том, почему это происходит.Спасибо.

Ответы [ 2 ]

4 голосов
/ 27 июня 2010

Да, это по замыслу.Класс Form сам отслеживает границы восстановления, что необходимо для правильного изменения положения окна после его повторного создания.Windows Forms часто воссоздает окно «на лету» для реализации установщиков свойств для свойств, которые могут быть заданы только CreateWindowEx ().Как и ShowInTaskbar.

Закрытый метод RestoreWindowBoundsIfNeeded () возвращает окно обратно, оно будет запущено при восстановлении окна.Из того, что я могу сказать, границы восстановления защелкиваются непосредственно перед тем, как окно свернуто или развернуто.Если вы хотите изменить позицию восстановления, пока окно минимально / развернуто, вам придется использовать MoveWindow, чтобы переместить его туда, куда вы хотите, чтобы оно пошло после восстановления окна.Должен произвести мерцание.

0 голосов
/ 06 октября 2015

Мне удалось избежать любого мерцания, просто установив размер и расположение окна в последующем повороте диспетчера.Затем, как подсказал Ханс, RestoreWindowBoundsIfNeeded будет использовать этот размер и местоположение при восстановлении окна.

Form window = ...
window.StartPosition = FormStartPosition.Manual
window.WindowState = savedState;
if (window.WindowState == FormWindowState.Normal)
{
    window.Location = savedLocation;
    window.Size = savedSize;
}
else
{
    window.BeginInvoke((MethodInvoker)delegate 
    {
        window.Location = savedLocation;
        window.Size = savedSize;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...