Форум: "Прочее";
Текущий архив: 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