Можно ли получить растровое изображение формы с заголовком и рамкой?
Стандартные средства Delphi позволяют получать растровое изображение только внутренней части окна. Для получения изображения всего окна с заголовком и рамкой необходимо воспользоваться функциями API.
Во-первых, получаем контекст всего окна функцией:
function GetWindowDC(Wnd: HWnd): HDC;
Затем копируем растровое изображение окна в компонент TImage (для примера). И освобождаем полученный контекст окна:
function ReleaseDC(Wnd: HWnd; DC: HDC): Integer;
Пример:
procedure TForm1.Button1Click(Sender: TObject); VAR DC: hDC; begin DC := GetWindowDC(Handle); Image1.Picture.BitMap.Height := Height; Image1.Picture.BitMap.Width := Width; BitBlt(Image1.Picture.BitMap.Canvas.Handle, 0, 0, Width, Height, DC, 0, 0, SRCCOPY); ReleaseDC(Handle, DC); end;
Как получить растровое изображение формы?
В компоненте TForm уже есть метод возвращающий растровое изображение формы, так что, для получения изображения достаточно вызвать его:
function GetFormImage: TBitmap;
Пример:
Image1.Picture.BitMap := GetFormImage;
Можно ли из Delphi рисовать в любой части экрана или в чужом окне?
Для этого надо воспользоваться функциями API. Получить контекст чужого окна, либо всего экрана:
function GetDC(Wnd: HWnd): HDC;
где Wnd - указатель на нужное окно, или 0 для получения контекста всего экрана.
И далее, пользуясь функциями API, нарисовать все что надо.
Пример:
PROCEDURE DrawOnScreen; VAR ScreenDC: hDC; BEGIN ScreenDC := GetDC(0); {получить контекст экрана} Ellipse(ScreenDC, 0, 0, 200, 200); {нарисовать} ReleaseDC(0,ScreenDC); {освободить контекст} END;
Как отобразить растровое изображение, чтобы определенный его цвет был "прозрачным"?
Эффект "прозрачного" фона достигается методом BrushCopy объекта Canvas:
Пример:
В качестве фонового, для изображения, цвета выбирается цвет его левой нижней точки (именно эта точка является "фоновой" при рисовании глифов для кнопок в Delphi).
BrushCopy( Bounds(10, 10, Bitmap.Width, Bitmap.Height), Bitmap, Bounds(0, 0, Bitmap.Width, Bitmap.Height), Bitmap.Canvas.Pixels[0, Bitmap.Height - 1]);