Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.07.2007, 16:02
Аватар для <<D>>
<<D>> <<D>> вне форума
Активный
 
Регистрация: 06.05.2007
Адрес: ГДЕ ТО В СОЛНЕЧНОЙ СИСТЕМЕ
Сообщения: 207
Репутация: 15
По умолчанию Transparent

Здрасте. У меня есть еще один вопрос:
Как сделать форму прозрачной или полупрозрачной в тех местах, которые покрыты определенным
цветом, не используя AlphaBlend и TransparentColor?
Заранее СПАСИБО.

Последний раз редактировалось <<D>>, 16.07.2007 в 01:03.
Ответить с цитированием
  #2  
Старый 15.07.2007, 23:49
Аватар для 4kusNick
4kusNick 4kusNick вне форума
Местный
 
Регистрация: 06.09.2006
Адрес: Россия, Санкт-Петербург
Сообщения: 444
Репутация: 550
По умолчанию

Ну, например, вот этот кусочек кода сделает часть окна - "дыркой"...
Код:
var
  R1:DWORD;
  R2:DWORD;
begin

  R1 := CreateRectRgn(0,0,301,283);
  R2 := CreateRectRgn(254,215,290,230);
  CombineRgn(R1,R1,R2,COMPLEXREGION);
  SetWindowRgn(Handle,R1,TRUE);

end;
Тут с цифрами поигать можно. Писал по памяти, мог ошибиться...
Найти место именно определенного цвета можно пытаться через компоненты (если они конечно имееют сво-во color), которыем мы хотим сделать прозрачными...Можно положить на форму какой-нибудь Label и вычислять его Rect, закрашивать цветом и делать полупрозрачность\прозрачность. А вот как реализовать полупрозрачность в определенной области я бы и сам хотел узнать...
__________________
THE CRACKER IS OUT THERE
Ответить с цитированием
  #3  
Старый 16.07.2007, 01:26
Аватар для <<D>>
<<D>> <<D>> вне форума
Активный
 
Регистрация: 06.05.2007
Адрес: ГДЕ ТО В СОЛНЕЧНОЙ СИСТЕМЕ
Сообщения: 207
Репутация: 15
По умолчанию

А в Winamp'e вообще используется PNG прозрачность. Интересно,
как они это сделали?
Ответить с цитированием
  #4  
Старый 16.07.2007, 02:39
Аватар для 4kusNick
4kusNick 4kusNick вне форума
Местный
 
Регистрация: 06.09.2006
Адрес: Россия, Санкт-Петербург
Сообщения: 444
Репутация: 550
По умолчанию

Ааа, ну насколько я знаю, в винампе не используется полупрозрачность определенных участков, а только полная прозрачность.
Вот еще:

Код:
{Всё, что нам нужно, это HRGN и дескриптор (handle) элемента управления. SetWindowRgn имеет три параметра: дескриптор окна, которое будем менять, дескритор региона и булевый (boolean) параметр, который указывает - перерисовывать или нет после изменения. Как только у нас есть дескриптор и регион, то можно вызвать SetWindowRgn(Handle, Region, True) и вуаля!
 
Здесь приведён пример использования функции BitmapToRgn (описанной в примере Как создать регион(HRNG) по маске). 

Заметьте, что Вы не должны освобождать регион при помощи DeleteObject, так как после вызова SetWindowRgn владельцем региона становится операционная система.

Code:}

function BitmapToRgn(Image: TBitmap): HRGN; 
var 
  TmpRgn: HRGN; 
  x, y: integer; 
  ConsecutivePixels: integer; 
  CurrentPixel: TColor; 
  CreatedRgns: integer; 
  CurrentColor: TColor; 
begin 
  CreatedRgns := 0; 
  Result := CreateRectRgn(0, 0, Image.Width, Image.Height); 
  inc(CreatedRgns); 
  if (Image.Width = 0) or (Image.Height = 0) then exit; 
  for y := 0 to Image.Height - 1 do 
   begin 
   CurrentColor := Image.Canvas.Pixels[0,y]; 
   ConsecutivePixels := 1; 
   for x := 0 to Image.Width - 1 do 
     begin 
     CurrentPixel := Image.Canvas.Pixels[x,y]; 

     if CurrentColor = CurrentPixel 
       then inc(ConsecutivePixels) 
       else begin 
            // Входим в новую зону
            if CurrentColor = clWhite then 
              begin 
              TmpRgn := CreateRectRgn(x-ConsecutivePixels, y, x, y+1); 
              CombineRgn(Result, Result, TmpRgn, RGN_DIFF); 
              inc(CreatedRgns); 
              DeleteObject(TmpRgn); 
              end; 
            CurrentColor := CurrentPixel; 
            ConsecutivePixels := 1; 
            end; 
     end;  

  if (CurrentColor = clWhite) and (ConsecutivePixels > 0) then 
     begin 
     TmpRgn := CreateRectRgn(x-ConsecutivePixels, y, x, y+1); 
     CombineRgn(Result, Result, TmpRgn, RGN_DIFF); 
     inc(CreatedRgns); 
     DeleteObject(TmpRgn); 
     end; 
   end; 
end;


var 
MaskBmp: TBitmap; 
begin 
MaskBmp := TBitmap.Create; 
try 
   MaskBmp.LoadFromFile('FormShape.bmp'); 
   Height := MaskBmp.Height; 
   Width := MaskBmp.Width; 
   // ОС владеет регионом, после вызова SetWindowRgn
   SetWindowRgn(Self.Handle, BitmapToRgn(MaskBmp), True); 
finally 
   MaskBmp.Free; 
end; 
end;
__________________
THE CRACKER IS OUT THERE

Последний раз редактировалось 4kusNick, 16.07.2007 в 11:42.
Ответить с цитированием
  #5  
Старый 16.07.2007, 11:22
Аватар для <<D>>
<<D>> <<D>> вне форума
Активный
 
Регистрация: 06.05.2007
Адрес: ГДЕ ТО В СОЛНЕЧНОЙ СИСТЕМЕ
Сообщения: 207
Репутация: 15
По умолчанию

Underclared identifier: BitmapToRgn
Может нужен какой-то модуль?
__________________
Кому я должен - всем прощаю!!!!
Ответить с цитированием
  #6  
Старый 16.07.2007, 11:43
Аватар для 4kusNick
4kusNick 4kusNick вне форума
Местный
 
Регистрация: 06.09.2006
Адрес: Россия, Санкт-Петербург
Сообщения: 444
Репутация: 550
По умолчанию

Сорри, эт я скосячил - см. мой последний пост.
__________________
THE CRACKER IS OUT THERE
Ответить с цитированием
  #7  
Старый 16.07.2007, 14:05
Аватар для <<D>>
<<D>> <<D>> вне форума
Активный
 
Регистрация: 06.05.2007
Адрес: ГДЕ ТО В СОЛНЕЧНОЙ СИСТЕМЕ
Сообщения: 207
Репутация: 15
Хорошо

Да, всё отлично, Спасибо тебе БОЛЬШОЕ, http://www.delphisources.ru/forum/im...lies/smile.gif правда что-бы сделать нужный
цвет прозрачным нужно слегка подправить:

var
MaskBmp: TBitmap;
begin
MaskBmp := TBitmap.Create;
try
MaskBmp.LoadFromFile('FormShape.bmp');
maskBMP.Mask(clFuchSia); //Цвет можно подбирать любой
Height := MaskBmp.Height;
Width := MaskBmp.Width;
// ОС владеет регионом, после вызова SetWindowRgn
SetWindowRgn(Self.Handle, BitmapToRgn(MaskBmp), True);
finally
MaskBmp.Free;
end;
end;
__________________
Кому я должен - всем прощаю!!!!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:53.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter