#c #wxwidgets
#c #wxwidgets
Вопрос:
У меня есть небольшое приложение wxWidget, которое может сохранять несколько настроек в простой XML-файл. Среди этих настроек я сохраняю положение, размер и развернутое состояние моего окна верхнего уровня, чтобы я мог восстановить его при следующем запуске.
По умолчанию, когда вы разворачиваете окно, при повторном нажатии кнопки «Развернуть» возвращается исходная (не максимизированная) позиция / размер. Но когда я сохраняю свои настройки, единственными позициями и размерами, которые я могу получить, являются максимизированные. Поэтому, когда пользователь перезапускает свое приложение и хочет «развернуть» его, окно по-прежнему будет занимать весь экран.
В Windows XP я сделал небольшую хитрость, которая заключалась в вызове SetMaximize(false) перед получением позиции и размера. Это работало просто отлично. Но теперь я на седьмом, и это больше не работает. Кажется, что SetMaximize(false) откладывается: когда я прерываюсь, это работает, но во время обычного выполнения я всегда получаю максимизированную позицию / размер, как если бы операция unmaximize выполнялась в другом потоке.
Итак, я попытался добавить Sleep() сразу после моего вызова «SetMaximize (false)», но мне нужно использовать действительно высокое значение, чтобы убедиться, что оно всегда работает, и мне это не нравится.
Итак, мой вопрос: есть ли какой-либо способ получить положение и размер не максимизированного окна? (Я также пытался перехватывать события изменения размера, но это работает только для размера, и мне также нужна позиция… и не найдено ни одного события «перемещение окна»)
Заранее спасибо за любую помощь!
Комментарии:
1. О, мой Google fu был недостаточно сильным: ( Я нашел способ заставить это работать, но только для Windows. Поэтому мне все еще интересно узнать, есть ли какой-либо способ сделать это и при этом оставаться кроссплатформенным. Если кого-то интересует решение «только для Windows», проверьте здесь: msdn.microsoft.com/en-us/library/windows/desktop /…
Ответ №1:
Я делаю это с:
wxPoint pos = GetPosition();
wxSize size = GetSize();
и это работает с Win7 / XP и Linux.
Комментарии:
1. Спасибо, я знаю эти методы, но, как я уже объяснял, они не возвращают нужные мне значения: скажем, мои окна имеют <100, 100>, а их размер <800, 600> Теперь я разворачиваю свое окно. GetPosition и getSize теперь будут возвращать <0, 0> и <screen_width, screen_height>, тогда как я хочу исходную позицию и размер, так что это не работает для меня, поэтому мой первоначальный вопрос ^^
Ответ №2:
Это просто.
Класс «window-moved» — это wxMoveEvent, а тип события для отслеживания любого перемещения — wxEVT_MOVE . Итак, определите функцию в своем классе window верхнего уровня,
аннулировать MyFrame::onMove(wxMoveEventamp; evt);
Свяжите его следующим образом:
Bind(wxEVT_MOVE, amp;MyFrame::onMove, this);
Как в функции onMove, так и в функции OnSize проверьте, развернуто ли окно, вызвав функцию-член IsMaximized() . Когда он возвращает true, не меняйте данные положения и размера.