Главная страница
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.041 c
14-1101935717
Мирон
2004-12-02 00:15
2004.12.19
Читаю "Паттерны...". Есть вопрос.


8-1093579072
race1
2004-08-27 07:57
2004.12.19
играть два файла без задержки


1-1102062336
Frozzen
2004-12-03 11:25
2004.12.19
Антиотладочные приемы


3-1100162755
PereZ
2004-11-11 11:45
2004.12.19
Компонент для DBF


14-1101705984
NewDelpher
2004-11-29 08:26
2004.12.19
Плану Аллена Даллеса суждено было сбыться?