singlepost

Заморочка с MDI << На главную или назад  

Доброго времени суток!
Имеется несколько прог. Нужно, чтобы все они открывались в родительском окне в качестве дочерних и обменивались данными. Ну обмен данными я как-нибудь осуществлю, хоть через те же каналы, а вот как все это в виде MDI сделать – хз..
Подскажите, плз, в какую сторону копать.

26 ответов в теме “Заморочка с MDI”

  1. 24
    Константин Смотритель ответил:

    Ну, Акцесс крут =) Тогда следовало сформулировать совет как "сделай ещё одно окно, которое заменит клиентскую область" =)

  2. 23
    Леонид Максимов ответил:

    Константин. я боролся с акцессом, отбирая у него форму. так вот, в акцессе MDI-область – отдельное окно.

  3. 22
    Артем Валиев ответил:

    я так и делал. и топмост панельке, и все, что угодно. только не помогало. да и фиг с ним.. работает – и ладно. не для себя ведь делаю)))

    ЗЫ пасибо всем за помощь

  4. 21
    Константин Смотритель ответил:

    Леонид, ну тут вы не правы. Клиенсткая область – это не отдельное окно =)Поправите? =)

    Наверное, Леонид имел в виду, что панель – это ещё одно окно, у которого основное – родитель, также, как у наших процессов. Вот с ним Артём и поборолся z-order'om =) Артём, ты поставь z-order = top непосредственно панельке =) И не надо будет WM_PAINT кошмарить =) То есть сначала ставишь topпроцессу, потом панельке. Ещё можно попытаться поработать с функциям инастройки clientrect – это даже проще…

    Но, впрочем, раз и так всё работает (да ещё и глюк пропал) – то оставь, как есть =)
    Удачи!

  5. 20
    Леонид Максимов ответил:

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

  6. 19
    Артем Валиев ответил:

    проблема решена выставлением z-ordera каждый раз при WM_PAINT))
    ппц)))

  7. 18
    Константин Смотритель ответил:

    А как Леонид написал, заработало? ;-)
    (Его тож не забудь поблагодарить =)

    Что конкретно не заработало – z-order или topmost? Что пишет Spy о стилях и прочем? От тебя ни инфы, ни благодарностей – всё вырывать с усилием приходится =)

    P.S. Вкрай, если мы тебе не поможем, иди на rsdn.ru – там спецы сидят, вмиг подскажут…. раз уж гуглить не умеешь – хотелось тебя поучить =)))

  8. 17
    Артем Валиев ответил:

    да-да!! Леониду тож спасибо!! за желание помочь

    неа)) вот как раз когда выставляю WS_CHILD, окно пропадает. и никакие комбинации z-ordera не помогают..
    когда не выставляю, все работает..
    теперь проблема в том, что нужно, чтобы дочернее окно не прорисовывалось над панелью на главной форме.

  9. 16
    Артем Валиев ответил:

    благодарю, конеш, про сетпарент не знал

    неа, не заработало ;) ;)

  10. 15
    Леонид Максимов ответил:

    обратите внимание, что устанавливать стиль WS_CHILD следует до вызова SetParent.

  11. 14
    Леонид Максимов ответил:

    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.

  12. 13
    Артем Валиев ответил:

    ну пусть пока так… хоть на одном компе, да работает %)

    хорошо, что я не начал перехватчики сообщений писать)))

  13. 12
    Константин Смотритель ответил:

    Артём, ты про 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

    Ура, заработало? ;-)

  14. 11
    Константин Смотритель ответил:

    > хорошо, что я не начал перехватчики сообщений писать)))
    Я же говорю, читай Гугл. Не читаешь гугл – вот мог бы и поплатиться =) ты думаешь, я это всё делал когда-нить по пять раз на дню? ;-) Нет, мне просто стало интересно, вот я и почитал гугл 15 минут. Что мешало следать это тебе – я до сих пор непойму О_о

    Да, и где благодарности?! О_о

  15. 10
    Артем Валиев ответил:

    странно… вот простейший код (кстати, без всяких WS_CHILDов):

    hnd:=findwindow(nil,'Form3');
    windows.setparent(hnd,handle);

    сейчас он работает просто замечательно. на другом компе некоторым временем раньше он не работал. он тупо скрывал дочернее окно и не отображал в родительском

  16. 9
    Леонид Максимов ответил:

    на самом деле мне это просто не так давно встретилось :)

    требовалось при сворачивании акцесса оставлять одну из его форм поверх других. она, правда, всячески сопротивляется (постоянно сбрасывая topmost, не давая по умолчанию развернуть акцесс кликом по таскбару и тому подобные мелкие пакости); ну да ничего – все довольно предсказуемо.

    ЗЫ:
    о, новое сообщение как раз описывает похожие проблемы %)

  17. 8
    Константин Смотритель ответил:

    Ещё вариант – принудительно установить 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. Выходит, Леонид первым же постом дал правильный ответ… я тут лишь разжевал реализацию для случая процессов =))))

  18. 7
    Константин Смотритель ответил:

    Как более простой (а, возможно, единственный) вариант – перехватывать сообщения окнам процесса (типа WM_SIZE и WM_MOVE) и не давать окнам выходить за рамки окна (придётся и WM_PAINT перехватывать, чтобы подменять PAINTSTRUCT для отказа в прорисовке кусков окна, которые всё-таки вышли за край). Второе – чуть более сложно, но можно. Первоначальное положение в любом случае той же STARTUPINFO задаётся (если, конечно, программы правильно написаны и при старте учитывают все параметры WinMain).

  19. 6
    Артем Валиев ответил:

    лан, сорри
    бум думать
    вот про вариант с CreateProcess я не подумал.. ща буду обсасывать))

  20. 5
    Артем Валиев ответил:

    ептыть… да создам я это окно дочернее
    имелись ввиду другие проги
    у меня есть прога (окно-родитель)
    есть еще несколько прог в виде ехешников ну или на крайняк дллек (окна-дочери)

    пример
    у меня есть прога parent.exe. тупо форма
    у меня есть проги 1.exe, 2.exe, 2.exe. тупо формы
    как сделать, чтобы 1,2,3 были для parent дочерними?

  21. 4
    Константин Смотритель ответил:

    Да, о таком варианте я тоже подумал. Но ты заметь: ни Леонид, ни я не стали копать в направлении процессов. Как думаешь, это мы не умеем читать или кто-то не умеет задавать вопросов? ;-) Так что "ептыть" в твоём случае неприемлимо, согласись? Ждём извинений =)

    В любом случае, мой поинт про Гугл остаётся в силе. //msdn.microsoft.com/en-us/library/ms687098(VS.85).aspx – помогло, или я попутался и это для терминалов?

    (обрати внимание, что ссылку надо скопировать)

    P.S. Не буду тебе писать таких вещей, что имя созданного десктопа надо передавать в STARTUPINFO для CreateProcess… Думаю, это ты и так найдёшь =)

  22. 3
    Константин Смотритель ответил:

    Дружище, ты как с Луны свалился. Буду такие темы удалять, честное слово – нельзя так. Ты бы лучше задал вопрос "как пользоваться Гуглом", только не в группе Программистов.

    //msdn.microsoft.com/en-us/library/ms632591(VS.85).aspx

    (обрати внимание, что ссылку надо скопировать)

  23. 2
    Артем Валиев ответил:

    Леонид maxleo Максимов
    пасиб за помощь)

    нууу… никто не сталкивался, что ль?

  24. 1
    Леонид Максимов ответил:

    WS_CHILD или вроде того.

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.