Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.19;
Скачать: CL | DM;

Вниз

Кое-что о прозрачности окон   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2004.12.19;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.022 c
1-1102406665
tytus
2004-12-07 11:04
2004.12.19
Как в ListBox-e рисовать разные значки?


9-1092589159
JUS
2004-08-15 20:59
2004.12.19
Как двигать спрайт...


1-1101996630
the_ram
2004-12-02 17:10
2004.12.19
Путь к файлу


3-1100597555
REA
2004-11-16 12:32
2004.12.19
Самый шустрый сервер


1-1101946013
Змей
2004-12-02 03:06
2004.12.19
listview