PDA

View Full Version : گفتگو: تابع تنظیم اندازه فرم برنامه در کامپیوترهایی با رزولیشن های متفاوت



saeedhushmand
دوشنبه 01 خرداد 1391, 15:59 عصر
از دوستان خواهش می کنم بگن برای رزولیشن در کامپیوترهای مختلف راه حلی دارند
من خودم یک برنامه نوشتم که توی یک لب تاب مینی فرم هاش بعضی قسمتاش دیده نمی شد و کاربر امکان کار با اونو توی این نوع لب تاب ها نداشت ، توی خیلی از AutoRun ها هم دیدم این مشکل مثلا توی king 2012 بدلیل بزرگی اتوران کاربر امکان استفاده از اتوران را ندارند(تو لب تاب مینی) توی اینترنت هم خیلی گشتم ولی چیز خاصی پیدا نکردم
اومدم یک تابع نوشتم به صورت زیر می خواستم نظر دوستان رو در مورد این تابع بدونم و اگه راحه مناسب تری هم دارند بنویسند ممنون می شم





publicvoid ResolutionForm()
{

Screen scrn = Screen.FromControl(this);
if (scrn == null)
{
scrn = Screen.PrimaryScreen;
}
int deskHeight = scrn.Bounds.Height;
int deskWidth = scrn.Bounds.Width;
int Width = deskWidth;
int Heigth = deskHeight;
int FormHeight = this.Size.Height;
int FormWidth = this.Size.Width;
int WidthFormNew = (FormWidth * deskWidth) / 1366; //...............Width Resulation
int HeightFormNew = (FormHeight * deskHeight) / 768; //...............Height Resulation
this.Size = newSize(WidthFormNew, HeightFormNew);
this.StartPosition = FormStartPosition.Manual;
this.Location = newPoint((deskWidth - WidthFormNew) / 2, (deskHeight - HeightFormNew) / 2);
}

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


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



publicvoid ResolutionControls(Control A)
{
Screen scrn = Screen.FromControl(this);
if (scrn == null)
{
scrn = Screen.PrimaryScreen;
}
int deskHeight = scrn.Bounds.Height;
int deskWidth = scrn.Bounds.Width;
int Width = deskWidth;
int Heigth = deskHeight;
int FormHeight = this.Size.Height;
int FormWidth = this.Size.Width;
int WidthFormNew = (FormWidth * deskWidth) / 1366; //...............Width Resolution
int HeightFormNew = (FormHeight * deskHeight) / 768; //...............Height Resolution
int WidthControl = A.Size.Width;
int HeightControl = A.Size.Height;
A.Size = newSize(WidthFormNew * WidthControl / FormWidth,HeightFormNew * HeightControl / FormHeight);
int LocationControlX = A.Location.X;
int LocationControlY = A.Location.Y;
A.Location = newPoint(WidthFormNew * LocationControlX / FormWidth, HeightFormNew * LocationControlY / FormHeight);
}


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

و پس از نوشتن این 2 تابع در فرم باید کد زیر رو به قسمت لود فرمت اضافه کنی



برای تغییر اندازه فرم
ResolutionForm();

برای تغییر اندازه کنترل های داخل فرم
ResolutionControls(dataGridView1);
ResolutionControls(checkBox1);
ResolutionControls(button1);
ResolutionControls(button2);
ResolutionControls(button3);
ResolutionControls(button4);

NasimBamdad
چهارشنبه 03 خرداد 1391, 17:59 عصر
از خاصیت Auto Scrol استفاده کن ! زمانی که اندازه تغییر کرد Scrol بندازه !

saeedhushmand
چهارشنبه 03 خرداد 1391, 18:15 عصر
این ایده ای که تو دادی عملی نیست من گفتم قسمتی از فرم از بالا یا پایین از صفحه بعضی از مانیتورها خارج می شه خب اگه این کار اتفاق بیفته کاربر scrol نمی بینه که بخواهد تکون بده ...
تازه بعدشم این کار باعث زشت شدن فرممون می شه

dj.graph
چهارشنبه 03 خرداد 1391, 19:00 عصر
به نظر من کل فرم برنامتو یه رزولیشن معمولی در حد استاندارد بگیر ، بعد وقتی برنامه تو هر کامپیوتری اجرا شد رزولیشن فرم برنامه رو از رزولیشن کامپیوتری بگیره که برنامه داره توش اجرا میشه.
مثلا رزولیشن فرم رو در حد 800 در 600 بگیر (بستگی به طراحی خودت داره)
بعد با دو خط کد میتونی رزولیشن کامپیوتر هر کسی که داره از برنامه استفاده میکنه رو در بیاری
بعد بازم دو یا سه خط کد داره، که بگی سایز رزولیشن رو مثلا 50 پیکسل کمتر یا همون اندازه رزولیشن کامپیوتر طرف بگیره
اینطوری مشکلت حل میشه، منم این مشکل رو داشتم که به اینصورتی که گفتم حلش کردم....
راستی، شاید راه حل بهتری هم باشه ، ولی من اینجوری مشکلم رو رفع کردم.
اگه سوالی داشتی در خدمتم....

NasimBamdad
پنج شنبه 04 خرداد 1391, 14:25 عصر
به نظر من کل فرم برنامتو یه رزولیشن معمولی در حد استاندارد بگیر ، بعد وقتی برنامه تو هر کامپیوتری اجرا شد رزولیشن فرم برنامه رو از رزولیشن کامپیوتری بگیره که برنامه داره توش اجرا میشه.
مثلا رزولیشن فرم رو در حد 800 در 600 بگیر (بستگی به طراحی خودت داره)
بعد با دو خط کد میتونی رزولیشن کامپیوتر هر کسی که داره از برنامه استفاده میکنه رو در بیاری
بعد بازم دو یا سه خط کد داره، که بگی سایز رزولیشن رو مثلا 50 پیکسل کمتر یا همون اندازه رزولیشن کامپیوتر طرف بگیره
اینطوری مشکلت حل میشه، منم این مشکل رو داشتم که به اینصورتی که گفتم حلش کردم....
راستی، شاید راه حل بهتری هم باشه ، ولی من اینجوری مشکلم رو رفع کردم.
اگه سوالی داشتی در خدمتم....

میشه نمونه کدت رو بزاری ؟

saeedhushmand
پنج شنبه 04 خرداد 1391, 15:04 عصر
این کاری که dj.graph می گه همون کاری که من کردم به این صورت که

1-رزولیشن کامپیوتری که من برنامه رو توش ساختم (همون 1366 , 768) که من در بالا گفتم ---------> dj.graph : مثلا رزولیشن فرم رو در حد 800 در 600 بگیر (بستگی به طراحی خودت داره)

2-توی کد اولم من با 5 خط اول رزولیشن کامپیوتر مقصد رو دراوردم ---------------> dj.graph : بعد با دو خط کد میتونی رزولیشن کامپیوتر هر کسی که داره از برنامه استفاده میکنه رو در بیاری

3- بعد من با انجام یک سری عمل ریاضی اندازه جدید فرم (در کامپیوتر مقصد ، نسبت به رزولیشن اون) بدست اوردم ---------> dj.graph :بعد بازم دو یا سه خط کد داره، که بگی سایز رزولیشن رو مثلا 50 پیکسل کمتر یا همون اندازه رزولیشن کامپیوتر طرف بگیره

تازه مشکل ما با تغییر اندازه فرم در کامپیوتر مقصد بیشتر می شه چوت مثلا با کوچک شدن فرم اندازه کنترل ها و تنظیم کنترل های داخل فرم بهم می ریزه از خاصیت Anchor نمی شه استفاده کرد چون امکان داره مثلا یک button بسیار کوچک یا اصلا ناپدید کنه
در تابع دوم هم من مقدار location و size کنترل های داخل فرم رو نسبت به تغییر سایز فرم تغییر دادم

jmfnima
پنج شنبه 04 خرداد 1391, 16:58 عصر
با سلام به شما دوست عزیز
برای حل این مشکل یک کامپوننت به نامه Resize هست که میتونی ازش استفاده کنی و کامپوننتش هم توی همین سایت میتونی پیدا کنی .

Mahmoud.Afrad
پنج شنبه 04 خرداد 1391, 19:22 عصر
توسط tableLayoutPanel به راختی میشه این کار رو انجام داد. فقط میبایست در لود فرم فرمها اندازه فرم رو براساس رزولوشن تنظیم کنید.
یک مثال برای تغییر اندازه کنترل ها براساس اندازه فرم میزارم

dj.graph
شنبه 06 خرداد 1391, 00:38 صبح
سلام
يك نمونه از كاري كه تو تاپيك قبلي گفتم رو اينجا واسه دانلود ميزارمش. اميدوارم كه به دردتون بخوره...
دانلود (http://tb18r2.trainbit.com/files/8323689884/v3516350322B5739646E67414B4171755763727A39616E5836 4A365352755848354A64626F47487A4A506954767265744F67 4B656464773D3D/?c=1212)

dj.graph
شنبه 06 خرداد 1391, 00:41 صبح
در ضمن؛ براي بدست آوردن رزوليشن هر كامپيوتر اصلا نيازي به 5 خط كد نيست دوست عزيز..



var Height = SystemInformation.PrimaryMonitorSize.Height;
var Width = SystemInformation.PrimaryMonitorSize.Width;

saeedhushmand
شنبه 06 خرداد 1391, 12:20 عصر
دوست عزیز ما مشکلمون اصلا 2 خط یا 5 خط کد نیست تازه اگر کد تو هم مثل کد من خط های کوتاه داشته باشه همون 5 خط میشه ما این تاپیک برای بدست اوردن راه حلی بهتر ایجاد کرده ایم
که یکی از این راه حل ها رو دوستمون mafaman2003 گفت که بهتر به جای کد برای تغییر اندازه کنترل ها از tableLayoutPanel استفاده کنیم که راه حل منطقی هم هستش و دیگر نیازی به کدی برای کنترل ها نیست و فقط کد تغییر سایز فرم کافی....

saeedhushmand
شنبه 06 خرداد 1391, 12:29 عصر
من توی تاپیک 9 دوستمون dg.graph نمونه کاری که گذاشته بود رو نگاه کردم اصلا کد درستی نیست

این کد استفاده شده تو پروژه دوستمون


// بدست آوردن سايز مانيتور = رزولوشن
var Height = SystemInformation.PrimaryMonitorSize.Height;
var Width = SystemInformation.PrimaryMonitorSize.Width;
this.Height = Height - 50;
this.Width = Width - 50;


این کد اندازه رزولیشن کامپیوتر مقصد رو بدست می یاره اما هر چی بود 50 واحد از اون کم می کنه حتی اگه رزولیشن کامپیوتر مقصد برابر باشه با اون رزولیشن کامپیوتر مبدا تازه اگه اختلاف رزولیشن 2 کامپیوتر بیش از 50 واحد باشه باز هم کنترل های فرم ناپدید می شوند
اما کد تغییر سایز من دقیق عمل می کنه و رزولیشن کامپیوتر اول رو نسبت به کامپیوتر مقصد می سنجه و بر اساس اون سایز جدید رو می ده
بعد هم اصلا در کد دوستمون تغییر سایز روی فرم اعمال نمی شه چون کدی سایزی برای تغییر سایز فرم نیست