PDA

نسخه کامل مشاهده نسخه کامل : گرافیک در Vb .net



maxeemo
02-08-2007, 03:45
دوستان سلام،
یه سوال در مورد VB .NET داشتم، سرچ کردم، چیزی پیدا نشد.
سوال من اینه که چطور میشه یک Shape (به عنوان مثال یک دایره یا مستطیل) رو روی یک PictureBox (که یک تصویر هم درونش بارگذاری شده) قرار داد به صورتی که Opacity کمتر از 1 داشته باشه. مشکل من Shape نیست، تغییر Opacity اون هستش. برای توجیه بهتر تصویر زیر رو که با Photoshop تهیه کردم در زیر قرار دادم. البته باید بگم که منظورم از Shape یک Object نیست. منظورم توابعی هست که در خصوصیت Graphics قرار دارن مثل DrawRectangle. در ضمن لطف کنید توضیح بدید که متد Paint دقیقا چه موقعی فراخوانی میشه؟ در Help اومده که:


Occurs when the control is redrawn

یعنی هنگامی اتفاق می افتد که رسم در کنترل مورد نظر صورت می گیرد. کلمه ی Redrawn دقیقا به چه وضعیتی اشاره می کنه که باعث فراخوانی متد Paint میشه؟


[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

_H2_
02-08-2007, 16:01
سلام
در مورد رنگ کافیست پارامتر آلفا را به دلخواه تغییر دهید.
مثلاً
این میشود قرمز خالص

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
که اگر با این اقدام به ترسیم کنید نتیجه قرمز خالص است
ولی این میشود قرمز با شفافیت 50%

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
یعنی همان که شما میخواهید
البته پارامتر آلفا را به روش های دیگر هم میتوان تغییر داد
ضمناً خوشحالم میبینم بروبچ دنبال این امکانات جالب VB8 هم هستند



متد paint هم زمانی فراخانی میشود که کنترل یا فرم شما نیاز به ترسیم داشته باشد،
مثلاً اول برنامه یا وقتی یک پنجره ای روی برنامه شما را گرفته و کاربر آن پنجره را که روی پنجره شما بوده میگیرد و حرکت میدهد و در نتیجه پنجره شما که تاحالا زیر بوده و نمایشی نداشته حالا باید بر روی مانیتور رسم شود و...

موفق و شاد باشید.!

maxeemo
02-08-2007, 17:31
ممنون _H2_ عزیز، کارم راه افتاد. این هم یک نتیجه از کاری که می خواستم انجام بدم:


[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

کد مثال بالا:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

فقط هنوز یک مسئله مونده. همونطور که حتما خودت می دونی در VB6 فرم دارای یک ویژگی به اسم AutoRedraw بود (که PictureBox هم همین ویژگی رو داشت)، با True کردن این ویژگی، شئ ما اگر پشت چیزی می رفت، تصویر موجود در اون ناحیه حذف نمی شد.
اگر دستورات رسم رو در متد Paint قرار بدیم، طبق توضیحاتی که شما دادین و خودم هم بررسی کردم، این اتفاق در VB .NET هم می افته، اما در هر فراخوانی متد Paint تمام دستورات رسم اجرای مجدد می شن و این یعنی سنگینی برنامه که بوضوح قابل لمسه، استفاده از ClipRectangle هم مشکلات خاص خودش رو داره. برای این مشکل چه راه حلی پیشنهاد می کنید؟

راستی خودمونیم، VB .NET از نظر گرافیکی خیلی کارش درسته، VB6 زیاد تو مود گرافیک نبود (که البته اون زمان طبیعی به نظر می رسید) اما حالا با بالارفتن انتظار کاربران از واسط های گرافیکی کاربری (GUI) برنامه ها، VB .NET رو گرافیک هم عالی کار کرده...

_H2_
04-08-2007, 15:12
سلام
من یک زمانی با دستورات گرافیکی ++VC هم کار کردم ولی دستورات گرافیکی +GDI داخلی دات نت چیز دیگری است و هر امکانی را به راحتی میدهد، فقط کافیست بشناسیدش. (مثلاً ساخت bmp در runtime و داخل RAM و ترسیم بر روی ان ، چرخش و...)

در مورد paint هم بله کاملاً درست است که هر بار Paint اجرا میشود و ما هم کاملاً خوشحالیم که چنین است!
برای یک سری از کارهای خاص این خیلی لازم است.
میدونید مثل نمک غذا می ماند!!!! از قدیم گفته اند غذایی که کم نمک است علاج دارد (با یک نمکدان ناقابل!) ولی غذای شور و پر نمک از دست رفته و علاج ندارد!
حالا من میگویم! نقل و انتقالات بدون بافرینگ علاج دارد (با یک بافر ناقابل!) ولی انتقالات بافر دار اگر به بدون بافرش نیاز پیدا کنیم، علاج ندارد و سرعت و کارایی برنامه را از دست میدهیم!

در نتیجه مشکل شما با یک بافر ناقابل حل میشود، را ه های زیادی دارد ولی من این را پیشنهاد میکنم!
-----------------------------------------------------------------------------------------------------------
من خودم تا حالا در چندین کنترل از این شیوه استفاده کرده ام، آخرین موردش در طراحی یک نمونه ساعت عقربه ای بود که توانستم بدون هیچ پریود و چشمک زدنی انجامش دهم، اگر مایل بودید میتوانم نمونه برنامه exe اش را بدهم.

یک متغییر در کلاسس کنترلر یا فرمتان از نوع Image تعریف کنید مثلاً Private paintbuffer As System.Drawing.Bitmap

در زیر برنامه Paint چک کنید و ببینید که paintbuffer خالی است یا نه؟
اگر خالی بود یک IF بزرگ را شروع کنید!
یک Bitmap جدید به اندازه مورد نیاز بسازید و در paintbuffer بریزید.
از bitmap موجود در paintbuffer یک شی Graphic بسازید و ترسیمات را شروع کنید (در صورت زیاد بودن کد میتوانید این بخش را به یک Sub دیگر بشکنید)
End If!

حالا paintbuffer را که یک عکس است برروی شی Graphic اصلی که به شما پاس داده شده ترسیم بکنید!
تمام!

یعنی تا وقتی paintbuffer IsNot Nothing هیچ کدی جز کد ترسیم از خود paintbuffer اجرا نمیشود
ولی هرگاه paintbuffer Is Nothing ترسیم خواهیم داشت، به این ترتیب زمانی که در کد واقعاً نیاز به تغییر ترسیم دارید کافی است بنویسید:
Me.paintBuffer = Nothing تا در ترسیم بعدی یک Refresh داشته باشیم.

مطمئنم میتوانید پیاده سازیش بکنید چون نشان دادی که با دستورات گرافیکی +GDI قدرتمند داخلی دات نت آشنایی دارید و مطلب فوق هم ساده است و ابهامی ندارد.
هم راحت است و هم در تعداد کدهای خیلی کمی انجام میشود و اگر درست نوشته شود بسیار سریع خواهد بود.

موفق و پیروز باشید.