PDA

View Full Version : سوال: مشکل با Create و FloodFill هنگام کار با +GDI ؟!



mbshareat
دوشنبه 11 بهمن 1389, 23:29 عصر
با سلام:قلب:
من تازگی می خوام یه برنامه ترسیم ساده می نویسم. مجبورم توی اون از +GDI استفاده کنم.:گیج:
هنگام شروع به کار چندتا مساله برام پیش اومد:
(ببخشید بیش از یه سوال می کنم.چون کد من برای همه سوالهام یکیه بهتره همه رو یه جا بپرسم!:بامزه:)
اولا چرا نمی تونم متغیر عمومی از نوع TGPGraphics داشته باشم و در Create از فرم اون رو تعریف کنم و مجبورم هر دفعه که می خوام از این متغیر استفاده کنم از اول این متغیر عمومی رو Create کنم.(اگه فقط تو Create فرم این متغیر رو Create کنم ایراد نمی گیره ولی چیزی هم رسم نمی کنه!)
در ضمن چرا می تونم هر بار بدون اینکه این متغیر رو Free کنم دوباره Create کنم؟
چرا وقتی عملیات ترسیم رو توی Canvas فرم انجام می دم نیاز به Refresh ندارم برخلاف هنگام ترسیم بر روی Image ؟
چرا وقتی FloodFill رو بعد از تعریف متغیر فوق الذکر به کار می برم کار نمی کنه ولی وقتی تو رویداد MouseUp اجرا می کنم کار می کنه.
(اگه فقط همین رو هم جواب بدین برام کافیه چون اگه نتونم از این دستور استفاده کنم مجبور می شم خودم کدی بنویسم (چیزی شبیه Magic Wand) که این کار رو انجام بده که معلوم نیست سریع هم باشه:لبخند:)
این هم کل کد داخل یونیت که برای استفاده باید یه Image هم روی فرم باشه و روی اون کلیک کنید و رها کنید تا پس از رها کردن ماوس خطی رسم بشه!:خجالت:


unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,GDIPAPI,GDIPOBJ, ExtCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
public
procedure GDIAction(Cmd:String);
end;
var
Form1: TForm1;
P1,P2:TPoint;
GP: TGPGraphics;
PE:TGPPen;
MouseIsDown:Boolean;
implementation
{$R *.dfm}
procedure TForm1.GDIAction(Cmd:String);
Begin
GP:= TGPGraphics.Create(Image1.Canvas.Handle);
PE:=TGPPen.Create(MakeColor(0,0,0),1);
If Cmd='Line' Then
GP.DrawLine(PE,P1.X,P1.Y,P2.X,P2.Y)
Else
Image1.Canvas.FloodFill(P1.X,P1.Y,Image1.Canvas.Pi xels[P1.X,P1.Y],fsSurface);
//نمی دونم چرا Image1.Canvas.Refresh; درست جواب نمی ده!
Image1.Refresh;
End;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
GP.Free;
PE.Free;
end;
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
MouseIsDown:=True;
Image1.canvas.Pixels[X,Y]:=0;
P1.X:=X ;
P1.Y:=Y ;
P2:=P1;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
If Button=mbRight then
Begin
Image1.Canvas.Brush.Color:=clYellow;
GDIAction('Fill');
End
Else
GDIAction('Line');
MouseIsDown:=False;
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
If MouseIsDown=False Then
Exit;
P2.X:=X ;
P2.Y:=Y ;
end;
end.