Правильно написанные приложения Windows, которые хотят сохранить свое местоположение от запуска к запуску, сохранят результаты GetWindowPlacement()
до выключения, а затем при запуске запустят SetWindowPlacement()
, чтобы восстановить их положение.
Часто приложения сохраняют результаты GetWindowPlacement()
в реестре как REG_BINARY
для удобства использования.
Маршрут WINDOWPLACEMENT
имеет много преимуществ по сравнению с другими методами:
- Обрабатывает случай, когда разрешение экрана изменилось с момента последнего запуска:
SetWindowPlacement()
автоматически гарантирует, что окно не полностью за кадром
- Сохраняет состояние (свернутое / развернутое), но также сохраняет восстановленный (нормальный) размер и положение
- Правильно обрабатывает метрики рабочего стола, компенсируя положение панели задач и т. Д. (Т. Е. Использует «координаты рабочего пространства» вместо «экранных координат») - методы, основанные на сохранении координат экрана, могут страдать от проблемы «ходящих окон», когда окно будет всегда отображаться немного ниже, если у пользователя есть панель инструментов в верхней части экрана).
Наконец, программы, которые правильно обрабатывают восстановление окна, будут учитывать параметр nCmdShow
, переданный из оболочки. Этот параметр устанавливается в ярлыке, запускающем приложение (Normal, Minimized, Maximize):
if(nCmdShow != SW_SHOWNORMAL)
placement.showCmd = nCmdShow; //allow shortcut to override
Для приложений, отличных от Win32, важно быть уверенным, что метод, который вы используете для сохранения / восстановления положения окна, в конечном итоге использует тот же базовый вызов, в противном случае (например, проблема setBounds()
/ getBounds()
в Java Swing) вы ' в конечном итоге мы напишем много дополнительного кода для повторной реализации функциональности, уже присутствующей в функциях WINDOWPLACEMENT
.