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

Вниз

Вопрос форма с тенью или обрез формы по 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.004 c
6-1246793442
__Алексей__
2009-07-05 15:30
2011.12.11
впорос по SNMP v3


15-1313675656
Andy BitOff
2011-08-18 17:54
2011.12.11
Протокол обмена с весами CAS AD-25


1-1277226424
AKomander
2010-06-22 21:07
2011.12.11
По два раза приходят перехваченные пакеты через WM_COPYDATA.


2-1314256325
lewka
2011-08-25 11:12
2011.12.11
Пароли пользователей


2-1314473437
Gu
2011-08-27 23:30
2011.12.11
данные в ресурсах





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский