Хочу урасить форму и сделать её как в Висте.
А именно.
Я хочу узнать, как сделать снимок той части экрана, которая
находится под формой, это изображение поместить на компонент
TImage, изображение растянуть по всей форме и применить
к этому изображению эфферк Blur, чтобы форма выглядела
как прозрачное запотевшее стекло. Заранее спасибо .
Просто изменить прозрачность формы - не устроит?
Просто прозрачность не даст эффекта запотевшего стекла. Для этого надо снять скриншот... Проблема в другом - допустим, при старте приложения снять его не проблема:
procedure TForm1.FormCreate(Sender: TObject);(на форме - один TImage привязанный к размерам формы)
var DesktopBitmap: TBitmap;
begin
DesktopBitmap := TBitmap.Create;
with DesktopBitmap do begin
Width := Form1.Width + 5;
Height := Form1.Height + 30; // <--- чтоб заголовок формы не мешал
end;
BitBlt(DesktopBitmap.Canvas.Handle,
0,0,Form1.Width+5,Form1.Height+30,
GetDC(GetDesktopWindow),Form1.Left+5,Form1.Top+30,SrcCopy);
Image1.Picture.Bitmap.Assign(DesktopBitmap);
DesktopBitmap.Free;
end;
Нет.
Неточно снимает скриншот того, что под формой.
А насчёт того, что я буду делать при перетягивании окна по экрану -
я буду менять фон формы только тогда, когда положение формы будет
зафиксировано на экране.
Перетягивание - не единственная проблема.
У других окон есть привычка закрываться (ну например у касперского есть "закрыть окно при завершении проверки"). Если часть окна находилась под формой, а часть вне нее, может получиться интересная картинка ;)
В любом случае нужно сперва отключить Border у формы - у каждого пользователя свои темы в винде, и везде их ширина бортика и высота заголовка отличаются.
Тогда размер окна совпадет с прямоугольником, который получаем через ClientRect.
procedure TForm1.GetBg;
var
DesktopBitmap: TBitmap;
R: TRect;
P: TPoint;
begin
DesktopBitmap := TBitmap.Create;
R := GetClientRect;
with DesktopBitmap do begin
Width := R.Right - R.Left;
Height := R.Bottom - R.Top;
end;
P := ClientToScreen(R.TopLeft);
BitBlt(DesktopBitmap.Canvas.Handle,
0,0,Form1.Width - Form1.BorderWidth,Form1.Height - Form1.BorderWidth,
GetDC(GetDesktopWindow), P.X, P.Y, SRCCOPY);
DesktopBitmap.PixelFormat := pf24bit;
GBlur(DesktopBitmap, 2); // Взято из DRKB
Image1.Picture.Bitmap.Assign(DesktopBitmap);
DesktopBitmap.Free;
end;
...(запусти с этими строками, и без них, поймешь зачем это нужно)
AlphaBlendValue := 254;
AlphaBlend := True;
...
Теоритически можно постаить какой нибудь компанент типа Alpha Control...И нарисовать под него скин какой нужен...