-
подскажите пожалуйста, добрые люди - как правильно делать перерисовку изображения на канве?
-
естественно для MCK
-
Для Painbox
Painbox.invalidate;
Painbox.Update
=Repaint. Перерисовка.
-
Чёт не то выходит - я рисую на канве мышкой а изобажение после передвижения формы затирается
-
Надо самому запоминать нарисованное. Форма понятия не имеет что на ней нарисовали.
-
ну я так понимаю что надо записать в стрим или буфер?
-
пример
-
>> ну я так понимаю что надо записать в стрим или буфер? Можно, к примеру, перед началом перемещения слить содержимое канвы во временный битмап, а после завершения перемещения отрисовать этот битмап обратно на канву. Либо все рисование дублировать в битмап и при необходимости перерисовки отрисовывать битмап.
-
Here's a full example:
program canvasdemo;
uses
Kol,
canvasdemo1 in 'canvasdemo1.pas';
begin
NewForm1( Form1, nil);
Run(Form1.form);
end.
and
unit canvasdemo1;
interface
uses
Windows, Messages, Kol;
const
cps:KolString = 'Kol project in ' + 'Freepascal ''Delphi ' +
'64 bits ''32 bits ' +
'Unicode''Ansi';
type
PForm1=^TForm1;
TForm1=object(Tobj)
Form:pControl;
Background,
Picture:PBitmap;
Menu:PMenu;
x,y:Integer;
P : Array[0..3] of TPoint;
public
procedure FormMouseMove(Sender: Pcontrol;var Mouse:TMouseEventData);
procedure DoPaint(Sender: Pcontrol;DC:HDC);
procedure DoMenu(sender:PMenu;index:integer);
end;
procedure NewForm1( var Result: PForm1; AParent: PControl );
var
Form1:pForm1;
implementation
procedure NewForm1( var Result: PForm1; AParent: PControl );
begin
New(Result,Create);
with Result^ do
begin
Form:= NewForm(AParent,cps);
Applet:=Form;
Form.Add2AutoFree(Result);
Form.OnPaint := DoPaint;
Form.OnMouseMove := FormMouseMove;
Menu :=NewMenu(form,0,['&File','(','Load &Background','Load &Picture','-','E&xit',')'],DoMenu);
Background := NewBitmap(Form.ClientWidth,Form.ClientHeight);
Picture := NewBitmap(0,0);
Form.DoubleBuffered := true;
end;
end;
procedure TForm1.DoMenu(sender: PMenu; index: integer);
begin
case index of
1,2: with NewOpenSaveDialog('Load bitmaps','.',[OSFileMustExist,OSReadOnly])^ do
begin
Filter :='Bitmap files|*.bmp';
if execute then
if index =1 then
Background.LoadFromFile(Filename)
else
begin
Picture.LoadfromFile(Filename);
P[0] := MakePoint((form.clientwidth - picture.width) div 2,(form.clientheight- picture.height) div 2);
P[1] := P[0]; Inc(P[1].X,picture.Width);
end;
form.Invalidate;
end;
4:Applet.Close;
end;
end;
procedure TForm1.DoPaint(Sender: Pcontrol; DC: HDC);
var
Pt:Integer;
begin
Background.StretchDraw(DC,Form.ClientRect);
Picture.Draw(dc,P[0].X,P[0].Y);
end;
procedure TForm1.FormMouseMove(Sender: Pcontrol;
var Mouse: TMouseEventData);
begin
if Boolean(Mouse.shift and MK_LBUTTON) then
begin
form.BeginUpdate;
if PtInRect(MakeRect(P[0].x,P[0].Y,P[1].X,P[1].Y),MakePoint(Mouse.X,Mouse.Y)) then
P[0] := MakePoint(Mouse.X-Picture.width div 2,Mouse.y-Picture.Height div 2);
P[1]:=P[0];
inc(P[1].X,Picture.Width);
inc(P[1].Y,Picture.Height);
DoPaint(form,form.canvas.Handle);
form.EndUpdate;
end;
end;
end.
-
Oh,
In form creation:
form.add2autofree(background); form.add2autofree(picture);
Load a background bitmap and a picture.
You can draw the picture across the background with the mouse.
-
cool)
-
Too fast again Found another leak :(
procedure TForm1.DoMenu(sender: PMenu; index: integer);
begin
case index of
1,2: with NewOpenSaveDialog('Load bitmaps','.',[OSFileMustExist,OSReadOnly])^ do
try
Filter :='Bitmap files|*.bmp';
if execute then
if index =1 then
Background.LoadFromFile(Filename)
else
begin
Picture.LoadfromFile(Filename);
P[0] := MakePoint((form.clientwidth - picture.width) div 2,(form.clientheight- picture.height) div 2);
P[1] := P[0]; Inc(P[1].X,picture.Width);
end;
finally
free;
form.Invalidate;
end;
4:Applet.Close;
end;
end;
-
procedure TForm1.KOLFormMouseDown(Sender: PControl; var Mouse: TMouseEventData); //Процедура на нажатиe кнопки мыши begin form.Canvas.MoveTo(Mouse.x,Mouse.y); form.Canvas.Pixels[Mouse.x,Mouse.y]:=clBlack;//Назначение цвета точки end;
procedure TForm1.KOLFormMouseMove(Sender: PControl; var Mouse: TMouseEventData); begin if Mouse.Shift <> 0 then //Процедура на движение курсора мыши begin form.Canvas.Pen.Color:=clBlack; //Назначение цвета карандаша form.Canvas.LineTo(Mouse.x,Mouse.y); end; end; собсна суть вопроса - как создать буфер и перирисовать?
-
Буфер - это битмап. Создать - это NewBitmap. Нарисовать - это TBitmap.Draw.
-
Спасибо
хотелось бы уточнить как копировать канву окна на канву битмапа?
-
Не нужно ничего копировать.
Создаешь битмап. рисуешь на нём же в событии MouseMove MouseDown
и отрисовываешь в битмап.Draw(form.Canvas.Handle,0,0);
У Thaddy очень подробный пример.
-
спасибо конечно но как бы Вам правильно сказать - я имел ввиду что при перемещении формы за пределы рабочегостола или когда поверх неё появляются другие форрмы то нарисованное на первой затирается - как добиться того чтобы нарисованное не затиралось ?
-
спасибо конечно но как бы Вам правильно сказать - я имел ввиду что при перемещении формы за пределы рабочегостола или когда поверх неё появляются другие форрмы то нарисованное на первой затирается - как добиться того чтобы нарисованное не затиралось ?
-
Вам уже вс сказали. Ключевая строка примера
Form.OnPaint := DoPaint;
-
Удалено модератором
|