Форум: "Основная";
Текущий архив: 2003.05.22;
Скачать: [xml.tar.bz2];
ВнизWS_EX_TRANSPARENT и не только Найти похожие ветки
← →
klyonov (2003-05-08 17:19) [0]Привет всем. Уже не раз сюда писал на эту тему и получал полезные ответы, но "не все ладно в датском королевстве" или как там...
В общем так, надо сделать что-то вроде IDE Delphi в смысле перетягивания границ объектов и самих объектов. Использовал этот самый стиль прозрачности и все почти получилось, работает все хорошо и аккуратно за двумя исключениями, а именно:
1. Как мне сделать так, чтобы окно со стилем WS_EX_TRANSPARENT всегда рисовало при получении WM_PAINT все, что что я в этом обработчике написал?
2. Как сделать так, чтобы родители окна с таким стилем не "игнорировали" его при своей перерисовке? Поясню: когда перерисовывается, например, панель и при этом перерисовка не затронула окно с этим стилем, расположенное на панели, она не посылает WM_PAINT дочернему окну, но и не исключает из своей области перерисовки регион окна, и затирает его, естественно. Для обычных окон панель исключит область ими занятую из области своей перерисовки, если эти окна не были изменены.
← →
klyonox (2003-05-09 16:01) [1]Никто не знает ничего по этой теме, что-ли? Или я что непонятно написал?
← →
Malder (2003-05-09 16:25) [2]Я не понял с самого начала, про IDE Delphi и как связан с ним WS_EX_TRANSPARENT, да еще "смысле перетягивания границ объектов и самих объектов"
← →
klyonov (2003-05-10 09:17) [3]Я имел ввиду под "IDE Delphi в смысле перетягивания границ объектов и самих объектов" тот прямоугольничек с 8-ю черными квадратиками, который появляется когда щелкаешь на кнопку на форме, например. Ну и потом можно перетянуть или растянуть эту самую кнопку. Я сделал контрол для этого с помощью WS_EX_TRANSPARENT. Работает почти как в самой Delphi за двумя исключениями, которые я и описал в вопросе.
← →
Юрий Зотов (2003-05-10 15:08) [4]> klyonov
1. Вообще говоря, в Delphi сделано немного хитрее - каждый из этих черных квадратиков (маркеров) тоже является самостоятельным объектом (потомком TWinControl). У него проставлены свойства Cololr и Cursor, он знает, к какому именно редактируемому компоненту он привязан (и в каком месте), он умеет перемещаться вслед за мышью (и при этом влияет на другие маркеры и размер редактируемого контрола) - и т.п.
2. По сабжу. Вот выдержка из MSDN по поводу WS_EX_TRANSPARENT:
A window created with this style receives WM_PAINT messages only after all sibling windows beneath it have been updated.
Значит, если в обработчике WM_PAINT сначала получить "снимок" картинки под собой, затем вызвать стандартный обработчик, а затем отрисовать этот же снимок на родительском окне, то, вроде бы, все должно быть нормально. Или можно не вызывать стандартный обработчик, а рисовать этот же снимок на собственной канве - тогда и прозрачность не потребуется.
3. На "Королевстве" есть библиотека FormRgn Антона Григорьева. В ней, помимо прочего, реализована возможность создания прозрачных окон. Для экс-СССР - бесплатная, с исходниками - можно скачать и посмотреть. Аналогичные компоненты есть на Torry (ищите по слову Transparent), но про них я ничего сказать не могу, а вот с Антоном мы заочно знакомы и могу заверить, что это грамотный и аккуратный Component Writer.
4. Вы указали D6 и W2k. Насколько я в курсе, при этом сочетании прозрачность реализована уже в самой VCL. Тоже можно посмотреть.
5. Все же я не уверен, что Вы идете лучшим путем. Возможно, есть смысл создавать маркеры в виде самостоятельных оконных контролов и делать растяжку с их помощью, а перемещение и все остальное делать через хуки на мышь и клаву, которые просто вызывают нужные методы глобального а-ля FormDesigner"а. Кстати, в последнем случае появляется возможность ввести в FormDesigner список выделенных компонентов и редактировать их совместно (а-ля SelectionList). Да и вообще, при создании своего аналога FormDesigner"а все получается сосредоточенным в одном месте - легче модифицировать, отлаживать и т. д.
6. Зайдите на www.dream-com.com. Там Вы найдете все уже готовое. Разумеется, не бесплатно, но решение уж Вы принимайте сами (или со своим начальством, если оно есть).
← →
klyonov (2003-05-10 17:20) [5]2 Юрий Зотов: Спасибо за помощь.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.05.22;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c