Размер/позиция фрейма wxFrame( диало Topic is solved

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
m1t0z
Knows some wx things
Knows some wx things
Posts: 25
Joined: Sat Aug 16, 2008 9:03 am

Размер/позиция фрейма wxFrame( диало

Post by m1t0z » Sat Aug 16, 2008 9:13 am

Здравствуйте. Необходимо узнать размер/позицию фрейма/диалога в развернутом состоянии( IsMaximized() = true ). Если быть точнее, - узнать параметры окна которые будут, когда пользователь нажмет на кнопку "Свернуть в окно", т.е. IsMaximized() = false;

User avatar
T-Rex
Moderator
Moderator
Posts: 1187
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex » Sat Aug 16, 2008 4:31 pm

Эээ.. думаю, в общем случае никак. Только делать Maximize, гребсти ClientRect или WindowRect. Думаю если завесить рабочий стол Appbar'ами то вряд ли с помощью wx можно будет получить предсказуемое значение размеров максимизированного окна да еще и под различными платформами.
Да, если тебе лайаут делать или там рисовать чего, то не проще ли уже после максимизации/восстановления применять изменения? Для этого и событие вроде ж есть.

m1t0z
Knows some wx things
Knows some wx things
Posts: 25
Joined: Sat Aug 16, 2008 9:03 am

Post by m1t0z » Sat Aug 16, 2008 5:39 pm

T-Rex wrote:..вряд ли с помощью wx можно будет получить предсказуемое значение размеров максимизированного окна да еще и под различными платформами.
Вообще подобный вопрос возник при написании кода, ответственного за сохранение настроек ГУИ отображения фрейма/диалогов после их закрытия и восстановление этих настроек при последующем запуске программы.

При этом, если взять, например, тот же фрейм( wxFrame ), находящийся в "оконном" положении( IsMaximized() = false ), развернуть его на весь экран, а затем опять восстановить до окна, то он вернется в первоначальное положение. Значит где-то внутри объекта wxFrame хранятся положение/размер, соответствующие "оконному" состоянию. Только, действительно, врядли можно получить эти цифры с помощью wx API.

Nikolay
Experienced Solver
Experienced Solver
Posts: 72
Joined: Wed Oct 10, 2007 4:27 am

Post by Nikolay » Sun Aug 17, 2008 6:21 am

Вообще подобный вопрос возник при написании кода, ответственного за сохранение настроек ГУИ отображения фрейма/диалогов после их закрытия и восстановление этих настроек при последующем запуске программы.
Я на написание такой функциональности почти два дня убил в свое время:)
Получить данные которые ты хочешь я не нашел как, но разве это может остановить истиных джедаев?:)

Это основной момент:

Code: Select all

void WindowManagerHelper::OnSize( wxSizeEvent& event )
{
	// Эта строчка работает потому что мы в попадаем сюда в следующих случаях 1. изменение размера 2. Максимизаци 
	// 3. Востановление МАКСимизированного окна 4. Востановление МИНИмизированного окна - во всех случах IsMaximized() возвращает что надо
	// При минимизации этот код не вызывается - так что все ок
	// Вообще все это нужно, потому что мы не можем корректно определить при закрытии окна -  максимизированны ли мы. Если вдруг окно максимизированно и свернуто
	// то IsMaximized вернет фалсе - что ложь
	IsMaximized=parent->IsMaximized();

	// Запоминаем истинные размеры окна, в конце этого тоже сделать не можем -  потому что если окно свернуто или макисизированно - возврашяется фигня
	if (!parent->IsMaximized() && !parent->IsIconized())
	{	
		PosX=parent->GetPosition().x;
		PosY=parent->GetPosition().y;
		SizeW=parent->GetSize().x;
		SizeH=parent->GetSize().y;
	}
	event.Skip();
}

void WindowManagerHelper::OnMove(wxMoveEvent& event )
{
	// Запоминаем истинные размеры окна, в конце этого тоже сделать не можем -  потому что если окно свернуто или макисизированно - возврашяется фигня
	if (!parent->IsMaximized() && !parent->IsIconized())
	{	
		PosX=parent->GetPosition().x;
		PosY=parent->GetPosition().y;
	}
	event.Skip();
}
Пояснения:
IsMaximized - моя переменная в которой руками отслеживаю состояние.
parent-> просто потому что этот код реализован в ввиде класса помощника, а не прямо в коде фрейма.
Best regards, Nikolay
wxWidgets in russian
Small Notes Manager and Clipboard Manager with History written with wxWidgets

m1t0z
Knows some wx things
Knows some wx things
Posts: 25
Joined: Sat Aug 16, 2008 9:03 am

Post by m1t0z » Sun Aug 17, 2008 6:53 am

Спасибо, Nikolay, за подробное объяснение. Обязательно воспользуюсь вашей наработкой ;=)

User avatar
T-Rex
Moderator
Moderator
Posts: 1187
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex » Sun Aug 17, 2008 8:12 am

класс wxFrame вродеж так ничего не хранит, а гребет через виндовое АПИ. кстати самой виндой предусмотрено что если закрыть окно с нажатым Ctrl то при следующем запуске приложения оно восстановит позицию и размер.

m1t0z
Knows some wx things
Knows some wx things
Posts: 25
Joined: Sat Aug 16, 2008 9:03 am

Post by m1t0z » Sun Aug 17, 2008 10:47 am

T-Rex wrote:класс wxFrame вродеж так ничего не хранит, а гребет через виндовое АПИ
Думаю, так и есть.

Post Reply