Форум: "Начинающим";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];
ВнизКак правильно скопировать изображение одной формы в другую Найти похожие ветки
← →
Elen © (2007-08-13 11:31) [0]Есть две формы. Я хочу чтоб фон второй формы показывал изображение первой формы. т.е. делаю так :
BitBlt(Canvas.Handle,0,0,Width,Height,form1.Canvas.Handle,0,0,SRCCOPY);
Но если вторая форма перекрывает первую, то и в изображении я получаю перекрытие.
Вопрос: Можно ли и как правильно закрасить одну форму изображением другой?
← →
DVM © (2007-08-13 11:33) [1]
> Можно ли и как правильно закрасить одну форму изображением
> другой?
Форму с которой снимается снапшот надо на время отобразить сверху, потом убрать.
← →
Elen © (2007-08-13 11:38) [2]
Form1.BringToFront;
BitBlt(Canvas.Handle,0,0,Width,Height,form1.Canvas.Handle,0,0,SRCCOPY);
Form1.SendToBack
Не выходит. Все равно перекрытие видно.
← →
DVM © (2007-08-13 11:42) [3]
> Не выходит. Все равно перекрытие видно.
Надо подождать пока она перерисуется. Или вызвать ее метод Repaint;
← →
Elen © (2007-08-13 11:53) [4]Ладно допустим, а если я хочу такое провернуть с компонентами на одной форме, мне что нужно один компонент скрывать, делать снапшот, потом показывать компонент и заливать его полученным снапшотом?
← →
{RASkov} © (2007-08-13 12:37) [5]> [0] Elen © (13.08.07 11:31)
Под какую Win?
← →
Elen © (2007-08-13 12:56) [6]XP
← →
{RASkov} © (2007-08-13 13:13) [7]> [6] Elen © (13.08.07 12:56)
Я делал некое подобие "увеличилки", могу кинуть проект.... он не большой, но может из него найдешь ответ на свой вопрос.
Впрочем так же задавал вопрос здесь, но это было относительно давно....
Только скажи куда кидать :)
← →
Elen © (2007-08-13 13:15) [8]
> {RASkov} © (13.08.07 13:13) [7]
У меня только Скайп. Ты выложи основные принципы если не трудно.
← →
{RASkov} © (2007-08-13 13:21) [9]> [8] Elen © (13.08.07 13:15)
> У меня только Скайп.
Это что? :)
Посмотрел... он вообще маленький оказался, вот весь здесь:
DFMobject Form1: TForm1
Left = 361
Top = 104
Cursor = crSizeAll
AlphaBlend = True
BorderStyle = bsNone
Caption = "Form1"
ClientHeight = 200
ClientWidth = 200
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = "MS Sans Serif"
Font.Style = []
FormStyle = fsStayOnTop
OldCreateOrder = False
Position = poScreenCenter
OnCreate = FormCreate
OnDestroy = FormDestroy
OnMouseDown = FormMouseDown
OnMouseUp = FormMouseUp
OnMouseWheelDown = FormMouseWheelDown
OnMouseWheelUp = FormMouseWheelUp
PixelsPerInch = 96
TextHeight = 13
object Timer1: TTimer
Interval = 1
OnTimer = Timer1Timer
end
end
PAS:unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, RXCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
procedure FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
private
procedure FMv(var Ms: TMessage); message WM_MOVE;
procedure Uvelichenie;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
DC: HDC;
BMP, BMPBIG: TBitMap;
xU, xX, XT, Uk, XC, YC: Integer;
FMove: Boolean=False;
implementation
{$R *.dfm}
procedure SetUvelich(const U: Byte);
begin
xU:=U*100;
xX:=-(xU div 2);
BMPBIG.Height:=Form1.Height+xU;
BMPBIG.Width:=Form1.Width+xU;
Form1.Uvelichenie;
end;
procedure TForm1.FormCreate(Sender: TObject);
var FRGN: HRGN;
begin
Height:=200; Width:=200; XC:=Width div 2; YC:=Height div 2;
FRGN:=CreateEllipticRgn(0, 0, Width, Height);
try
SetWindowRgn(Handle, FRGN, True);
DoubleBuffered:=True;
Canvas.Font.Style:=[fsBold];
Canvas.Pen.Color:=clAqua;
Canvas.Pen.Width:=2;
BMP:=TBitMap.Create;
BMP.Height:=Screen.Height;
BMP.Width:=Screen.Width;
BMPBIG:=TBitmap.Create;
Uk:=5; SetUvelich(Uk);
Canvas.Brush.Style:=bsClear;
DC:=GetDC(0);
finally DeleteObject(FRGN); end;
end;
procedure TForm1.Uvelichenie;
var S: String;
begin
if DC=0 then Exit;
try BitBlt(BMP.Canvas.Handle, 0, 0, Width, Height, DC, ClientOrigin.X, ClientOrigin.Y, SRCCOPY);
BMPBIG.Canvas.CopyRect(Rect(0, 0, 200+xU, 200+xU), BMP.Canvas, Rect(0, 0, 200, 200));
Canvas.Draw(xX, xX, BMPBIG);
Canvas.Ellipse(1, 1, Width-2, Height-2);
if FMove then begin
Canvas.Font.Color:=Canvas.Pixels[XC, 12] xor $FFFFFF;
if Uk=0 then S:="no" else if Uk=15 then S:="max" else S:="x"+IntToStr(Uk);
XT:=XC-Canvas.TextWidth(S) div 2;
Canvas.TextOut(XT, 5, S);
Canvas.Pen.Width:=1;
Canvas.Pen.Color:=Canvas.Pixels[XC-4, YC] xor $FFFFFF;
Canvas.MoveTo(XC-3, YC); Canvas.LineTo(XC-6, YC);
Canvas.Pen.Color:=Canvas.Pixels[XC+4, YC] xor $FFFFFF;
Canvas.MoveTo(XC+3, YC); Canvas.LineTo(XC+6, YC);
Canvas.Pen.Color:=Canvas.Pixels[XC, YC-4] xor $FFFFFF;
Canvas.MoveTo(XC, YC-3); Canvas.LineTo(XC, YC-6);
Canvas.Pen.Color:=Canvas.Pixels[XC, YC+4] xor $FFFFFF;
Canvas.MoveTo(XC, YC+3); Canvas.LineTo(XC, YC+6);
Canvas.Pen.Color:=clAqua; Canvas.Pen.Width:=2;
end;
except end;
end;
procedure TForm1.FMv(var Ms: TMessage);
begin
Uvelichenie;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Uvelichenie; Timer1.Interval:=700;
FMove:=(GetAsyncKeyState(VK_LBUTTON)<>0);
end;
procedure TForm1.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
begin
if Uk<1 then Exit else DEC(Uk); FMove:=True; SetUvelich(Uk);
end;
procedure TForm1.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
begin
if Uk>14 then Exit else INC(Uk); FMove:=True; SetUvelich(Uk);
end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button=mbLeft then begin ReleaseCapture; Perform(WM_SYSCOMMAND, $F012, 0); end;
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button=mbRight then Close;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
BMP.Free; BMPBIG.Free; ReleaseDC(0, DC);
end;
end.
← →
Elen © (2007-08-13 13:51) [10]
> {RASkov} © (13.08.07 13:21) [9]
Это что? :)
Skype аналог Аськи.
Пасибо за примерчик. Может чего путного и выйдет, но сдается мне что придется порулить в сторону WM_NCPAINT и WM_ERASEBKGND.
← →
{RASkov} © (2007-08-13 14:31) [11]> [10] Elen © (13.08.07 13:51)
Впрочем сейчас попробывал....
Накидал на первую(Form1) всяких разных конролов. Добавил вторую и изменил одно свойство AlphaBlend = True, а AlphaBlendValue оставил 255
и код из [0] все прекрасно работает. Может и не стоит парится с WM_NCPAINT и WM_ERASEBKGND? :)
← →
Elen © (2007-08-13 14:39) [12]О-о-о. так вот где собака порылась!!! Спасибо, вот уж не ожидала что дело в AlphaBlend"e. Вот это уже стоящее. Еще раз спасибо. $)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.038 c