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.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.