PDA

View Full Version : حرفه ای: ایجاد یک برنامه گرافیکی



alimooghashang
یک شنبه 12 شهریور 1391, 11:26 صبح
سلام
من یه برنامه ی گرافیکی دارم که یه شکلی رو داخل یک شیء bitmap میکشم و اون شکل رو باید روی فرم بکشمش و نمایشش بدم
و باید یک سری شیء دیگه بسازم روی فرم که بتونم هم خودم اونا رو درگ کنم روی تصویر و هم بتونن خودشون طبق یه الگوریتم خاص حرکت بکنن!
مثلا یک منحنی داخل تصویر کشیدم، و یک سری شیء مثل button یا panel باید بسازم (در زمان اجرا چون تعدادش مشخص نیس) و این اشیاء روی اون خط حرکت کنند و این اشیاء هر کدوم یک سری عکس بهشون assign میشه که اونا هم باید transparent باشند که هاشیه های اضافیشون حذف شده باشه!من خودم در زمان اجرا حدود 500 شیء panel ساختم و ریختم روی فرم بصورت رندم، با تکون دادن هر کدوم رفرش شدن صفحه یه جوریه!


برای این کار شما چه روشی رو پیشنهاد میکنید؟
قلق خاصی داره؟
ممنون

alitavakoli
یک شنبه 12 شهریور 1391, 11:39 صبح
دوست عزیز اگه هنگام درگ کردن اشیاء صفحتون لرزش داره به این صورت (http://naras.ir/index.php/discussions/لرزش-صفحه-هنگام-حرکت-موس) عمل کنید.

alimooghashang
یک شنبه 12 شهریور 1391, 11:53 صبح
نه مشکل من این نیست
مشکلم اینه چون 500 شیء پنل کنار همه طول میکشه تا جابجاشون کنه و موقعیت جدید بهشون بده یه جورایی انگار یکی یکی این کار رو که انجام میده اینطوری میشه
نمیدونم ولی به نظر شما نباید قبل از اینکه اشیا رو جابجا کنم، suspendlayout و بعدش resumelayout کنم؟

alitavakoli
یک شنبه 12 شهریور 1391, 12:10 عصر
دوست عزیز حد اکثر تعداد کنترل های روی فرم به موارد زیر بستگی داره
1- سیستم ram
2-ریزولوشن
3-پیچیدگی فرم
تعداد 500 تا کنترل برای یک فرم زیاد هست
اگه امکان داره کد رو قرار بدید تا راحلی براش پیدا کنم

alimooghashang
یک شنبه 12 شهریور 1391, 12:13 عصر
متاسفانه امکانش نیست که کد رو آپلود کنم
اگر بخواهید 500 تا شیء بزارید چیکار باید کرد؟

ASKaffash
یک شنبه 12 شهریور 1391, 12:14 عصر
سلام
برای جلوگیری از سکته برای Refresh کردن از کلاسهای ذیل استفاده کنید :
BufferedGraphicsContext
BufferedGraphics

alimooghashang
یک شنبه 12 شهریور 1391, 12:23 عصر
سلام
برای جلوگیری از سکته برای Refresh کردن از کلاسهای ذیل استفاده کنید :
BufferedGraphicsContext
BufferedGraphics

ممنون
میشه دقیقا مشخص کنید چیکار باید کرد؟ و یه سمپل اگه موجوده بذارید؟

ASKaffash
یک شنبه 12 شهریور 1391, 13:18 عصر
سلام
مثال در MSDN است ولی برای شروع :
ابتدا این کد را در مثلا متد سازنده قرار دهید :
this.SetStyle(ControlStyles.AllPaintingInWmPaint |ControlStyles.UserPaint, true);
this.BufferedGraphicsContext =BufferedGraphicsManager.Current;
this.BufferedGraphicsContext.MaximumBuffer =newSize(this.Width + 1, this.Height + 1);
this.BufferedGraphics =this.BufferedGraphicsContext.Allocate(this.Create Graphics(), newRectangle(0, 0, this.Width, this.Height));
برای OnPaint هم مثل ذیل عمل کنید :
this.Draw(BufferedGraphics.Graphics);
this.BufferedGraphics.Render(this.CreateGraphics() );

alimooghashang
سه شنبه 14 شهریور 1391, 16:13 عصر
ممنون
الان باید تصویری که روی فرم کشیده بشه رو چطوری بکشم روی فرم؟
چطوری میشه بعنوان backgroundimage فرم تعیین کرد تصویری که کشیدمش رو؟

ASKaffash
چهارشنبه 15 شهریور 1391, 07:12 صبح
سلام
کلاس Graphics متد DrawImage دارد در مثال من شما درون متد Draw هرچه خواستید با استفاده از متدهای Graphics ترسیم کنید و سکته هم ندارد

alimooghashang
چهارشنبه 15 شهریور 1391, 10:53 صبح
ببینید من الان یه شیء ساختم از کلاس Graphics و شکل رو روی اون میکشم، و بعد اون عکس رو روی فرم میکشم به این صورت

Bitmap tmpBmp = new Bitmap(Width, Height);
Graphics graphics = Graphics.FromImage(tmpBmp);
this.CreateGraphics().DrawImage(tmpBmp, 0, 0);

خب حالا چه تغییراتی باید اعمال کنم که به این فرمی که شما گفتید تبدیل بشه؟

حالا یه سوال دیگه
چکار باید کنم که tmpBmp رو بتونم بعنوان backgroundImage فرم داشته باشم؟ چون اگه تصویر رو بکشم روی فرم به روش بالا، شیء هایی که گذاشتم روی فرم ترنسپرنت به رنگ BackColor میشن که من نمیخوام و میخوام به BackGroundImage فرم transparent بشن
ممنون میشم راهنمایی کنید

alimooghashang
شنبه 18 شهریور 1391, 15:19 عصر
تست کردم نشد :(

alimooghashang
شنبه 18 شهریور 1391, 15:28 عصر
در ضمن روی این متد ارر میده
فرم همچین متدی نداره


this.Draw(BufferedGraphics.Graphics);
و یه چیز دیگه من بصورت دستی روی فرم تصویر رو آپدیت میکنم و نیازی به رخداد onpaint ندارم!