Форум: "WinAPI";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];
ВнизКое-что о прозрачности окон Найти похожие ветки
← →
onyx (2004-11-03 13:16) [0]Вот нашел в старых форумах:
Круглое/овальное/с дыркой/etc -- это не прозрачность. Прозрачность
делается не так.
Вот формула для смешения цветов:
R=(Rфона*Alpha+(100-Alpha)*Rформы*Alpha)/100;
G=(Gфона*Alpha+(100-Alpha)*Gформы*Alpha)/100;
B=(Bфона*Alpha+(100-Alpha)*Bформы*Alpha)/100;
где Alpha - коэффициент прозрачности в %
Перед показом формы, создаём битмап, что под формой будет и для формы делаем
смешение цветов для пикселов из битмапа и битмапа формы.
Например, засовываем то, что под окном в bitmap:
RECT r;
GetWindowRect(hwnd, &r);
int w= r.right-r.left;
int h= r.bottom-r.top;
HDC hdcScreen= GetDC(0);
HDC hdcCompatible = CreateCompatibleDC(hdcScreen);
//Create a compatible bitmap for hdcScreen.
HBITMAP hbmScreen = CreateCompatibleBitmap(hdcScreen, w, h);
SelectObject(hdcCompatible, hbmScreen);
ShowWindow(hwnd, SW_HIDE);
BitBlt(hdcCompatible, 0, 0, w, h, hdcScreen, r.left, r.top, SRCCOPY);
ShowWindow(hwnd, SW_SHOW);
Вопрос: как смешать цвета по вышеуказанным формулам и вывести получившееся вместо окна?
← →
onyx (2004-11-03 15:32) [1]Неужели никто не знает, или просто лень ответить...
← →
DVM © (2004-11-04 19:47) [2]Нужны два цикла. Перебираешь пиксели (getpixel) и цвет пикселей смешиваешь. Потом setpixel. Только картину под окном получить невозможно по-нормальному. ИМХО на королевстве делфи есть статья. Сорри за немногословнось - пишу с PocketPC.
← →
Wiz@rd (2004-11-04 20:21) [3]Да формула такая, вот как битмапы смешиваются, дальше думай сам, получай dc окон и т.п.:
type
TPercent = 0..100;
procedure Blend (dstBitmap, srcBitmap: TBitmap; Transparency: TPercent);
const
MaxPixelCount = 32768;
type
PRGBTripleArray = ^TRGBTripleArray;
TRGBTripleArray = array[0..MaxPixelCount] of TRGBTriple;
var
dstRow, srcRow: PRGBTripleArray;
x, y: Integer;
begin
dstBitmap.PixelFormat := pf24bit;
srcBitmap.PixelFormat := pf24bit;
for y := 0 to srcBitmap.Height-1 do
begin
srcRow := srcBitmap.ScanLine[y];
dstRow := dstBitmap.ScanLine[y];
for x := 0 to srcBitmap.Width-1 do
begin
dstRow[x].rgbtRed := ((100-Transparency) * dstRow[X].rgbtRed) div 100 +
(Transparency * srcRow[X].rgbtRed) div 100;
dstRow[x].rgbtGreen := ((100-Transparency) * dstRow[X].rgbtGreen) div 100 +
(Transparency * srcRow[X].rgbtGreen) div 100;
dstRow[x].rgbtBlue := ((100-Transparency) * dstRow[X].rgbtBlue) div 100 +
(Transparency * srcRow[X].rgbtBlue) div 100;
end;
end;
end;
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.043 c