31 / 27 / 8
Регистрация: 25.05.2015
Сообщений: 113
|
|
1 | |
Activex перенести на задний план (позиция по оси z)20.01.2016, 15:01. Показов 1653. Ответов 13
Метки нет (Все метки)
Здравствуйте!
Проблема состоит в следующем... При добавлении в СКАДу (omron cx-supervisor) мой activex (написан в MFC C++) в RunTime режиме всегда идет поверх объектов, которые созданы в СКАДе (например Ellipse), даже если для объекта СКАДы я указываю Rise -> To Top, хотя в режиме разработки все нормально (axtivex можно передвинуть на задний план). Как сделать так чтобы мой activex оказался "ниже" объекта созданного в СКАДе (т.е. задать его положение по оси z)? В крайнем случае, как можно сделать чтобы он всегда был на заднем плане? Для другого activex (написан на VB6, но его писал не я) все нормально, его позиция по оси z сохраняется в runtime, значит такая возможность есть. Добавлено через 9 минут Хотя нет, сейчас проверил насчет activex написанного на VB6, все то же, что и для моего. На задний план не уходит. Вопрос остается, можно ли сделать так, чтобы activex перенесся на задний план при runtime?
0
|
20.01.2016, 15:01 | |
Ответы с готовыми решениями:
13
Поместить контролл на передний план, на задний план "по уровням" На задний план Графика, задний план Задний план. (Фон) |
31 / 27 / 8
Регистрация: 25.05.2015
Сообщений: 113
|
|
21.01.2016, 17:08 [ТС] | 2 |
Пришла мне одна идея в голову... А если взять изображение того, что под activex находится и накладывать сверху на то, что я рисую в activex? Добраться до формы на которой находится контейнер с моим activex могу. Только как захватывать все кроме заднего фона формы на которой расположен activex?
0
|
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,410
|
|
21.01.2016, 20:09 | 3 |
Могу ошибаться но наверняка активикс это какое нибудь дочернее окно и ему можно послать сообщение передвинуться назад
0
|
31 / 27 / 8
Регистрация: 25.05.2015
Сообщений: 113
|
||||||
21.01.2016, 23:21 [ТС] | 4 | |||||
0
|
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,410
|
||||||
22.01.2016, 10:07 | 5 | |||||
попробуйте
0
|
31 / 27 / 8
Регистрация: 25.05.2015
Сообщений: 113
|
|
22.01.2016, 11:07 [ТС] | 6 |
К сожалению результата никакого, т.е. activex все равно остался поверх того, что я нарисовал в СКАДе непосредственно, но ушел вниз еще одного activex который я на него наложил для эксперимента.
0
|
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,410
|
|
22.01.2016, 13:02 | 7 |
хм.. ну тогда перебрать все дочерние окна того окна на котором лежит activex и послать их на передний план
Добавлено через 46 секунд кроме самого activex естественно
0
|
31 / 27 / 8
Регистрация: 25.05.2015
Сообщений: 113
|
|
22.01.2016, 13:38 [ТС] | 8 |
В том то и дело, что activex это, по ходу, дочернее окно, а кнопки и рисунки на форме это контролы формы... (я не уверен, если не прав, то поправьте). GetAccessibleChildCount для формы выводит только количество моих activex на форме, а кнопки и рисунки не считает. Хотя странно, что в редакторе СКАДы (когда я рисую, добавляю кнопки и т.д.) можно activex на задний план отправить, а когда запускаю весь проект на выполнение, то activex`ы все вперед вылазят.
0
|
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,410
|
|
22.01.2016, 14:36 | 9 |
может скадовские кнопки и прочие элементы реализованы не на базе окна. тогда вилы.
0
|
31 / 27 / 8
Регистрация: 25.05.2015
Сообщений: 113
|
|||||||||||
24.01.2016, 00:10 [ТС] | 10 | ||||||||||
Я вернулся к варианту, при котором беру изображение из под activex и накладываю его поверх того, что рисую в activex`е. Вот код OnDraw который у меня получился.
Добавлено через 10 минут Такое впечатление, что TransparentBlt вообще ничего не делает. Добавлено через 8 часов 47 минут Сделал я копирование участка формы на свой activex. Проблема с TransparentBlt оказалась в несоответствии размеров того, что копирую к тому куда копирую. Но проблема возникла в другом. Если я копирую область формы на свой activex то он тоже копируется (в картинке отображается и activex и если открыть окно над activex, то его изображение тоже захватывается). Как сделать чтобы в картинку захватывалось изображение только того, что находится под моим activex?
0
|
31 / 27 / 8
Регистрация: 25.05.2015
Сообщений: 113
|
||||||
25.01.2016, 11:42 [ТС] | 11 | |||||
Продолжаем разговор Посмотрел я тут про WM_PRINT и написал следующий код:
По идее, как я это все понимаю, надо захватить все элементы кроме дочерних окон, так как GetAccessibleChildCount выдает только количество отображенных на форме activex. Вопрос, можно ли с помощью WM_PRINT это сделать и, если можно, то как это сделать? Если нельзя, то подскажите куда копать дальше? Добавлено через 10 минут Забыл написать, в эту функцию посылаю HWND окна которое под моим activex находится.
0
|
31 / 27 / 8
Регистрация: 25.05.2015
Сообщений: 113
|
|
25.01.2016, 12:47 [ТС] | 12 |
И еще в догонку скрин того, что Spy++ показывает. Как я и думал, activex это дочерние окна...
0
|
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
|
|
28.01.2016, 13:12 | 13 |
Похоже так и есть, все контролы СКАДы главное окно рисует само в своём обработчике WM_PAINT, а отрисовка дочерних окон выполняется после пользовательской обработки WM_PAIN. Поэтому как уже заметили выше:
Дело в том, что для вашего ActiveX отрисовка всего содержимого родительского окна (не включая другие дочерние окна) является "неделимой" операцией и вклиниться между какими-то контролами не получится. Сначала я предположил что поможет посылка WM_PRINTCLIENT главному окну из WM_PAINT ActiveX окна, но наверняка также будет перерисован и фон окна, тогда ваш элемент будет совсем невидим.
0
|
31 / 27 / 8
Регистрация: 25.05.2015
Сообщений: 113
|
|
29.01.2016, 20:19 [ТС] | 14 |
Кстати, почитал я статью feng yuan`я насчет установки хука на BeginPaint и EndPaint, попробовал, в принципе получаю скриншет именно того, что надо (контролы СКАДы + фон), но только один раз, после СКАДа падает с ошибкой, хотя окна типа блокнот и т.д. нормально выживают (пробовал на x32 винде). Да и вызывать по его методу перерисовку всего экрана скады хотя бы раз в секунду, для получения изображения из под каждого activex как то "не комельфо"... Думаю это внесет тормоза в работу системы, что плохо. Пришел к решению завести еще activex типа "лампочка" для вывода значений датчиков над моим activex и сделать фон моего activex прозрачным (это получилось). Я понимаю, что это тоже не красивый выход из положения, но лучше чем постоянно перерисовывать главный экран СКАДы, тем более, что таких датчиков, которые надо показывать поверх моих activex не очень много.
0
|
29.01.2016, 20:19 | |
29.01.2016, 20:19 | |
Помогаю со студенческими работами здесь
14
Слайдер на задний план Картинка на задний план Как поместить на задний план? Компонент StringGrid на задний план Картинка на задний план groupbox Рисунок на задний план в Excel Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |