PDA

View Full Version : گرفتن e.Graphics



ماهان مقدم
دوشنبه 28 شهریور 1390, 01:44 صبح
سلام. آقا من چون e.Graphics تو رویداد Paint قابلیت Double Buffer رو داره رو می خوام بگیرمش و بجای CreateGraphic ازش استفاده کنم. مشکل اینه که من نمی دونم چطوری بگیرمش چون functionی که برای طرسیم نوشتم باید از جاهای دیگه از خارج از رویداد Paint هم فرخوانی بشن. من الآن اون رو میریزم توی متغیر ولی موق اجراء بهم ارور میده که اصلا معلوم نیست یعنی چی. اولین کد من با این متغیر اینه:

mWorkspaceGraphic.Clear(frmmain.Workspace.BackColo r)

و ارور Parameter is not valid رو میده.

omid-vbAuto
دوشنبه 28 شهریور 1390, 19:59 عصر
سلام. آقا من چون e.Graphics تو رویداد Paint قابلیت Double Buffer رو داره رو می خوام بگیرمش و بجای CreateGraphic ازش استفاده کنم. مشکل اینه که من نمی دونم چطوری بگیرمش چون functionی که برای طرسیم نوشتم باید از جاهای دیگه از خارج از رویداد Paint هم فرخوانی بشن. من الآن اون رو میریزم توی متغیر ولی موق اجراء بهم ارور میده که اصلا معلوم نیست یعنی چی. اولین کد من با این متغیر اینه:

mWorkspaceGraphic.Clear(frmmain.Workspace.BackColo r)

و ارور Parameter is not valid رو میده.

اگر درست فهمیده باشم شما کدهاتون تو رویداد paint یه ابزار گذاشتی در حالی که می خواهی مثلا با زدن باتون ترسیم انجام بشه؟؟؟

mehdi.mousavi
سه شنبه 29 شهریور 1390, 14:04 عصر
سلام. functionی که برای طرسیم نوشتم باید از جاهای دیگه از خارج از رویداد Paint هم فرخوانی بشن.

سلام.
شما قاعدتا نباید این کارو کنید. عمل Paint فرم (یا بطور کلی، کنترل ها) در WM_PAINT انجام میشه و این بدین معناست که شما اونجا این فرصت رو دارید تا کنترل های مورد نظر رو بر اساس State فعلی Object، رسم کنید. اگر مایلید تا WM_PAINT مجددا در Message Queue قرار بگیره، کافیه تا تابع Invalidate رو صدا بزنید. بدین ترتیب متود Paint مجددا فراخوانی خواهد شد. به بیان دیگه، فرض کنید در تابع دیگری State فعلی تغییر میکنه و این تغییر وضعیت باید روی صفحه به نمایس در بیاد. اینجا، جای اینکه مجددا تابع ترسیم رو Call کنید، میتونید Invalidate رو فراخونی کنید تا تابع Paint بطور خودکار Call بشه. حالا در تابع Paint می تونید بر اساس وضعیت فعلی Object صفحه رو به روز کنید. اما تکنیک دیگه ای هم وجود داره و اون این که شما دو بافر جداگانه داشته باشید. یکی بافری هستش که همواره نمایش داده خواهد شد و دیگری، بافری است که بر اساس تغییر وضعیت Object، ترسیم میشه (اما روی صفحه ظاهر نمیشه). وقتی عمل ترسیم انجام شد و Bitmap جدید آماده بود، اونوقت میشه Invalidate کرد تا تابع Paint فراخوانی بشه. تابع Paint هم بافر دوم رو جایگزین بافر اول میکنه و بدین ترتیب وضعیت جدید Object مشاهده خواهد شد.

موفق باشید.