Прозрачный фон для контрола
От: Дубовик Александр  
Дата: 29.11.01 01:24
Оценка:
Как сделать ActiveX контрол с прозрачным фоном (windowed)?
Установки DECLARE_VIEW_STATUS не помогают.
Re: Прозрачный фон для контрола
От: Alex Fedotov США  
Дата: 29.11.01 04:26
Оценка:
Здравствуйте Дубовик Александр, Вы писали:

ДА>Как сделать ActiveX контрол с прозрачным фоном (windowed)?


Оконный — никак. Можно как и для любых окон попробовать SetWindowRgn, но не уверен, что все контейнеры это проглотят правильно. Kроме того, на отображение через IViewObject это никак не повлияет; где это аукнется, навскидку не помню.

ДА>Установки DECLARE_VIEW_STATUS не помогают.


Естественно, они же только для windowless имеют смысл.
-- Alex Fedotov
Re[2]: Прозрачный фон для контрола
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.11.01 14:57
Оценка:
Здравствуйте Alex Fedotov, Вы писали:

AF>Здравствуйте Дубовик Александр, Вы писали:


ДА>>Как сделать ActiveX контрол с прозрачным фоном (windowed)?


AF>Оконный — никак.


Можно и оконный.

AF> Можно как и для любых окон попробовать SetWindowRgn, но не уверен, что все контейнеры это проглотят правильно.


Проглотят за милую душу. В спецификацию OCX даже вхоидт поддержка регионов для контролов и обработка сообщений мыши...


Можно и просто транспарент для окна поставить.


Главное понимать, что прозрачность должен поддерживть и контейнер. VB это дело поддерживает... в сишных приложениях за всегда самому можно схимичить. Короче, нужно смотреть по месту.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Прозрачный фон для контрола
От: Аноним  
Дата: 30.11.01 07:20
Оценка:
Здравствуйте VladD2, Вы писали:

VD>Можно и просто транспарент для окна поставить.


Проблема такая: Создан контрол (окно), сверху еще одно окно (child для контрола). В child окно вывожу текст. Оба окна сделал транспарентнымию. Но при смене содержимого окна старый текст не убирается, пока не перекрываю контейнер каким нибудь другим окном.
В обоих окнах OnEraseBkgnd:
::SetBkMode(hDC, TRANSPARENT);
POINT pt={0,0}, ptp;
HDC pDc=::GetDC(m_pParent->m_hWnd);
MapWindowPoints(m_pParent->m_hWnd, &pt,1);
::SetWindowOrgEx(pDc,pt.x, pt.y, &ptp);
::SendMessage(m_pParent->m_hWnd, WM_ERASEBKGND,(WPARAM)pDc, 0L);
::SetWindowOrgEx(pDc,0,0, &ptp);
ReleaseDC(pDc);

Как очистить child?
Re[4]: Прозрачный фон для контрола
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.11.01 22:52
Оценка:
Здравствуйте Аноним, Вы писали:

А>Здравствуйте VladD2, Вы писали:


VD>>Можно и просто транспарент для окна поставить.


А>Проблема такая: Создан контрол (окно), сверху еще одно окно (child для контрола). В child окно вывожу текст. Оба окна сделал транспарентнымию. Но при смене содержимого окна старый текст не убирается, пока не перекрываю контейнер каким ни будь другим окном.

А>В обоих окнах OnEraseBkgnd:
А> ::SetBkMode(hDC, TRANSPARENT);
А> POINT pt={0,0}, ptp;
А> HDC pDc=::GetDC(m_pParent->m_hWnd);
А> MapWindowPoints(m_pParent->m_hWnd, &pt,1);
А> ::SetWindowOrgEx(pDc,pt.x, pt.y, &ptp);
А> ::SendMessage(m_pParent->m_hWnd, WM_ERASEBKGND,(WPARAM)pDc, 0L);
А> ::SetWindowOrgEx(pDc,0,0, &ptp);
А> ReleaseDC(pDc);

А>Как очистить child?


Блин. Ктоже так рисует? :)

Замени свой код на отрисовку в WM_PAINT или в этом, как его там, в OnDraw. Сам текст, графику и т.п. кэшируешь в переменных класса.

В месте где нужно обновить изображение вызывешь:

InvalidateVindow(NULL);
UpdateWindow();

При этом вызовутся WM_ERASEBKGND и WM_PAINT.

А вызывать WM_ERASEBKGND из отрисовки вообще нельзя.

Да и рисование нужно начинать (если конечно обрабатываешь WM_PAINT) с помощью BeginPaint, а завершать с помощью EndPaint.


Здесь ftp://ftp.optim.ru/pub/Tests/TranspAx/TranspAx.zip лежит пример наклепанный мной. Ax реализованный на C++/ATL и тест не VB. В нем можно по изменять текст и посмотреть как отрисовывается Ax.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Прозрачный фон для контрола
От: Аноним  
Дата: 01.12.01 07:50
Оценка:
Здравствуйте VladD2, Вы писали:

VD>Здравствуйте Аноним, Вы писали:


А>>Здравствуйте VladD2, Вы писали:


VD>>>Можно и просто транспарент для окна поставить.


VD>Блин. Ктоже так рисует? :)


VD>Здесь ftp://ftp.optim.ru/pub/Tests/TranspAx/TranspAx.zip лежит пример наклепанный мной. Ax реализованный на C++/ATL и тест не VB. В нем можно по изменять текст и посмотреть как отрисовывается Ax.


Хммм... Да вопрос вобщем-то не про то
Где рисовать я как-бы помню :)
А в вашем примере добавляем в конструктор: m_bWindowOnly=TRUE; и выходим на суть вопроса — фон то белый (почти как спина). Можно-ли что либо сделать с ВИНДОВЫМ контролом? А код я приводил из OnEraseBkgnd — ну не хочет, зараза, за собой убирать. :)
В любом случае спасибо за ответ.
Re[6]: Прозрачный фон для контрола
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.12.01 13:05
Оценка:
Здравствуйте Аноним, Вы писали:

А>Хммм... Да вопрос вобщем-то не про то

А>Где рисовать я как-бы помню
А>А в вашем примере добавляем в конструктор: m_bWindowOnly=TRUE; и выходим на суть вопроса — фон то белый (почти как спина). Можно-ли что либо сделать с ВИНДОВЫМ контролом? А код я приводил из OnEraseBkgnd — ну не хочет, зараза, за собой убирать.
А>В любом случае спасибо за ответ.

Ой, блин. Про что-то я увлекся.

Ща попробуем...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Прозрачный фон для контрола
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.12.01 15:07
Оценка:
Здравствуйте Аноним, Вы писали:

А>Хммм... Да вопрос вобщем-то не про то

А>Где рисовать я как-бы помню
А>А в вашем примере добавляем в конструктор: m_bWindowOnly=TRUE; и выходим на суть вопроса — фон то белый (почти как спина). Можно-ли что либо сделать с ВИНДОВЫМ контролом? А код я приводил из OnEraseBkgnd — ну не хочет, зараза, за собой убирать.
А>В любом случае спасибо за ответ.

Да, поторопился я.

Ну, ладно лови правильный вариант. Там же ftp://ftp.optim.ru/pub/Tests/TranspAx/TranspAx.zip
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.