Ветеран
Сообщения: 3320
Благодарности: 916
|
Профиль
|
Отправить PM
| Цитировать
crashtuak, например вызвать InvalidateRect в первом параметре указав хендл статика, который нужно перерисовать (тем самым форсировав событие WM_PAINT для этого окна). Или UpdateWindow, про который вспоминал pva в 4м сообщении темы. Ещё вариант с подмигиванием - скрыть и отобразить окно.
pva, если бы второй способ работал, это бы было бы решением для темы *GdiPlus*| маски прозрачности?
Считаю что для того, что б добиться результата со второго скрина от crashtuak, как раз и нужно применять маску. Да вот похоже такой встроенной функции в GDIplus нет, так что остаётся вариант по пиксельной обработки (а он достаточно медленный).
Два изображения имеют одинаковые размеры, во втором, где проходят чёрные линии (линии маски), в первом по этим же координатам пиксели должны становится прозрачными.
Вот только пока не знаю, как задать конкретному пикселю в изображении, что он должен быть прозрачным.
Понемногу осваиваюсь с прямой работой с GDIplus (до этого имел дело через .NET врапер).
Уже функцию с темы exe в скринсейвер на GdiPlus перенёс.
читать дальше »
Код:
void GeneratorTsvetnyhPolos_GdiPlus(HDC *hDc, RECT *rectBar, int OffSet)
{
Graphics g(*hDc);
g.SetPageUnit(UnitPixel);
g.FillRectangle(new SolidBrush(Color(255, 255, 255, 255)), Rect (rectBar->left, rectBar->top, rectBar->right, rectBar->bottom));
rectBar->left = rectBar->right;
rectBar->right += OffSet;
g.FillRectangle(new SolidBrush(Color(255, 196, 196, 0)), Rect (rectBar->left, rectBar->top, rectBar->right, rectBar->bottom));
rectBar->left = rectBar->right;
rectBar->right += OffSet;
g.FillRectangle(new SolidBrush(Color(255, 0, 196, 196)), Rect (rectBar->left, rectBar->top, rectBar->right, rectBar->bottom));
rectBar->left = rectBar->right;
rectBar->right += OffSet;
g.FillRectangle(new SolidBrush(Color(255, 0, 196, 0)), Rect (rectBar->left, rectBar->top, rectBar->right, rectBar->bottom));
rectBar->left = rectBar->right;
rectBar->right += OffSet;
g.FillRectangle(new SolidBrush(Color(255, 196, 0, 196)), Rect (rectBar->left, rectBar->top, rectBar->right, rectBar->bottom));
rectBar->left = rectBar->right;
rectBar->right += OffSet;
g.FillRectangle(new SolidBrush(Color(255, 196, 0, 0)), Rect (rectBar->left, rectBar->top, rectBar->right, rectBar->bottom));
rectBar->left = rectBar->right;
rectBar->right += OffSet;
g.FillRectangle(new SolidBrush(Color(255, 0, 0, 196)), Rect (rectBar->left, rectBar->top, rectBar->right, rectBar->bottom));
rectBar->left = rectBar->right;
rectBar->right += OffSet;
g.FillRectangle(new SolidBrush(Color(255, 0, 0, 0)), Rect (rectBar->left, rectBar->top, rectBar->right, rectBar->bottom));
}
|