Здравствуйте Дубовик Александр, Вы писали:
ДА>Как сделать ActiveX контрол с прозрачным фоном (windowed)?
Оконный — никак. Можно как и для любых окон попробовать SetWindowRgn, но не уверен, что все контейнеры это проглотят правильно. Kроме того, на отображение через IViewObject это никак не повлияет; где это аукнется, навскидку не помню.
ДА>Установки DECLARE_VIEW_STATUS не помогают.
Естественно, они же только для windowless имеют смысл.
Здравствуйте 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);
Здравствуйте Аноним, Вы писали:
А>Здравствуйте 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.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
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 — ну не хочет, зараза, за собой убирать. :)
В любом случае спасибо за ответ.
Здравствуйте Аноним, Вы писали:
А>Хммм... Да вопрос вобщем-то не про то А>Где рисовать я как-бы помню А>А в вашем примере добавляем в конструктор: m_bWindowOnly=TRUE; и выходим на суть вопроса — фон то белый (почти как спина). Можно-ли что либо сделать с ВИНДОВЫМ контролом? А код я приводил из OnEraseBkgnd — ну не хочет, зараза, за собой убирать. А>В любом случае спасибо за ответ.
Ой, блин. Про что-то я увлекся.
Ща попробуем...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте Аноним, Вы писали:
А>Хммм... Да вопрос вобщем-то не про то А>Где рисовать я как-бы помню А>А в вашем примере добавляем в конструктор: m_bWindowOnly=TRUE; и выходим на суть вопроса — фон то белый (почти как спина). Можно-ли что либо сделать с ВИНДОВЫМ контролом? А код я приводил из OnEraseBkgnd — ну не хочет, зараза, за собой убирать. А>В любом случае спасибо за ответ.