как получить «не максимизированное» состояние окна a в wxWidget

#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, не меняйте данные положения и размера.