ورود

View Full Version : درمورد ساختن Screen Saver



arkia
شنبه 06 مهر 1387, 14:04 عصر
من يه چيزي شبيه Screen Saver تو دلفي ساختم كه چند تا سوال داشتم
1- وقتي كه نصبش مي كنم و توي قسمت انتخاب اسكرين سيور گزينه Setting رو ميزنم Preview ميشه. يه كد ميخواستم كه هنگام بالا اومدن برنامه با پارامتر s فرم تنظيمات بياد بالا.
2- يه كد هم ميخوام با آرايه درست كنم كه رنگ هاي استاندارد دلفي بصورت Random انتخاب بشن.
ممنون ميشم اگه دوستان گلم كمك كنن. :قلب:

arkia
شنبه 06 مهر 1387, 14:10 عصر
اين فايل هم ببينيد بدك نيست
جسارتاً دوتا سوال ديگه هم داشتم اول اينكه چجوري ميشه Pointer موس رو مخفي كرد دوم اينكه با چه ترفندي ميشه تشخيص داد موس كمي جابجا شده يا زياد جابجا شده؟؟

Felony
شنبه 06 مهر 1387, 17:34 عصر
وقتي كه نصبش مي كنم و توي قسمت انتخاب اسكرين سيور گزينه Setting رو ميزنم Preview ميشه. يه كد ميخواستم كه هنگام بالا اومدن برنامه با پارامتر s فرم تنظيمات بياد بالا.

در مورد سوال اولی که پرسیدید چیزی نمیدونم و در مورد سوال دوم :

يه كد هم ميخوام با آرايه درست كنم كه رنگ هاي استاندارد دلفي بصورت Random انتخاب بشن.


RGB(Random(255),Random(255),Random(255));

سوال سوم :
چجوري ميشه Pointer موس رو مخفي كرد


ShowCursor(False);

سوال چهارم :
كه با چه ترفندي ميشه تشخيص داد موس كمي جابجا شده يا زياد جابجا شده

مختصات فعلی موس رو بادستور زیر در زمان به نمایش درآمدن فرم بگیر و در یک متغیر سراسری بریز :


Mouse.CursorPos.X;
Mouse.CursorPos.Y;

حالا در رویداد On Mouse Move پروژت چک کن اگه مختصات فعلی موست از مختصاتی که تو اون 2 تا متغییر سراسری ذخیره کردی ، مثلا اگه +10 و -10 تا تفاوت داشتن یعنی موس کم جابه جا شده و اگر از +10 و -10 بیشتر شد (+11 و -11)یعنی موس زیاد جابه جا شده .

arkia
یک شنبه 07 مهر 1387, 00:05 صبح
دوست عزيزم مرسي از كمك بزرگت
مشكلم با اين كد حل شد




ocedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);
var xnow,ynow:integer;
begin
xnow:=x;
ynow:=y;
If (Xnow <> Xlast) Or (Ynow <> Ylast) then close;
end;

pr



و در مورد انتخاب رنگ تصادفي با اين كد :





rndcolor:=Vararraycreate([0,14],varVariant); // create a 10 element array
rndcolor[0]:=clGray;
rndcolor[1]:=clwhite;
rndcolor[2]:=clblack;
rndcolor[3]:=clRed;
rndcolor[4]:=clLime;
rndcolor[5]:=clYellow;
rndcolor[6]:=clBlue;
rndcolor[7]:=clFuchsia;
rndcolor[8]:=clAqua;
rndcolor[9]:=clMaroon;
rndcolor[10]:=clGreen;
rndcolor[11]:=clOlive;
rndcolor[12]:=clNavy;
rndcolor[13]:=clPurple;
rndcolor[14]:=clTeal;

rndcolor[random(15)];

arkia
یک شنبه 07 مهر 1387, 00:23 صبح
ولييييييييي مشكلم در مورد پارامتر تو دلفي هنوز حل نشده

كد visual basic رو دارم ولي كد Delphi رو ميخوام اگه كسي ميتونه كد delphi اينو بنويسه :متفکر:









Select Case UCase$(Left$(Command$, 2))
Case "/C"
MsgBox "There is not setting for this Screen Saver", , ""
Case "/S"
ApplyScreenSaver
Case "/P"
'the screen saver start playing when the usre choose it

Felony
یک شنبه 07 مهر 1387, 04:41 صبح
ولييييييييي مشكلم در مورد پارامتر تو دلفي هنوز حل نشده
كد visual basic رو دارم ولي كد Delphi رو ميخوام اگه كسي ميتونه كد delphi اينو بنويسه

به این لینک (http://www.crashcodes.com/ScreenSaver.htm) مراجعه کن و قسمت 8 رو ببین ...

arkia
یک شنبه 07 مهر 1387, 14:21 عصر
مرسي دوست عزيز مشكلم حل شد بالاخره چيزي كه تو ذهنم بود ساختمش . اينم برنامه نهايي كه مد نظرم بود

arkia
سه شنبه 09 مهر 1387, 16:07 عصر
سلام به دوستان برنامه نويس، چند وقت پيش توي همين سايت يه سري سوالاتي از دوست خوبم SmileSoft در مورد ساختن اسكرين سيور پرسيدم و به كمك اين دوست خوبم تونستم اون چيزي كه تو ذهنم بود رو به برنامه منتقل كنم. و تلاشم نتيجه هم داد. خدمت اساتيد بايد عرض كنم كه من بيشتر تو كار الكترونيكم ويك برنامه نويس مبتدي هستم. اگه تو برنامم اشكالاتي ديديد (كه مطمئنا داره) خوشحال ميشم نظر بديد.حالا با اجازه اساتيد محترم دلفي جسارتاً ميخوام طريقه ساختنش رو براي بروبچ مثل خودم بگم.
تحليل اجمالي برنامه : اين برنامه هنگام لود شدن فرم از كل صفحه نمايش يك عكس (Capture) ميگيره و در Image قرار ميدتش و در هر صدم ثانيه توسط Timer خطوطي رنگي (رنگهاي تصادفي) با مختصات تصادفي روي Image كشيده مي شود. و كاربر طوري فرض مي كند كه انگا اين خطوط روي دسكتاپ و آيكونها كشيده مي شود. در ضمن هنگام لود شدن پروژه پارامتر هاي اون هم چك ميشه كه اگردكمه Setting يا Preview زده شد كدام فرم باز شود.
اين برنامه نياز به دو فرم با نام هاي Form1 و Form2 دارد كه Form1 همان فرم اصلي Screen Saver است و Form2 مربوط به تنظيمات است (اختياري : به جاي فرم دوم( تنظيمات ) ميتوانيد از Showmessage استفاده كنيد)
1- در مرحله اول به فرم يك Timer با نام پيش فرض Timer1 و يك Image با نام پيشفرض Image1 به فرم اضافه مي كنيم.
2- خواص image1 را اين طور تنظيم مي كنيم :




Align:= alClient
Autosize:=True
Center:=True




3- خواص Timer1 را هم به صورت زير:





Enabled:=True
Interval:=1





4- كد هاي Unit1 (مربوط به فرم اصلي Form1)








unit Unit1;

interface

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

type
TForm1 = class(TForm)
Image1: TImage;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Image1Click(Sender: TObject);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private


FLastCursor: TCursor;


{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
xlast,ylast:integer;
implementation

uses Math;

{$R *.dfm}

function CaptureScreen:TBitmap;
var
DC : HDC;
ABitmap:TBitmap;
begin
DC := GetDC (GetDesktopWindow);
ABitmap:=TBitmap.Create;
try
ABitmap.Width := GetDeviceCaps (DC, HORZRES);
ABitmap.Height := GetDeviceCaps (DC, VERTRES);
BitBlt(ABitmap.Canvas.Handle, 0, 0, ABitmap.Width,
ABitmap.Height,DC, 0, 0, SRCCOPY);
finally
ReleaseDC (GetDesktopWindow, DC);
end;
Result:=ABitmap;
end;
procedure TForm1.FormCreate(Sender: TObject);

begin

Screen.Cursor := crNone;
FLastCursor := Screen.Cursor;
ShowCursor(False);

xlast:=Mouse.CursorPos.X;
ylast:=Mouse.CursorPos.Y;

Image1.Picture.Bitmap:=CaptureScreen;

{ application parameters
Select Case UCase$(Left$(Command$, 2))
Case "/C"
MsgBox "There is not setting for this Screen Saver", , ""

Case "/S"
ApplyScreenSaver
Case "/P"
'the screen saver start playing when the usre choose it


}

end;

procedure TForm1.Timer1Timer(Sender: TObject);

var
xxx,yyy,rndcolorselect:integer;
rndcolor:variant;
begin
rndcolor:=Vararraycreate([0,14],varVariant);
rndcolor[0]:=clGray;
rndcolor[1]:=clwhite;
rndcolor[2]:=clblack;
rndcolor[3]:=clRed;
rndcolor[4]:=clLime;
rndcolor[5]:=clYellow;
rndcolor[6]:=clBlue;
rndcolor[7]:=clFuchsia;
rndcolor[8]:=clAqua;
rndcolor[9]:=clMaroon;
rndcolor[10]:=clGreen;
rndcolor[11]:=clOlive;
rndcolor[12]:=clNavy;
rndcolor[13]:=clPurple;
rndcolor[14]:=clTeal;

Randomize;
xxx:=Random(Screen.Width);
yyy:=Random(Screen.Height);
rndcolorselect:=random(15);
image1.Canvas.Pen.Color := rndcolor[rndcolorselect];
Image1.Canvas.Pen.Width:=random(3);
image1.Canvas.LineTo(xxx,yyy);

end;

procedure TForm1.Image1Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);

var xnow,ynow:integer;

begin

xnow:=x;
ynow:=y;

If (Xnow <> Xlast) Or (Ynow <> Ylast) then close;

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ShowCursor(true);
Screen.Cursor := FLastCursor;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
Close;
end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
Close;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
Close;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Close;
end;

end.






5- اين كد هارا هم با Unit پروژه عوض كنيد (توضيح: اين كدها مربوط به پارامتر هاي Screen Saver است)





program ColorLines;

uses
Windows,
SysUtils,
Forms,
Dialogs,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};

{$E .scr}

var
Option: string;

{$R *.res}


procedure ShowScreenSaver;
begin
Application.Title := 'Color Lines Screen Saver';
Application.CreateForm(TForm1, Form1);
end;

procedure ShowSettings;
begin
Application.CreateForm(TForm2, Form2);
end;

procedure ShowPreview;
begin
// Do nothing
end;


begin

Windows.CreateMutex(nil, True, '');
if (Windows.GetLastError <> Windows.ERROR_ALREADY_EXISTS) then
begin
Application.Initialize;
if ParamCount > 0 then
begin

Option := LowerCase(Copy(ParamStr(1), 1, 2));
if Option = '/c' then
ShowSettings
else if Option = '/p' then
ShowPreview
else if Option = '/s' then
ShowScreenSaver
else
ShowMessage('ParamStr(1)=' + ParamStr(1));
end
else
ShowSettings;
Application.Run;
end;
end.




6- براي تبديل كردن از پسوند .EXE به .SCR از منوي Project و Options (Shift+Ctrl+F11) و بند Application به قسمت Output Setting رفته و مقدار target File Extension را به .SCR تغيير دهيد.

والسلام. با اميد و آرزوي سربلندي و موفقيت همه برنامه نويسان ايران :خجالت:

arkia
سه شنبه 09 مهر 1387, 16:14 عصر
اينم سورس برنامه به همراه فايل كامپايل شده.
(توضيح : براي نصب Screen Saver روي آن راست كليك كرده و Install را بزنيد يا فايل اسكرين سيور رو به پوشه Windows كپي كنيد)

arkia
سه شنبه 09 مهر 1387, 16:18 عصر
ادامه مطلب: http://barnamenevis.org/forum/showthread.php?t=125031

Felony
سه شنبه 09 مهر 1387, 17:02 عصر
چرا این فانکشن رو نوشتین ؟ برای چی از صفحه نمایش عکس میگیرید ؟


function CaptureScreen:TBitmap;
var
DC : HDC;
ABitmap:TBitmap;
begin
DC := GetDC (GetDesktopWindow);
ABitmap:=TBitmap.Create;
try
ABitmap.Width := GetDeviceCaps (DC, HORZRES);
ABitmap.Height := GetDeviceCaps (DC, VERTRES);
BitBlt(ABitmap.Canvas.Handle, 0, 0, ABitmap.Width,
ABitmap.Height,DC, 0, 0, SRCCOPY);
finally
ReleaseDC (GetDesktopWindow, DC);
end;
Result:=ABitmap;
end;

فکر نکنم به کامپوننت Image نیازی باشه و همینطور در سه خط زیر میتونستید از Canvas خود فرم برنامه استفاده کنید :


image1.Canvas.Pen.Color := rndcolor[rndcolorselect];
Image1.Canvas.Pen.Width:=random(3);
image1.Canvas.LineTo(xxx,yyy);

البته من از تفکر شما خبر ندارم شاید دلیل خاصی داشته باشه این فانکشن و استفاده از Image

arkia
سه شنبه 09 مهر 1387, 18:48 عصر
چرا این فنکشن رو نوشتین ؟ برای چی از صفحه نمایش عکس میگیرید ؟

دليل گرفتن عكس از صفحه اينه كه روي آن عكس خطخطي بشه من اين كار رو از اسكرين سيور bable همون حبابها كه روي صفحه ميچرخند ياد گرفتم.
استفاده از كامپانت image هم به خاطر خواصيت Center اينجوري بهتره

حالا يه سوال : من ميخواستم بدونم كجا بايد اون عكس كوچكي كه داخل عكس صفحه مانيتور ميندازه رو بزارم ؟ :متفکر:

Felony
سه شنبه 09 مهر 1387, 18:59 عصر
من ميخواستم بدونم كجا بايد اون عكس كوچكي كه داخل عكس صفحه مانيتور ميندازه رو بزارم ؟

منظورتون رو دقیق نفهمیدم !
منظورتون preview هست که در اون مانیتور نشون میده ؟

arkia
چهارشنبه 10 مهر 1387, 03:23 صبح
آره همون كه تو مانيتور بصورت كوچيك نشون ميده؛ فكر كنم يه جورايي Resource رو بايد تغيير بدي نميدونم! اگه كسي دونست مارو بي خبر نزاره. دوست عزيز تو هم خيلي به زحمت انداختيم خدا يك در دنيا و 10000000 در آخرت....

Felony
چهارشنبه 10 مهر 1387, 09:42 صبح
دوست عزيز تو هم خيلي به زحمت انداختيم خدا يك در دنيا و 10000000 در آخرت....

من هیچ زحمتی نکشیدم تمام این چیزا رو از همین دوستان تو همین سایت یاد گرفتم و حالا حالا ها هم باید شاگردیشونو بکنم ...

والا در مورد این سوال آخری هم هیچ اطلاعاتی ندارم ...

AMIRHOSSEINMAJD
پنج شنبه 11 مهر 1387, 13:37 عصر
اينم سورس برنامه به همراه فايل كامپايل شده.
(توضيح : براي نصب Screen Saver روي آن راست كليك كرده و Install را بزنيد يا فايل اسكرين سيور رو به پوشه Windows كپي كنيد)


سلام خوبین؟آقا من هرکاری میکنم این فایل رو نمیتونم دانلود کنم.شاید به خاطره نرم افزار دانلودم.میشه کمکم کنید.نرم افزارم دپ هست.

arkia
شنبه 13 مهر 1387, 01:03 صبح
سلام خوبین؟آقا من هرکاری میکنم این فایل رو نمیتونم دانلود کنم.شاید به خاطره نرم افزار دانلودم.میشه کمکم کنید.نرم افزارم دپ هست.

دوست عزيز از برنامه Orbit Downloader استفاده كن خيلي بهتر از دپه اينم آدرس سايتش :
http://www.orbitdownloader.com/

SirMehdi
چهارشنبه 04 آذر 1388, 23:07 عصر
سلام دوستان
چطور می تونیم زمان بیکار بودن کامپیوتر یا برناممون رو بدست بیاریم؟؟
فرض کنید یک برنامه داریم می خوایم ست کنیم تو یه زمانی(2 دقیقه یا 5 دقیقه ) اگر کاربر هیچ کاری نکرد یه صفحه جدید باز شه و به محض کار مجدد کاربر، بسته بشه.
تاپیک های زیادی رو خوندم. نهایت چیزی که پیدا کردم استفاده از تایمر بود!! من دنبال تابع API یا چیزی غیر تایمر هستم کسی راه حل سراغ داره؟؟؟
ممنون میشم از کمکتون (;

arkia
پنج شنبه 05 آذر 1388, 14:42 عصر
سلام ، یادمه قبلانا همچین چیزی که میگی رو دیدم یعنی از api یک زمان میگرفتیم که با تکان دادن ماوس یا کلیدی از کیبرد ریست میشد. بگردی پیدا میشه مطمانا هست. اگه وقت داشتم میگشتم برات پیدا میکردم.