تبلیغات :
ماهان سرور
آکوستیک ، فوم شانه تخم مرغی ، پنل صداگیر ، یونولیت
دستگاه جوجه کشی حرفه ای
فروش آنلاین لباس کودک
خرید فالوور ایرانی
خرید فالوور اینستاگرام
خرید ممبر تلگرام

[ + افزودن آگهی متنی جدید ]




نمايش نتايج 1 به 4 از 4

نام تاپيک: گرافیک در Vb .net

  1. #1
    حـــــرفـه ای
    تاريخ عضويت
    Jan 2007
    پست ها
    3,350

    پيش فرض گرافیک در Vb .net

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

    Occurs when the control is redrawn

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


  2. #2
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

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



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

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

  3. #3
    حـــــرفـه ای
    تاريخ عضويت
    Jan 2007
    پست ها
    3,350

    پيش فرض

    ممنون _H2_ عزیز، کارم راه افتاد. این هم یک نتیجه از کاری که می خواستم انجام بدم:


    کد مثال بالا:

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

    راستی خودمونیم، VB .NET از نظر گرافیکی خیلی کارش درسته، VB6 زیاد تو مود گرافیک نبود (که البته اون زمان طبیعی به نظر می رسید) اما حالا با بالارفتن انتظار کاربران از واسط های گرافیکی کاربری (GUI) برنامه ها، VB .NET رو گرافیک هم عالی کار کرده...
    Last edited by maxeemo; 02-08-2007 at 18:43.

  4. #4
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

    سلام
    من یک زمانی با دستورات گرافیکی ++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 قدرتمند داخلی دات نت آشنایی دارید و مطلب فوق هم ساده است و ابهامی ندارد.
    هم راحت است و هم در تعداد کدهای خیلی کمی انجام میشود و اگر درست نوشته شود بسیار سریع خواهد بود.

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

Thread Information

Users Browsing this Thread

هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)

User Tag List

قوانين ايجاد تاپيک در انجمن

  • شما نمی توانید تاپیک ایحاد کنید
  • شما نمی توانید پاسخی ارسال کنید
  • شما نمی توانید فایل پیوست کنید
  • شما نمی توانید پاسخ خود را ویرایش کنید
  •