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

Вниз

Вопрос форма с тенью или обрез формы по png картинке   Найти похожие ветки 

 
dreamse ©   (2011-08-22 16:32) [0]

Добрый день.

Появилась задача добавить к форме эффект тени, но не бычной а достаточно спецефичной. http://savepic.org/2133209.png

Пришел к выводу что необходимо обрезать форму по PNG картинке (но при этом нужно будет все контролы, а интерфейс сложный прорисовывать вручную на ней, что не вариант)

Подскажите, есть ли другие варианты добавить эффект тени такой как указан на рисунке к форме или же как то обрезать форму так чтобы тень была прозрачная, а на форме могли бы распологатся контролы.


 
TUser ©   (2011-08-22 16:40) [1]


> Пришел к выводу что необходимо обрезать форму по PNG картинке
> (но при этом нужно будет все контролы, а интерфейс сложный
> прорисовывать вручную на ней, что не вариант)

Это еще почему придется прорисовывать?


 
dreamse ©   (2011-08-22 16:49) [2]

Вот пример


uses ..., gr32, pngimage;

...

function LoadPNGintoBitmap32 (destBitmap: TBitmap32;
                             srcStream: TStream;
                             out transparent: Boolean): boolean;
var
 PNGObject: TPNGObject;
 TransparentColor: TColor32;
 PixelPtr: PColor32;
 AlphaPtr: PByte;
 X, Y: Integer;
begin
 PNGObject := nil;
 try
   result := false;
   PNGObject := TPngObject.Create;
   PNGObject.LoadFromStream(srcStream);

   destBitmap.Assign(PNGObject);
   destBitmap.ResetAlpha;

   case PNGObject.TransparencyMode of
     ptmPartial:
       begin
         if (PNGObject.Header.ColorType = COLOR_GRAYSCALEALPHA) or
            (PNGObject.Header.ColorType = COLOR_RGBALPHA) then
         begin
           PixelPtr := PColor32(@destBitmap.Bits[0]);
           for Y := 0 to destBitmap.Height - 1 do
           begin
             AlphaPtr := PByte(PNGObject.AlphaScanline[Y]);
             for X := 0 to destBitmap.Width - 1 do
             begin
               PixelPtr^ := (PixelPtr^ and $00FFFFFF) or (TColor32(AlphaPtr^) shl 24);
               Inc(PixelPtr);
               Inc(AlphaPtr);
             end;
           end;
           transparent := True;
         end;
       end;
     ptmBit:
       begin
         TransparentColor := Color32(PNGObject.TransparentColor);
         PixelPtr := PColor32(@destBitmap.Bits[0]);
         for X := 0 to (destBitmap.Height - 1) * (destBitmap.Width - 1) do
         begin
           if PixelPtr^ = TransparentColor then
             PixelPtr^ := PixelPtr^ and $00FFFFFF;
           Inc(PixelPtr);
         end;
         transparent := True;
       end;
     ptmNone:
       transparent := False;
   end;
   result := true;
 finally
   if Assigned(PNGObject) then PNGObject.Free;
 end;
end;
//----------
function LoadPNGintoBitmap32_2 (destBitmap: TBitmap32;
                             filename: String;
                             out transparent: boolean): boolean;
var
 FileStream: TFileStream;
begin
 result := false;
 try
   FileStream := TFileStream.Create(filename, fmOpenRead);
   try
     result := LoadPNGintoBitmap32(destBitmap, FileStream, transparent);
   finally
     FileStream.Free;
   end;
 except
 end;
end;
//------

procedure TForm1.FormCreate(Sender: TObject);
var size:tsize; p:tpoint; blendf:tblendfunction;{не пугаться, это WinAPI}
alpha:boolean;im:tbitmap32;
begin
form1.DoubleBuffered:=true;
 im:=TBitmap32.Create;
 //if (paramstr(1)<>"") and (fileexists(pd+"Skinz\"+paramstr(1))) then
 //loadPNGintoBitmap32_2(im,pd+"Skinz\"+paramstr(1),alpha)
 //else
 loadPNGintoBitmap32_2(im,"D:\1.png",alpha);
      setWindowLong(Handle, GWL_EXSTYLE,
   getWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED {or {WS_EX_TRANSPARENT});

 BlendF.BlendOp := AC_SRC_OVER;
 BlendF.BlendFlags := 0;
 BlendF.SourceConstantAlpha := 255;
 BlendF.AlphaFormat := AC_SRC_ALPHA;
 P := Point(0, 0);
 Size.cx := im.Width;
 Size.cy := im.Height;
 UpdateLayeredWindow(Handle, 0, nil, @Size, im.Handle, @P, 0, @BlendF, ULW_ALPHA);
end;


И все бы было отлично, но вот только с формы пропадают все компоненты.


 
Дмитрий С ©   (2011-08-22 16:52) [3]

Держи одну форму над другой.


 
dreamse ©   (2011-08-22 17:02) [4]

И таскать за собой вторую ? :)
Интересная идея. Только она какая то неправельная чтоли ...


 
antonn ©   (2011-08-22 17:45) [5]


> И таскать за собой вторую ? :)
> Интересная идея. Только она какая то неправельная чтоли
> ...

Так и делается в реализации стиля CS_DROPSHADOW, глянь ShadowWnd.pas.
Еще как вариант одну форму встроить в другую, на одну поставить контролы и transparentcolor, а другую выводить через updatelayeredwindow()


 
Дмитрий С ©   (2011-08-23 13:53) [6]


> Еще как вариант одну форму встроить в другую, на одну поставить
> контролы и transparentcolor, а другую выводить через updatelayeredwindow()

так та, что внутри прорисовываться не будет. или нет?


 
antonn ©   (2011-08-24 22:01) [7]

да, но в случае включенных тем (манифеста) вокруг контролов все равно будет рамка


 
QAZ   (2011-08-24 22:11) [8]


> Появилась задача добавить к форме эффект тени

а какая смысловая нагрузка? типа круто,смотрите какая необычная тень?


 
antonn ©   (2011-08-25 01:55) [9]


> а какая смысловая нагрузка?

эргономика, а конкретнее - эстетика (Техническая эстетика. Устанавливает зависимость условий труда с результатами труда)


 
QAZ   (2011-08-25 11:53) [10]


> antonn ©   (25.08.11 01:55) [9]

это такая же эстетика как спойлер на шестерке


 
Юрий Зотов ©   (2011-08-25 12:20) [11]

> Еще как вариант одну форму встроить в другую

Фрейм?


 
antonn ©   (2011-08-25 17:00) [12]


> это такая же эстетика как спойлер на шестерке

нет


> Юрий Зотов ©   (25.08.11 12:20) [11]

а фрейм топ-контрол? я не пробовал, просто парентом формы указывал другую форму



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

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

Наверх




Память: 0.5 MB
Время: 0.006 c
6-1241373790
psa247
2009-05-03 22:03
2011.12.11
Размер пакета пинга


15-1313756695
Медвежонок Пятачок
2011-08-19 16:24
2011.12.11
JavaScript (Sencha ExtJS)


4-1242382646
Игорь
2009-05-15 14:17
2011.12.11
Функция IsProcessInJob в Windows 2000


15-1314217798
Юрий
2011-08-25 00:29
2011.12.11
С днем рождения ! 25 августа 2011 четверг


15-1313664786
Юрий Зотов
2011-08-18 14:53
2011.12.11
К знатокам регулярных выражений