PDA

View Full Version : سوال: تغییر اندازه صفحه نمایش بدون به هم خوردن اندازه پنجره ها!؟



mbshareat
سه شنبه 04 خرداد 1395, 22:14 عصر
سلام
من دارم یه بازی فلش می سازم.
بازی فلشم چون تقریبا همه اش ترسیم برداری هست، خیلی کند اجرا میشه(یه سر به وبلاگم بزنید:mbshariat.mihanblog.com)
بهترین راه حل سرعت دادن به اجراش تغییر رزولوشن هست(تغییر کیفیت هم توی بازیم کافی نیست!)
در بازیهای فلش بر خلاف بازیهای سه بعدی و بازیهای یونیتی نمیشه رزولوشن پنجره بازی رو تغییر داد.
تنها راه اینه که رزولوشن ویندوز رو کامل تغییر بدیم نه فقط رزولوشن بازی!
وقتی رزولوشن ویندوز رو تغییر می دیم آیکن های دسکتاپ به هم میخورند!
من یه کد دارم که بتونم آیکن های دسکتاپ رو مخفی کنم و نمایش بدم.و کدی هم دارم که رزولوشن رو تغییر بدم
برای نمایش دسکتاپ هم کدی شبیه سازی فشار کلدی ویندوز و D میشه گذاشت اما نمی دونم در صفحه کلیدی که کلید ویندوز نداره کار می کنه یا نه.
حتی اگه تمام این کارها رو انجام بدم، اگه یه برنامه باز باشه مثلا دلفی و برم به محیط دسکتاپ و رزولوشن رو کم کنم و بعد از اجرای بازی فلش رزولوشن رو برگردونم به حالت قبل باز می بینم پنجره های دلفی یه گوشه کوچ شده و جمع شده اند!
آیا راهی هست که فقط برای یه برنامه(منظورم فلش پلیر مستقل از مرورگر هست) رزولوشن تعیین کنیم یا فقط کار دایرکت ایکس و Opengl هستش؟
اگه راهی نیست، کدی میخوام که بدون شبیه سازی فشار کلید دسکتاپ رو نمایش بده.

یوسف زالی
چهارشنبه 05 خرداد 1395, 00:36 صبح
سلام حاجی. نه خسته! شهرتون بودیم هفته پیش. گرمت نمی شه؟ :قهقهه::قهقهه::قهقهه:
وقتی بازی ریلیز می شه می تونی اون رو در قالب یک فایل اجرایی مستقل در بیاری. خب در این حالت هم می تونی تو مود فول اسکرین زوم شده رانش کنی. درسته؟

mbshareat
چهارشنبه 05 خرداد 1395, 15:26 عصر
سلام
تازه کجاش رو دیدی..یه ماه دیگه بیا.ما پارسال ماه رمضون ساعت تقریبا سه کلاس داشتیم.تعجب می کنم چند هزار نفر از مردم چطور حرم میرند فقط ترتیل گوش کنند.دو تا دوست داشتم مشکلشون تشنگی نبود!!!
فلش فایل اجرایی میسازه اما چون ترسیمات برداری هستند معنیش این میشه که ترسیمش کش اومدنی نیست بلکه باید ناحیه بیشتری ترسیم کنه و رنگ کنه(امیدوارم بدونید وکتور چیه!!!)
بنابر این اگه با رزولوشن 1900 بخواید اجرا کنید خیلی فرق می کنه تا با 1024 اجرا کنید!(شک دارید خودتون از روی دستهای بیرون اومده از زمین بپرید امتحانش کنید!)
اگه میشد فایل فلش رو با دایرکت ایکس اجرا کرد خوب بود ولی ...
حالا من فقط یه خواسته دارم:
کدی میخوام که دسکتاپ رو باهاش نشون بدم مثل اینکه دکمه Win+D رو فشار داده باشم.و نمیخوام شبیه سازی فشار کلید باشه.
اگه ممکنه کمک کنید.

یوسف زالی
چهارشنبه 05 خرداد 1395, 16:51 عصر
امیدوارم بدونید وکتور چیه!!!

در این حد نه دیگه!
اصولا وکتور هم قابل زومه، اصلا وکتور برای همین قابلیت زومش وکتوره، حالا این یه بحث دیگه است.

برای نمایش دسکتاپ می تونی یه مسیج به همه برودکست کنی مینیمایز بشن، یه کد از shell32 هم دیدم، که نتونستم رانش کنم، تست کن اگر نشد برات سعی می کنم نمونه بزنم.

mbshareat
چهارشنبه 05 خرداد 1395, 18:31 عصر
این که گفتی یعنی چی؟
راستش دیگه بیخیالش شدم.همین که کامپیوترم با این کد کار می کنه برام کافیه:
var
key, flag : Word;
begin
//Left Win + down
keybd_event(VK_LWIN, 0, 0, 0);

// + M + down
key := Ord('M');
flag := 0;
keybd_event(key, MapvirtualKey(key, 0), flag, 0) ;

// + M + up
flag := flag or KEYEVENTF_KEYUP;
keybd_event(key, MapvirtualKey(key, 0), flag, 0) ;

//Left Win + up
keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0);

end;

mbshareat
چهارشنبه 05 خرداد 1395, 19:07 عصر
دو سوال مرتبط دارم که خودش بحث داره.
ببخشید اینجا مطرح می کنم(نمی خوام داستان رو توی تاپیک دیگه از اول تعریف کنم!)

فرض کنید یه فایل اجرایی داریم که عبارت باشه از بازی فلش به صورت فایل اجرایی به نام:TestGame.exe

سوال اول:
میخوایم با برنامه بفهمیم که کی بسته میشه.که آیکن های دسکتاپ رو دوباره مرئی کنیم.
من امتحان کردم دیدم عنوان پنجره Macromedia Flash Player 6 و کلاسش ShockwaveFlash بود که اطلاعات دقیق به آدم نمیده چون
اگه یه بازی فلش دیگه هم با این اجراگر اجرا کنم باز همین خصوصیات رو داره.راهی هست بفهمم TestGame.exe هنوز در حال اجرا هست یا بسته شده؟
سوال دوم:
راهی هست که برنامه دلفی که برنامه اجراگر فلش رو بررسی می کنه از نوار تسک بار حذف بشه؟(لطفا زیاد کشش ندید.توی سایت در مورد مقیم حافظه چیزهایی خوندم ولی جوابی توش نبود و سر در نیوردم!)این رو هم بگم که برنامه بعد از نمایش مجدد آیکنهای دسکتاپ خودش به پایان میرسه.


--(
جالبه فایل فشرده با حجم 811 هم برای سایت زیاده و نمیذاره براتون بذارم.
راستی چرا هر بار در تالار جیتجو میدم با پیغام خطای سایت مواجه میشم؟
)---

mbshareat
چهارشنبه 05 خرداد 1395, 19:32 عصر
جواب سوال دوم رو فهمیدم:
procedure TForm1.FormPaint(Sender: TObject);
begin
ShowWindow(Application.Handle, SW_HIDE);
hide;
// Sleep(5000); // wait 5 seconds
// Show; // show Form1
// ShowWindow(Application.Handle, SW_SHOW);
end;

mbshareat
چهارشنبه 05 خرداد 1395, 19:49 عصر
var
DeskHandle : HWND;

///////////////////////////////////////////////////////////////////////
// Callback function for EnumWindows
///////////////////////////////////////////////////////////////////////
function MyGetWindow (Handle: HWND; NotUsed: longint): bool; stdcall;
var
hChild : HWND;
begin
if handle <> 0 then
begin
hChild := FindWindowEx(handle, 0, 'SHELLDLL_DefView' ,nil);
if hChild <> 0 then
begin
hChild := FindWindowEx(hChild, 0, 'SysListView32' ,nil);
if hChild <> 0 then
begin
DeskHandle := hChild;
end;
end;
end;
result := TRUE;
end;

procedure ShowDesktopIcons(const Show : boolean) ;
begin
DeskHandle := 0;
EnumWindows(@MyGetWindow, 0);

if DeskHandle <> 0 then
begin
if Show then
begin
ShowWindow(DeskHandle, SW_SHOW );
end
else
begin
ShowWindow(DeskHandle, SW_HIDE );
end;
end;
end;
Procedure ShowDesktop();
var
key, flag : Word;
begin
//Left Win + down
keybd_event(VK_LWIN, 0, 0, 0);

// + M + down
key := Ord('M');
flag := 0;
keybd_event(key, MapvirtualKey(key, 0), flag, 0) ;

// + M + up
flag := flag or KEYEVENTF_KEYUP;
keybd_event(key, MapvirtualKey(key, 0), flag, 0) ;

//Left Win + up
keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0);

end;
Function ExecuteAndWait(sExecutableFile : String) : Boolean;
var
siInfo : TStartUpInfo;
piInfo : TProcessInformation;
begin
FillChar(siInfo, SizeOf(siInfo), #0);

with siInfo do begin
cb := SizeOf(siInfo);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := SW_SHOWNORMAL;
end;
Result := CreateProcess(NIL, pChar(sExecutableFile), NIL, NIL, FALSE, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, NIL, pchar(ExtractFilePath(sExecutableFile)),siInfo, piInfo);
if Result then
WaitForSingleObject(piInfo.hprocess,INFINITE);
end;
function SetScreenResolution(Width, Height: integer): Longint;
var
DeviceMode: TDeviceMode;
begin
with DeviceMode do begin
dmSize := SizeOf(TDeviceMode);
dmPelsWidth := Width;
dmPelsHeight := Height;
dmFields := DM_PELSWIDTH or DM_PELSHEIGHT;
end;
Result := ChangeDisplaySettings(DeviceMode, CDS_UPDATEREGISTRY);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
OldWidth,OldHeight:Word;
begin
OldWidth := GetSystemMetrics(SM_CXSCREEN);
OldHeight := GetSystemMetrics(SM_CYSCREEN);
ShowDesktop;
ShowDesktopIcons(False);
SetScreenResolution(800,600);
//winexec(PCHar(ExtractFileDir(Application.exeName)+ '\TestGame.exe'),SW_SHOWNORMAL);
ExecuteAndWait(ExtractFileDir(Application.exeName) +'\TestGame.exe');
SetScreenResolution(OldWidth,OldHeight);
ShowDesktopIcons(True);
Application.Terminate;
end;

mbshareat
چهارشنبه 05 خرداد 1395, 20:07 عصر
باید درست کار کنه اما نمی دونم چرا آیکنهای دسکتاپ به حالت قبل بر نمی گرده !
فقط این رو فهمیدم که اگر قبل از اجرای بازی اندازه رو تغییر بدم آیکنها به حالت اول بر نمی گردند!
ظاهرا یه راه دیگه برای فهمیدن بسته شدن بازی باید برم!

آخه چرا هیچ کی نمیاد بازیم رو در وبلاگم ببینه و نظر بده.شاهکاره!!!