Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.09.22;
Скачать: [xml.tar.bz2];

Вниз

Прозрачный рисунок   Найти похожие ветки 

 
Andre   (2003-07-05 03:28) [0]

Всем привет. Такой вот вопрос: как с помощью API сделать .ICO прозрачной (или .BMP)?


 
Nick Denry   (2003-07-05 20:13) [1]

точнее вопрос


 
Andre   (2003-07-06 02:16) [2]

Точнее. Я рисую прямо на экране(картинка в формате *.ICO) и надо чтобы она была прозрачной (сквозь неё был виден рабочий стол). Может подскажет кто-нибудь как это осуществить, в WIN API я ещё начинающий.


 
Deus   (2003-07-07 14:30) [3]

AlphaBlend
The AlphaBlend function displays bitmaps that have transparent or semitransparent pixels.

Но это только под 2000/XP.

Под 9х можно только через BitBlt, как это сделано в компоненте Glassy:
http://www.utilmind.com/delphi2.html


 
Andre   (2003-07-08 03:32) [4]

С пониманием AlphaBlend трудновато, но всё равно спасибо. Попробуем разобраться.


 
Andre   (2003-07-12 02:41) [5]

Я понял! Так у меня нет формы. Соответственно и AlphaBlend применять не к чему. А с BitBlt в компоненте много модулей используется. Нельзя ли обойтись только Messages и Windows?


 
Andre   (2003-07-13 02:19) [6]

Я имел ввиду заменить ScanLine(). Спасибо.


 
Andre   (2003-07-16 04:47) [7]

А я сделал так:
begin

Randomize;
XScreen := Random (GetSystemMetrics (SM_CXSCREEN) - 16);//Положение - от потолка:)
YScreen := Random (GetSystemMetrics (SM_CYSCREEN) - 16);
Transparent := Random (100);//Прозрачность - то же от балды:)
Width := 31;//А как узнать размеры произвольной картинки (в пикселях)?
Height := 31;
DC := GetDC (0);
picDC := CreateCompatibleDC (0);
Picture := LoadBitmap (HInstance, "SNEG");
SelectObject (picDC, picture);
for x := 0 to Width do
begin
for y := 0 to Height do
begin
DCColor := GetPixel (DC, (XScreen + x), (YScreen + y));
PicDCColor := GetPixel (PicDC, x, y);
if PicDCColor = GetPixel (PicDC, 0, 0) then SetPixel (DC, (XScreen + x), (YScreen + y), DCColor)
else
begin
RPic := GetRValue (DCColor);
GPic := GetGValue (DCColor);
BPic := GetBValue (DCColor);
RPic := (RPic * Transparent + (GetRValue (PicDCColor) * (100 - Transparent))) div 100;
GPic := (GPic * Transparent + (GetGValue (PicDCColor) * (100 - Transparent))) div 100;
BPic := (BPic * Transparent + (GetBValue (PicDCColor) * (100 - Transparent))) div 100;
DCColor := RGB (RPic, GPic, BPic);
SetPixel (DC, (XScreen + x), (YScreen + y), DCColor);
end;
end;
end;
DeleteDC (picDC);
DeleteObject (picture);
( 0, DC) А я сделал так:
begin

Randomize;
XScreen := Random (GetSystemMetrics (SM_CXSCREEN) - 16);//Положение - от потолка:)
YScreen := Random (GetSystemMetrics (SM_CYSCREEN) - 16);
Transparent := Random (100);//Прозрачность - то же от балды:)
Width := 31;//А как узнать размеры произвольной картинки (в пикселях)?
Height := 31;
DC := GetDC (0);
picDC := CreateCompatibleDC (0);
Picture := LoadBitmap (HInstance, "SNEG");
SelectObject (picDC, picture);
for x := 0 to Width do
begin
for y := 0 to Height do
begin
DCColor := GetPixel (DC, (XScreen + x), (YScreen + y));
PicDCColor := GetPixel (PicDC, x, y);
if PicDCColor = GetPixel (PicDC, 0, 0) then SetPixel (DC, (XScreen + x), (YScreen + y), DCColor)
else
begin
RPic := GetRValue (DCColor);
GPic := GetGValue (DCColor);
BPic := GetBValue (DCColor);
RPic := (RPic * Transparent + (GetRValue (PicDCColor) * (100 - Transparent))) div 100;
GPic := (GPic * Transparent + (GetGValue (PicDCColor) * (100 - Transparent))) div 100;
BPic := (BPic * Transparent + (GetBValue (PicDCColor) * (100 - Transparent))) div 100;
DCColor := RGB (RPic, GPic, BPic);
SetPixel (DC, (XScreen + x), (YScreen + y), DCColor);
end;
end;
end;
DeleteDC (picDC);
DeleteObject (picture);
ReleaseDC (0, DC);
end;
Моя первая прога на WINAPI, если у кого есть идеи как это сделать проще, пожалуйста, напишите (не используя модуль graphics). В принципе это работает, но загружает проц, чего не хотелось бы. А как сделать то же самое с помощью BitBlt или TransparentBlt - ума не приложу. Спасибо.


 
Rouse_   (2003-07-16 06:20) [8]

Поясни фразу "Я рисую прямо на экране"

На рабочем столе?

Если я прав.....

Желаю успехов


 
Th   (2003-07-16 19:30) [9]

to Andre см. в MSDN функцию AlphaBlend


 
Andre   (2003-07-19 02:48) [10]


> Rouse_ © ( поверх всех окон)

> Rouse_ ©
> Поясни фразу "Я рисую прямо на экране"
>
> На рабочем столе?

Да, прямо на рабочем столе (поверх всех окон).


 
Andre   (2003-07-20 02:21) [11]

С AlphaBlend пошло всё неплохо, но необходимо как-то убрать цвет фона (сделать его абсолютно прозрачным). Подумаю на досуге.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.09.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.013 c
1-71734
SergLight
2003-09-11 16:37
2003.09.22
Константа версии Delphi


14-71911
jack128
2003-09-03 10:10
2003.09.22
Именинники 3 сентября


1-71674
BanderLog
2003-09-11 14:07
2003.09.22
Как в RichEdite обработать двойное нажатие мыши?


6-71800
Zhker
2003-07-20 03:45
2003.09.22
Как открыть ссылку в новом окне броузера ?


1-71741
Алексей Петухов
2003-09-10 13:03
2003.09.22
WordApplication





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский