![]() |
GDI+ рисование на статике-перерисовка "заново"
Как можно нарисовав на статике одно изображение с прозрачностью, зарисовать его другим, тоже с прозрачностью, тоесть удалить первое изображение?
(если рисовать сразу поверх первого изображения, то прозрачные части первого совмещаются с прозрачными второго) Я думаю, может сначала зарисовать белым фоном, но то как то кустарно выйдет... |
Цитата:
|
Нет, не мерцание. Вот вся ситуация: на окне программы я нарисовал картинку, положил на окно программы Static, далее в статике я нарисовал полупрозрачное изображение. Далее я хочу стереть нарисованное изображение в Static, и на его место нарисовать другое полупрозрачное изображение(если не стереть старое, то два изображения просто накладываются одно на другое).
|
В смысле UpdateWindow сделать (перерисовать фон перед отрисовкой изображения на нём)? я не понял, можно кусочек кода? (со скриншотом)
|
Код:
hdc = BeginPaint(hhstatic1, &ps); Код:
VOID OnPaint(HDC hdc, int imagee) ![]() Скриншот(как должно быть): ![]() Тоесь мне надо отрисовать button.png, и по ходу выполнения программы на место button.png (именно на место, а не поверх) отрисовать button2.png. |
Понадобится объект, который ограничивает область действия.
Варианты: 1) использовать обрезку (clipping with region) - годится для простых форм (без прозрачности, с не сильно замысловатыми границами) оказывается второй способ прокатывает только для GDI и Direct3D |
pva, мне надо именно с прозрачностью, и с замысловатыми границами...
|
Придумал вот так-на форме два статика, в каждом своя картинка. По ходу выполнения кода я скрываю один статик, а показываю второй, НО нарисованное остается, надо либо перетянуть окно, либо изменить его размеры, что бы оно обновилось... А как можно окно обновить программно?
|
crashtuak, например вызвать InvalidateRect в первом параметре указав хендл статика, который нужно перерисовать (тем самым форсировав событие WM_PAINT для этого окна). Или UpdateWindow, про который вспоминал pva в 4м сообщении темы. Ещё вариант с подмигиванием - скрыть и отобразить окно.
pva, если бы второй способ работал, это бы было бы решением для темы *GdiPlus*| маски прозрачности? Считаю что для того, что б добиться результата со второго скрина от crashtuak, как раз и нужно применять маску. Да вот похоже такой встроенной функции в GDIplus нет, так что остаётся вариант по пиксельной обработки (а он достаточно медленный). Два изображения имеют одинаковые размеры, во втором, где проходят чёрные линии (линии маски), в первом по этим же координатам пиксели должны становится прозрачными. Вот только пока не знаю, как задать конкретному пикселю в изображении, что он должен быть прозрачным. Понемногу осваиваюсь с прямой работой с GDIplus (до этого имел дело через .NET врапер). Уже функцию с темы exe в скринсейвер на GdiPlus перенёс. |
Admiral, ни InvalidateRect ни UpdateWindow не помогает. Отрисовывается как надо только, например, при расположении какого нибудь другого окна над окном нашей программы...
-------------------------------------------------------------------- Извеняюсь, InvalidateRect обновило окно... |
Только вот при InvalidateRect появляется мерцание...
|
Admiral, по поводу масок прозрачности, если принципиальна скорость выполнения и много работы с перемножением картинок, а также не жалко ресурсов, то можно использовать d3d (совместно с GDI+ можно через поверхности IDirect3DSurface7, а можно и без GDI+). Я делал проигрыватель видеороликов "картинка в картинке", а-ля назойливая реклама в телеке. 1280x1024@30fps, GDI+ полностью загружает одно ядро, а d3d (перебрал все виды альфаблендинга) процентов на 5-10.
Если требуется небольшая картинка и скорость смены кадров 1-2 fps, то врукопашную перемножить 2 массива сгодится. С d3d алгоритм такой: на скрытую поверхность копируем часть экана, делаем что надо, копируем обратно. Окно, к которому привязан объект d3d - не показываем. В более поздних directX это сделано в Direct2D Цитата:
|
pva, c WS_EX_COMPOSITED вообще ничего не рисуется на форме... но то уже другая история:). Все мои запросы удовлетворила InvalidateRect(перерисовываю только нужную область, а не весь экран, потому и мерцания невидно).
|
А, вот ещё вспомнил, у борланда своё понимание корректности работы с WinAPI и скорости выполнения кода. В билдере
Код:
__fastcall TForm1::TForm1(TComponent* Owner) |
Время: 17:49. |
Время: 17:49.
© OSzone.net 2001-