Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Кое-что о прозрачности окон [Win95/98, WinME]


onyx ©   (2004-11-03 13:16:00) 

Вот нашел в старых форумах:

Круглое/овальное/с дыркой/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);

Вопрос:как смешать цвета по вышеуказанным формулам и вывести получившееся вместо окна?


Wiz@rd   (2004-11-04 20:21:00) [1]

Да формула такая, вот как битмапы смешиваются, дальше думай сам, получай 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;


DVM   (2004-11-04 19:47:00) [2]

Нужны два цикла. Перебираешь пиксели (getpixel) и цвет пикселей смешиваешь. Потом  setpixel. Только картину под окном получить невозможно по-нормальному. ИМХО на королевстве делфи есть статья. Сорри за немногословнось - пишу с PocketPC.


onyx   (2004-11-03 15:32:00) [3]

Неужели никто не знает, или просто лень ответить...


Наверх

Титульная страница Поиск, карта сайта Написать письмо