PDA

View Full Version : حذف لرزش در کارهای گرافیکی



samprp
شنبه 10 شهریور 1386, 10:22 صبح
چه طوری باید لرزش ها و یا چشمک هایی که در مواقع کارهای گرافیکی مثل نمایش یا مخفی کردن یک کمپوننت به وجود می یاد رو حذف کرد . حتما دیدین وقتی یک کمپوننت مثل یه باتن رو show یا hide می کنین زیر فرم دیده می شه و یا وقتی عکس یه image رو تغییر می دیدن صفحه ی image یک بار چشمک می زنه .
من در حال ایجاد یک پروژه ی گرافیکی هستم و این موارد واقعا ظاهر برنامه رو بد می کنن.
plz hlp me.

hossein taghi zadeh
شنبه 10 شهریور 1386, 10:37 صبح
با سلام

در مورد Image می تونید فایل تون رو رسم کنید با متد Draw و با استفاده از یک متغیر از نوع TGraphic که فایل تون رو توی این متغیر لود کنید و اون رو داخل Image رسم کنید.

تو این لینک (http://barnamenevis.org/forum/showthread.php?t=66183) هم توضیحاتی در این مورد داده شده.

Arman_1367
شنبه 10 شهریور 1386, 11:40 صبح
من تاپیک قبلی را ندیده بودم وگرنه حتماً این را هم ذکر می کردم.
با سلام

همانطور که همه ی شما می دانید هنگامی که یک کنترل Invalidate می شود چندین پیغام مختلف پشت سر هم برای آن ارسال می شود که هر کدام کار خاصی را انجام می دهد یکی از این پیغام ها WM_EraseBkgnd هست که در اکثر کمپاننت های غیر حرفه ای که دوستان می نویسند مدیریت نشده و همان کار پیش فرض را انجام می دهد که در واقع پر کردن کل DC با رنگ مشخص شده برای کنترل است.حالا به مثال زیر توجه کنید که چگونه مشکل را حل می کنم.:


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, jpeg;

type
TEXamPnl=class(TPanel)
Private
Procedure WMEraseBkgnd(Var MSG:TWMEraseBkgnd);Message WM_EraseBkgnd;
End;
TForm1 = class(TForm)
Image1: TImage;
Button1: TButton;
Panel1: TPanel;
Image2: TImage;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
Pnl:TEXamPnl;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TEXamPnl }

procedure TEXamPnl.WMEraseBkgnd(var MSG: TWMEraseBkgnd);
begin
//do nothing Here
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Pnl:=TEXamPnl.Create(Self);
With Pnl do
Begin
Left:=10;
Top:=10;
Width:=50;
Height:=50;
Parent:=Form1;
End;
Image1.Parent:=Pnl;
Image1.Align:=alClient;
end;

procedure TForm1.Button1Click(Sender: TObject);
Var I:Integer;
begin
For I:=0 to 50 do
Begin
Pnl.Width:=Pnl.Width+1;
Pnl.Height:=Pnl.Height+1;
Panel1.Width:=Pnl.Width;
Panel1.Height:=Pnl.Height;
Application.ProcessMessages;
Sleep(100);
End;
end;

end.


فقط دو تا Image را با یک عکس پر کنید و نتیجه را ببینید چه قدر زیبا بدون تلف شدن حافظه خاصی مشکل حل شد البته راه آقای کشاورز نیز خوب هست اما اگر یک کمپاننت اسکین هم به برنامه اضافه بشه اون وقت دیگه باید بی خیال کلی حافظه بشویم.

Valadi
شنبه 10 شهریور 1386, 15:27 عصر
اینو امتحان کن

procedure TForm1.FormCreate(Sender: TObject);
begin
DoubleBuffered := True;
end;

Arman_1367
یک شنبه 11 شهریور 1386, 16:54 عصر
کاربر Valadi اگر به لینک آقای تقی زاده یک سری می زدید می دیدید که مربوط به همین کد شما که آقای کشاورز توضیح داده اند.