Для tan'а Topic is solved

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7459
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Для tan'а

Post by ONEEYEMAN »

tan,
Я воспроизвел проблему описанную в ссылке.
Баг зафайлан, но к сожалению еще не был рассмотрен.
Я демаю что там что-то связанное с позиционированием, но почему-то добавление метода OnSize в класс MyCanvas проблему не решило (я говорю про sample). Думаю так потому что в моей программе симптомы связанны именно с этим.

Если захотите (заинтересуетесь) могу скинуть ссылку на баг...

Спасибо.
tan
wxWorld Domination!
wxWorld Domination!
Posts: 1471
Joined: Tue Nov 14, 2006 7:58 am
Location: Saint-Petersburg, Russia

Re: Для tan'а

Post by tan »

ONEEYEMAN wrote:tan,
Я воспроизвел проблему описанную в ссылке.
Баг зафайлан, но к сожалению еще не был рассмотрен.
Я демаю что там что-то связанное с позиционированием, но почему-то добавление метода OnSize в класс MyCanvas проблему не решило (я говорю про sample). Думаю так потому что в моей программе симптомы связанны именно с этим.

Если захотите (заинтересуетесь) могу скинуть ссылку на баг...

Спасибо.
Привет.
Я посмотрел пример, только я не совсем понял, как это связано с проблемой, описанной в http://forums.wxwidgets.org/viewtopic.php?p=79881#79881. Там вроде речь шла о проблемах с DLL.
Ну а для этого бага есть простой workaround - просто вызывай Maximize() после Show():

Code: Select all

  ...
  //// Associate the menu bar with the frame
  frame->SetMenuBar(menu_bar);

  frame->Centre(wxBOTH);
//  frame->Maximize();
#ifndef __WXMAC__
  frame->Show(true);
#endif //ndef __WXMAC__

  SetTopWindow(frame);
  frame->Maximize();
  return true;
}
У меня работает без проблем.
OS: Windows XP Pro
Compiler: MSVC++ 7.1
wxWidgets: 2.8.10
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7459
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Post by ONEEYEMAN »

tan,
Все очень просто. Если я воспроизведу проблему в одном из самплов, то смогу просто спросить либо на форуме либо в рассылке про обходной путь.

Что касается вызова Maximize() после Show(), то это работает.
Но к сожалению (или к счастью) я воспроизвел проблему которая имеет место быть в моем приложении.

Please see an attachment.
Прокомпилировать, запустить, выбрать "File"->"New"->"Drawing", "OK".

Child frame окно смещено вниз, а окно toolbar2 не прорисовано. Если провести над toolbar'ом2 мышью, ничего не произойдет. Если поднять окно child frame то окно toolbar2 исчезнет, как будто его и не было.

Сообщение OnSize для главного окна приложения обрабатывается.

Спасибо.
Attachments
docvwmdi.rar
(91.4 KiB) Downloaded 176 times
tan
wxWorld Domination!
wxWorld Domination!
Posts: 1471
Joined: Tue Nov 14, 2006 7:58 am
Location: Saint-Petersburg, Russia

Post by tan »

Привет.
Ну я здесь не вижу проблем с самой WX. Просто ты как-то криво все это сделал :)
Я слегка поправил два файлика из твоего примера, вроде работает как ожидалось. Попробуй, может я чего-то не понял (в смысле что ты хотел сделать и это не помогает в твоем случае), но так, на первый взгляд, все выглядит адекватно.
Attachments
docvwmdi.zip
(5.11 KiB) Downloaded 182 times
OS: Windows XP Pro
Compiler: MSVC++ 7.1
wxWidgets: 2.8.10
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7459
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Post by ONEEYEMAN »

Все работает в примере, спасибо.
2 вопроса.
1. В чем разница между использованием переменной frame и вызовом функции GetClientWindow()? И можно ли использовать функцию GetActiveChild() (точно название не помню, получить активное окошко mdi child)?
2. Куда подевалась нижняя граница окна mdi child?

Веонусь с работы, попробую в своей программе....
tan
wxWorld Domination!
wxWorld Domination!
Posts: 1471
Joined: Tue Nov 14, 2006 7:58 am
Location: Saint-Petersburg, Russia

Post by tan »

ONEEYEMAN wrote:Все работает в примере, спасибо.
2 вопроса.
1. В чем разница между использованием переменной frame и вызовом функции GetClientWindow()?
GetClientWindow() возвращает wxMDIClientWindow окно, в нем как раз и размещаются все дочерние фреймы (wxMDIChildFrame). По нормальному, wxMDIClientWindow окно занимает всю слиент область главного фрейма, если мы хотим занять некоторую часть клиент области под свои нужды (как в твоем примере, под второй тулбар), то надо соответствующим образом "сдвинуть" wxMDIClientWindow окно. При этом нет нужды заботиться о расположении дочерних фреймов, поскольку их реальным парентом wxMDIClientWindow и является.
ONEEYEMAN wrote: И можно ли использовать функцию GetActiveChild() (точно название не помню, получить активное окошко mdi child)?
Ну конечно, именно это и надо юзать :)
ONEEYEMAN wrote: 2. Куда подевалась нижняя граница окна mdi child?
Да вроде она никуда и не девалась :) Хотя да, просто я не устанавливаю его размера явно, ну он и остается по умолчанию, т.е. больше, чем оставшаяся клиентская область. Ну это вроде не проблема. Просто надо его размер тоже уменьшить (или просто мышкой сузить).
OS: Windows XP Pro
Compiler: MSVC++ 7.1
wxWidgets: 2.8.10
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7459
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Post by ONEEYEMAN »

tan,
Даже в моей программе это работает... Спасибо. :)
Ну и наконец последнее.
Где устанавливать размер mdi child окна, так чтобы нижняя граница этого окна была видна.

В документации написано что wxMDIClientWindow не требует наследования.
Устанавливать ее в MainFrame::OnSize()? Насколько я понял размер этого окна нужно устанавливать по размерам wxMDIClientWindow, а не MainFrame. Или все - таки устанавливать эти размеры по размерам клиентской части MainFrame?

Спасибо.
tan
wxWorld Domination!
wxWorld Domination!
Posts: 1471
Joined: Tue Nov 14, 2006 7:58 am
Location: Saint-Petersburg, Russia

Post by tan »

В таком виде у меня работает (см. аттач).
Хотя, что-то у них все равно не так работает, как я ожидал :( Поэтому требуется некоторый трюк (см. коммент в файле). Судя по сорцам, при затребовании парента от wxMDIChildFrame возвращается wxMDIParentFrame, хотя реально парент есть wxMDIClientWindow (это явно видно, если глянуть Spy++). Т.е. координаты дочернего окна пересчитывются относительно клиент области парент фрейма. При этом явного метода установить положение клиентской области окна (типа wxWindow::SetClientAreaOrigin()) в природе не существует.
Может, конечно, это я чего-то не понимаю :) Я, вообще-то, архитектуру MDI в своих проектах не юзаю, поэтому особо тщательно и не разбирался.:)
Attachments
view.zip
(2.62 KiB) Downloaded 172 times
OS: Windows XP Pro
Compiler: MSVC++ 7.1
wxWidgets: 2.8.10
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7459
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Post by ONEEYEMAN »

tan wrote: В таком виде у меня работает (см. аттач).
Where is an attachment? :wink:
I am at work, so no Russian... :)

Thank you.
tan
wxWorld Domination!
wxWorld Domination!
Posts: 1471
Joined: Tue Nov 14, 2006 7:58 am
Location: Saint-Petersburg, Russia

Post by tan »

ONEEYEMAN wrote:
tan wrote: В таком виде у меня работает (см. аттач).
Where is an attachment? :wink:
А че, куда-то пропал? :)
Да нет вроде, вот вижу, даже два раза загружали :) View.zip называется.
OS: Windows XP Pro
Compiler: MSVC++ 7.1
wxWidgets: 2.8.10
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7459
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Post by ONEEYEMAN »

tan,
Все работает, спасибо.
Скорее всего у меня на работе стоит умный фильтр который видит что висит аттач и его фильтрует.... :)
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7459
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Post by ONEEYEMAN »

tan,
А как насчет этой программки?
Attachments
docvwmdi.rar
тулбар вертикальный
(96.04 KiB) Downloaded 182 times
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7459
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Post by ONEEYEMAN »

tan,
I just tried you code with the DocMDIChild sizing.
What I did was run the sample and then click on the resizing button in the top right corner. (between minimize and close).
Unless I am mistaken the child did not resize itself.

Thank you for the help so far.
Post Reply