PDA

View Full Version : بدون عنوان!



BehnamPro
سه شنبه 07 بهمن 1382, 12:04 عصر
سلام.قبل از هر چیز از اینکه این سوال یه کم :oops: طولانیه عذر می خواهم.چون فکر می کنم نیاز به تشریح کامل مسئله است.
من یه فرم دارم که در آن یک PictureBox قرار دارد.برنامه در این PictureBox یک سری ترسیماتی انجام می دهد اما با Resize کردن فرم متعاقبا PictureBox هم Resize شده و تمام ترسیمات پاک می شود :( .و من مجبورم این ترسیمات را دوباره انجام دهم.و کد اجرای این ترسیمات را در Form_Resize گذاشته ام.اما این باعث کندی برنامه می ود چراکه Form_Resize چندین بار در حین Resize کردن اجرا می شود و در نتیجه این ترسیمات هم در حین Resize کردن چندین بار اجرا می شود و با توجه به اینکه این ترسیمات اندکی زمان بر است باعث کندی برنامه می شود.آیا شما راه حل بهتری پینهاد می کنید؟ :roll:
مثلا آیا می توان عمل رسم دوباره را در انتهای Resize کردن فرم انجام داد؟پس چگونه از اتمام عمل Resize آگاه شویم؟

Best Programmer
سه شنبه 07 بهمن 1382, 12:35 عصر
شاید یه کم پیشنهاد من مشکل به نظر بیاد ولی از لحاظ سرعت بالا ترین سرعت را دارد.
ابتدا به کمک تابع CreateCompatibleDC یک حافظه DC بساز.
سپس hdCان PictureBox را بدست بیاور و به کمک تابع SelectObject محتویات ان hdc را به درون حافظه مجازی DC ساخته شده در بالا انتقال بده. سپس به کمک تابع StretchBlt محتویات در DC مجازی را به درون مقیاس جدید PictureBox انتقال بده. البته با اضافه کردن یک تایمر پس از دریافت پیام میتوانی از اتمام عملیات تغییر مطمپن بشوی و تصویر درون PictureBox را که کمی صحیح نخواهد بود (چون تابع StrecthBlt تصویر را Strecth میکند) Redraw کن.

-----------------
موفق باشی.

S.Azish
سه شنبه 07 بهمن 1382, 13:01 عصر
خصوصیت Autoredraw رو در PictureBox برابر True کنید.

BehnamPro
سه شنبه 07 بهمن 1382, 14:34 عصر
جناب BestProgrammer و آقای Azish از توجهتون ممنون.
روش استفاده از حافظه مجازی رو حتما امتحان می کنم(اگر موفق بشم.چون به نظر یه خورده مشکل میاد) :roll:
اما آقای Azish من AutoRedraw رو هم True کرده ام ولی مشکل اینجاست که عمل رسم یه مقدار طولانیه و با توجه به اینکه در Resize کردن رسم دوباره ی این ترسیمات چندین بار انجام می شود لذا وقت گیر است.اگه بشه همه ی ترسیمات رو به یکباره بعد از تکمیل Resizing انجام داد وقت کمتری می گیره.

S.Azish
سه شنبه 07 بهمن 1382, 15:39 عصر
چرا ترسیمات توی Resize هستن, آیا بستگی به اندازه Picturebox دارن یا ثابت هستن. اگر ثابت هستن اینکارو توی Form_Load انجام بدین.