Текущий архив: 2003.02.06;
Скачать: CL | DM;
ВнизИ снова MDI Найти похожие ветки
← →
Smok_er (2003-01-23 21:45) [0]Мастера! При переключении между максимизированными MDI Child"ами возникает некрасивый эффект как бы максимизации активизированной формы. Активизирую методом show.
Как можно этого избежать?
← →
Игорь Шевченко (2003-01-24 10:24) [1]Вопрос непонятен
← →
smok_er (2003-01-24 11:11) [2]Есть форма. На ней несколько максимизированных MDI Child"ов. При переключении между ними (например из меню) поверх текущего окна появляется новое, нами выбранное, и максимизируется. В принципе ерунда, но выглядит весьма некрасиво. Может я не правильно их активирую (методом Show)?
Глянул пример текстового редактора из дистрибутива делфи - там то же самое.
И еще один вопрос - при динамическом создании новой формы она сразу становится активной.
Можно ли этого избежать? Т.е. форма создалась, но не активизировалась?
Пробую сразу после создания Hide, но вылетает ошибка, типа MDI Child не может быть скрытым.
← →
Игорь Шевченко (2003-01-24 11:23) [3]smok_er (24.01.03 11:11)
1) Не максимизируй.
> Можно ли этого избежать? Т.е. форма создалась, но не активизировалась?
Нельзя. Это закон MDI.
Сдается мне, проблемы с дизайном имеются...
← →
Бук (2003-01-24 11:24) [4]А если в onClose Child формы написать caMinimize и после содания ее сразу же закрыть? По идее она должна минимизироваться.
← →
myor (2003-01-24 11:31) [5]2 smok_er
...При переключении между ними...активирую (методом Show)...
а зачем show для уже отображаемого окна?
или это для еще одного (нового)?
нужно сделать активным нужное окно
посмотри пример mdi в репозитории
← →
smok_er (2003-01-24 11:36) [6]myor © (24.01.03 11:31)
а как активизировать другое MDI окно?
Activate выдает ошибку :(
Игорь Шевченко © (24.01.03 11:23)
Нельзя. Это закон MDI.
Сдается мне, проблемы с дизайном имеются...
В смысле?
Я посмотрел пример в репозитории - там тоже самое!
← →
Игорь Шевченко (2003-01-24 11:59) [7]В примере окна через Show активизируются ?
← →
Chubais (2003-01-24 12:10) [8]
> При переключении между ними (например из меню) поверх текущего
> окна появляется новое, нами выбранное, и максимизируется
если ты имеешь в виду, что перед переключением в новое окно показывается оно нормальным, а затем максимизируется-то так устроен MDI
нужно блокировать обновление окна, открывать нужное, а потом рзблокироватьь обновление
← →
smok_er (2003-01-24 12:32) [9]>>если ты имеешь в виду, что перед переключением в новое окно >>показывается оно нормальным, а затем максимизируется-то так
>>устроен MDI
Именно!
>>нужно блокировать обновление окна, открывать нужное, а потом >>рзблокироватьь обновление
Интересно! А пример можно?
← →
Игорь Шевченко (2003-01-24 12:47) [10]Обычно, показ MDI окон сразу максимизированными - дурной тон в дизайне.
← →
smok_er (2003-01-24 12:48) [11]Игорь Шевченко © (24.01.03 12:47)
Обычно, показ MDI окон сразу максимизированными - дурной тон в дизайне.
Может быть. Но имхо если предыдущая форма была максимизирована, а вновь показываемую сделать обычной - то этот тон будет еще дурнее!
← →
Strumpf (2003-01-24 12:48) [12]Блокируем
SendMessage(Handle,WM_SETREDRAW,0,0);
или
LockWindowUpdate(Handle);
Разблокируем
SendMessage(Handle,WM_SETREDRAW,1,0);
RedrawWindow(Handle,NULL,0,RDW_INVALIDATE | RDW_ERASE | RDW_FRAME | RDW_ALLCHILDREN);
или
LockWindowUpdate(0);
соответственно.
← →
myor (2003-01-24 13:11) [13]smok_er (24.01.03 11:36)
...а как активизировать другое MDI окно?...
еще одно mdi или еще одно child в единственном mdi?
mdiform имеем свойство activemdichild (readonly).
для активации окна есть процедуры next и previous
можеть, хелп поможет?
...Я посмотрел пример в репозитории - там тоже самое!...
что, то же самое?
прога из репозитория создает и открывает окна каскадом, не максимизируя (у меня так было).
← →
smok_er (2003-01-24 13:29) [14]Strumpf © (24.01.03 12:48)
Большое спасибо! Дома буду пробовать.
myor © (24.01.03 13:11)
>>что, то же самое?
>>прога из репозитория создает и открывает окна каскадом, не >>максимизируя (у меня так было).
Теперь попробуйте максимизировать какое-то окно, после чего попереключаться между окнами через пункты меню, внимательно вглядываясь в окошки. Только вот дело в том, что пример - простейший текстовый редактор, а у меня это браузер и выглядит еще хуже :(, так как дольше этот эффект виден :(
Эту ветку я начал не из-за того, что я хочу сам не знаю что. Я реально видел прогу, у которой при переключении окошек максимизации не было видно, и которая создает окошки без активизации!
← →
smok_er (2003-01-24 15:21) [15]Неужели вопрос уже закрыт?
Ответьте пожалуйста...
← →
Chubais (2003-01-24 15:26) [16]тебя ответ
Strumpf © (24.01.03 12:48)
не удовлетворил? других вариантов нет
← →
Игорь Шевченко (2003-01-24 15:28) [17]
> Эту ветку я начал не из-за того, что я хочу сам не знаю
> что. Я реально видел прогу, у которой при переключении окошек
> максимизации не было видно, и которая создает окошки без
> активизации!
И я видел. Только окошки были не максимизированы, а аккуратно подстроены под размер главного окна. Даже сам такую писал.
Но непонятен смысл.
← →
REA (2003-01-24 15:29) [18]Еще хуже выглядит сохранение Desktop - приходится все MDI Child восстановить, чтобы узнать их настоящий размер. Или он где-то еще зарыт?
← →
myor (2003-01-24 15:33) [19]к сожалению, сейчас ничего посмотреть не могу.
похоже, новое окно берет настройки последнего активного (максимизированного) окна и при отображении максимизируется.
попробуй минимизировать текущее активное окно (или упорядочить все окна каскадом) перед открытием (созданием) нового.
← →
smok_er (2003-01-24 16:20) [20]>>И я видел. Только окошки были не максимизированы, а аккуратно подстроены под размер главного окна.
Я видел именно максимизированные!
← →
smok_er (2003-01-24 16:27) [21]Вот пример создания без активации на Си, как сделать подобное на делфи?
try
{
pWnd = new CChildFrame;
}
catch(...)
{
return NULL;
}
if(pWnd == NULL)
return NULL;
pWnd->m_bForceActive = bForceActive;
if (!pWnd->Create(_T("ChildFrame"), "",
WS_CHILD | WS_OVERLAPPEDWINDOW, rectDefault, this))
{
delete pWnd;
return NULL;
}
if(NeedActive)
pWnd->ShowWindow(SW_SHOW);
← →
Strumpf (2003-01-24 16:31) [22]CChildFrame - это что за класс?
← →
smok_er (2003-01-24 16:51) [23]Это тоже самое, что на паскале TChildForm видимо...
← →
Игорь Шевченко (2003-01-24 17:07) [24]smok_er (24.01.03 16:27)
Это же к MDI никаким боком не относится
← →
smok_er (2003-01-24 17:30) [25]Игорь Шевченко © (24.01.03 17:07)
Как это не относится?
В этом куске создается MDIChild. Причем каким то образом оно изначально не активировано.
← →
Strumpf (2003-01-26 15:43) [26]>smok_er (24.01.03 16:51)
>Это тоже самое, что на паскале TChildForm видимо...
Что-то не припомню я в Паскале такого класса...
← →
Игорь Шевченко (2003-01-27 11:39) [27]MDI-child"ы создаются по-другому.
WindowHandle := SendMessage(Application.MainForm.ClientHandle,
WM_MDICREATE, 0, Longint(@CreateStruct));
То, что приведено в примере, к MDI-Child никоим боком не относится.
← →
Chubais (2003-01-27 12:07) [28]афторитетно так: подтверждаю
← →
Игорь Шевченко (2003-01-27 12:15) [29]Можно еще через CreateWindowEx с указанием Exstyle = WS_EX_MDICHILD, но Parent"ом все равно должен быть MDIClient.
Можно еще через CreateMDIWindow :-)
Chubais © (27.01.03 12:07)
:tongue:
← →
smok_er (2003-01-27 12:34) [30]>>Что-то не припомню я в Паскале такого класса...
Странно, я помню.
Пример: есть форма, я назвал ее ChildForm. Автоматически создается класс TChildForm. :)
>>Вот пример создания без активации на Си, как сделать подобное на делфи?
>>MDI-child"ы создаются по-другому.
Я же сказал, что в примере на Си. И попросил сказать, как такое сделать на паскале.
← →
Игорь Шевченко (2003-01-27 12:48) [31]smok_er (27.01.03 12:34)
Дай полный пример на С. Из того, что ты дал не видно ничего, что относится к MDI.
← →
smok_er (2003-01-27 13:42) [32]Я еще раз посмотрел исходник. В первый раз дал полностью, с небольшими не играющими роли изменениями.
Даю еще раз:
if(!found)
{
try
{
pWnd = new CChildFrame;
}
catch(...)
{
return NULL;
}
if(pWnd == NULL)
return NULL;
pWnd->m_bForceActive = bForceActive;
if (!pWnd->Create(_T("ChildFrame"), "",
WS_CHILD | WS_OVERLAPPEDWINDOW, rectDefault, this))
{
delete pWnd;
return NULL;
}
if(bForceActive)
pWnd->ShowWindow(SW_SHOW);
}
← →
Игорь Шевченко (2003-01-27 13:52) [33]smok_er (27.01.03 13:42)
Либо ты даешь не все, либо это не MDI
← →
smok_er (2003-01-27 14:26) [34]if (!pWnd->Create(_T("ChildFrame"), "",
WS_CHILD | WS_OVERLAPPEDWINDOW, rectDefault, this))
WS_CHILD Creates a child window. Cannot be used with the WS_POPUP style. (C) MSDN
Да я сам в этих исходниках запутался, но окно создается именно здесь.
← →
Игорь Шевченко (2003-01-27 15:54) [35]Ты даешь мало исходников. По этой части я не вижу, что создается именно MDIChild. До тех пор, пока ты не дашь отсальные исходники, разговаривать не о чем.
← →
smok_er (2003-01-27 16:32) [36]Давайте я закину их на мыло. Все не выложишь их очень много :(
← →
Игорь Шевченко (2003-01-27 17:08) [37]Ради бога. Или на сайт и ссылочку
← →
Игорь Шевченко (2003-01-27 17:30) [38]smok_er (27.01.03 16:32)
Почта отменяется.
Hotmail automatically scans all attachments using McAfee.
Name of File Virus Scan Result
myie32src.zip Unknown virus scanner failure Virus Found
Вирусы, дружище, рассылай другим путем, плз
← →
gsu (2003-01-27 17:32) [39]И мне пошли (-:|~
← →
smok_er (2003-01-27 18:21) [40]Блин, я в шоке
там только cpp и h файлы.
Надо послать McAfee в одно место с такой проверкой на вирусы. Если уж они каждый зипарь за вирус принимают, это просто забавно.
Да и к тому же, Игорь, какой мне смысл Вас вирусить, если я еще не раз буду общаться на этом форуме?
myie32src.zip Unknown virus scanner failure Virus Found
А почему же этот крутой mmcafree не написал название вируса?
← →
Игорь Шевченко (2003-01-28 10:38) [41]smok_er (27.01.03 18:21)
Кроме cpp и h файлов там еще какие-то есть. Предлагаю эксперимент: вытирай все, кроме h и cpp и посылай. Заодно укажи модуль, из которого был выдернут кусок кода.
← →
Anatoly Podgoretsky (2003-01-28 10:45) [42]gsu © (27.01.03 17:32)
А тебе зачем вирус, в коллекцию?
smok_er (27.01.03 18:21)
Написал: Unknown virus
← →
smok_er (2003-01-28 11:18) [43]>>Кроме cpp и h файлов там еще какие-то есть.
Есть res еще.
ОК, сейчас выдерну и отправлю.
← →
Игорь Шевченко (2003-01-28 14:01) [44]Посмотрел. Вирусов там не обнаружил. При очень большом желании такое можно и Delphi написать. Но про ОЧЕНЬ БОЛЬШОМ желании и очень большом количестве свободного времени. Стоит ли овчинка выделки ?
← →
smok_er (2003-01-28 16:15) [45]Да, для меня действительно стоит.
Кстати, интересно для себя...
Для этого нужно VCL переделывать или можно без этого обойтись?
← →
Strumpf (2003-01-28 17:52) [46]Если можно, smok_er, киньте и мне на мыло Вашу задачу. Пишу на С++, имею свой интерес к поднятой теме...
← →
smok_er (2003-01-28 18:42) [47]OK! Сможете ли Вы мне сказать, как такое сделать на Delphi?
← →
Паша (2003-01-28 18:42) [48]>Можно ли этого избежать? Т.е. форма создалась, но не активизировалась?
Делай таким макаром:
procedure TFormMDI.FormCreate(Sender: TObject);
begin
Exclude(FFormState, fsVisible);
end;
чтобы показать форму:
FormMDI.Visible:= true;
работает железно.
← →
smok_er (2003-01-28 19:25) [49]Паша © (28.01.03 18:42)
Огромнейшее спасибо!!! Это как раз то, что надо!
Вот теперь имхо, тему можно закрыть.
← →
Игорь Шевченко (2003-01-29 12:44) [50]
> Делай таким макаром:
> procedure TFormMDI.FormCreate(Sender: TObject);
> begin
> Exclude(FFormState, fsVisible);
> end;
Вот же!
Не знал, спасибо!
С уважением,
Страницы: 1 2 вся ветка
Текущий архив: 2003.02.06;
Скачать: CL | DM;
Память: 0.56 MB
Время: 0.011 c