Доброго времени суток!
Имеется несколько прог. Нужно, чтобы все они открывались в родительском окне в качестве дочерних и обменивались данными. Ну обмен данными я как-нибудь осуществлю, хоть через те же каналы, а вот как все это в виде MDI сделать – хз..
Подскажите, плз, в какую сторону копать.
9 мая 2009 в 17:02
Ну, Акцесс крут =) Тогда следовало сформулировать совет как "сделай ещё одно окно, которое заменит клиентскую область" =)
9 мая 2009 в 9:05
Константин. я боролся с акцессом, отбирая у него форму. так вот, в акцессе MDI-область – отдельное окно.
9 мая 2009 в 9:03
я так и делал. и топмост панельке, и все, что угодно. только не помогало. да и фиг с ним.. работает – и ладно. не для себя ведь делаю)))
ЗЫ пасибо всем за помощь
9 мая 2009 в 1:03
Леонид, ну тут вы не правы. Клиенсткая область – это не отдельное окно =)Поправите? =)
Наверное, Леонид имел в виду, что панель – это ещё одно окно, у которого основное – родитель, также, как у наших процессов. Вот с ним Артём и поборолся z-order'om =) Артём, ты поставь z-order = top непосредственно панельке =) И не надо будет WM_PAINT кошмарить =) То есть сначала ставишь topпроцессу, потом панельке. Ещё можно попытаться поработать с функциям инастройки clientrect – это даже проще…
Но, впрочем, раз и так всё работает (да ещё и глюк пропал) – то оставь, как есть =)
Удачи!
9 мая 2009 в 0:02
чтобы оно не прорисовывалось над панелью управления главной формы, предком следует делать клиентскую область родительского окна.
9 мая 2009 в 0:01
проблема решена выставлением z-ordera каждый раз при WM_PAINT))
ппц)))
8 мая 2009 в 23:04
А как Леонид написал, заработало?
(Его тож не забудь поблагодарить =)
Что конкретно не заработало – z-order или topmost? Что пишет Spy о стилях и прочем? От тебя ни инфы, ни благодарностей – всё вырывать с усилием приходится =)
P.S. Вкрай, если мы тебе не поможем, иди на rsdn.ru – там спецы сидят, вмиг подскажут…. раз уж гуглить не умеешь – хотелось тебя поучить =)))
8 мая 2009 в 23:04
да-да!! Леониду тож спасибо!! за желание помочь
неа)) вот как раз когда выставляю WS_CHILD, окно пропадает. и никакие комбинации z-ordera не помогают..
когда не выставляю, все работает..
теперь проблема в том, что нужно, чтобы дочернее окно не прорисовывалось над панелью на главной форме.
8 мая 2009 в 23:01
благодарю, конеш, про сетпарент не знал
неа, не заработало
8 мая 2009 в 23:01
обратите внимание, что устанавливать стиль WS_CHILD следует до вызова SetParent.
8 мая 2009 в 23:00
WS_CHILD нужен: //msdn.microsoft.com/en-us/library/ms633541(VS.85).aspx
For compatibility reasons, SetParent does not modify the WS_CHILD or WS_POPUP window styles of the window whose parent is being changed. Therefore, if hWndNewParent is NULL, you should also clear the WS_CHILD bit and set the WS_POPUP style after calling SetParent. Conversely, if hWndNewParent is not NULL and the window was previously a child of the desktop, you should clear the WS_POPUP style and set the WS_CHILD style before calling SetParent.
8 мая 2009 в 22:05
ну пусть пока так… хоть на одном компе, да работает %)
хорошо, что я не начал перехватчики сообщений писать)))
8 мая 2009 в 22:05
Артём, ты про WS_CHILD сильно не ругайся – я последний раз этой темы лет 10 назад касался (позже писал только простые приложения). Я бы тут ничего и не отвечал даже, но вижу – тема застопорилась, решил тряхнуть стариной =) Согласен, пожалуй, WS_CHILD не нужен – это несколько иное.
Теперь по поводу глюка. Как подсказал Леонид, вероятно, родительское окно просто закрывает собой дочернее – ты про z-order покопался в MSDN? Про стиль WS_TOPMOST (WS_EX_TOPMOST) ? ИМХО, ты ведь не MDI приложение пока сделал, а только заставил окно считать другое родительским.
Я надеюсь, на обоих компах ты проверял одни и те же приложения (одинаковые версии, можешь поручиться?) Запусти Spy, посмотри стили окон твоих процессов. Поиграйся со стилем WS_TOPMOST – посмотри по Spy, о чём говорит Леонид: сбрасывается ли этот стиль?
Лично я бы воспользовался не WS_TOPMOST (т.к. это всё-таки другое), а покопал бы в сторону z-order – см. второй параметр SetWindowPos() //msdn.microsoft.com/en-us/library/ms633545(VS.85).aspx
Ура, заработало?
8 мая 2009 в 22:05
> хорошо, что я не начал перехватчики сообщений писать)))
Я же говорю, читай Гугл. Не читаешь гугл – вот мог бы и поплатиться =) ты думаешь, я это всё делал когда-нить по пять раз на дню? Нет, мне просто стало интересно, вот я и почитал гугл 15 минут. Что мешало следать это тебе – я до сих пор непойму О_о
Да, и где благодарности?! О_о
8 мая 2009 в 22:03
странно… вот простейший код (кстати, без всяких WS_CHILDов):
hnd:=findwindow(nil,'Form3');
windows.setparent(hnd,handle);
сейчас он работает просто замечательно. на другом компе некоторым временем раньше он не работал. он тупо скрывал дочернее окно и не отображал в родительском
8 мая 2009 в 22:03
на самом деле мне это просто не так давно встретилось
требовалось при сворачивании акцесса оставлять одну из его форм поверх других. она, правда, всячески сопротивляется (постоянно сбрасывая topmost, не давая по умолчанию развернуть акцесс кликом по таскбару и тому подобные мелкие пакости); ну да ничего – все довольно предсказуемо.
ЗЫ:
о, новое сообщение как раз описывает похожие проблемы %)
8 мая 2009 в 14:03
Ещё вариант – принудительно установить parent окно, и принудительно выставить стиль WS_CHILD – см. SetParent() //msdn.microsoft.com/en-us/library/ms633541(VS.85).aspx
Как выставить стиль WS_CHILD – SetWindowLong() //msdn.microsoft.com/en-us/library/ms633591(VS.85).aspx – тока не забудь выполнить GetWindowLong() чтобы сохранить текущие стили.
Получить хендл окна можно с помощью FindWindow() //msdn.microsoft.com/en-us/library/ms633499(VS.85).aspx – зная класс окна (используй Spy) и титл.
(обрати внимание, что ссылки надо скопировать)
P.S. Выходит, Леонид первым же постом дал правильный ответ… я тут лишь разжевал реализацию для случая процессов =))))
8 мая 2009 в 14:02
Как более простой (а, возможно, единственный) вариант – перехватывать сообщения окнам процесса (типа WM_SIZE и WM_MOVE) и не давать окнам выходить за рамки окна (придётся и WM_PAINT перехватывать, чтобы подменять PAINTSTRUCT для отказа в прорисовке кусков окна, которые всё-таки вышли за край). Второе – чуть более сложно, но можно. Первоначальное положение в любом случае той же STARTUPINFO задаётся (если, конечно, программы правильно написаны и при старте учитывают все параметры WinMain).
8 мая 2009 в 14:02
лан, сорри
бум думать
вот про вариант с CreateProcess я не подумал.. ща буду обсасывать))
8 мая 2009 в 14:00
ептыть… да создам я это окно дочернее
имелись ввиду другие проги
у меня есть прога (окно-родитель)
есть еще несколько прог в виде ехешников ну или на крайняк дллек (окна-дочери)
пример
у меня есть прога parent.exe. тупо форма
у меня есть проги 1.exe, 2.exe, 2.exe. тупо формы
как сделать, чтобы 1,2,3 были для parent дочерними?
8 мая 2009 в 14:00
Да, о таком варианте я тоже подумал. Но ты заметь: ни Леонид, ни я не стали копать в направлении процессов. Как думаешь, это мы не умеем читать или кто-то не умеет задавать вопросов? Так что "ептыть" в твоём случае неприемлимо, согласись? Ждём извинений =)
В любом случае, мой поинт про Гугл остаётся в силе. //msdn.microsoft.com/en-us/library/ms687098(VS.85).aspx – помогло, или я попутался и это для терминалов?
(обрати внимание, что ссылку надо скопировать)
P.S. Не буду тебе писать таких вещей, что имя созданного десктопа надо передавать в STARTUPINFO для CreateProcess… Думаю, это ты и так найдёшь =)
7 мая 2009 в 22:02
Дружище, ты как с Луны свалился. Буду такие темы удалять, честное слово – нельзя так. Ты бы лучше задал вопрос "как пользоваться Гуглом", только не в группе Программистов.
//msdn.microsoft.com/en-us/library/ms632591(VS.85).aspx
(обрати внимание, что ссылку надо скопировать)
7 мая 2009 в 18:00
Леонид maxleo Максимов
пасиб за помощь)
нууу… никто не сталкивался, что ль?
6 мая 2009 в 22:04
WS_CHILD или вроде того.