السلام عليكم...
وضعت هذا الموضوع بناءً على رغبة بعض الإخوة في المنتدى.
المنهج PaintPicture يستخدم لرسم صورة على Form أو PictureBox أو الطابعة (Printer). و صيغته كالتالي:
- dest_object.PaintPicture src_picture, dest_x, dest_y, dest_wd, dest_ht, src_x, src_y, src_wd, src_ht, opcode
حيث:
dest_object: الكائن الذي نريد رسم الصورة عليه. يمكن أن يكون Form أو PictureBox أو Printer.
src_picture: الصورة المصدر. يجب أن تكون الخاصية Picture لـ Form أو PictureBox.
dest_x, dest_y: إحداثيات الزاوية العلوية اليسرى للمكان الذي نريد أن تظهر فيه الصورة على الكائن الهدف. الوحدات المستخدمة (Twips, Pixels... إلخ) تعتمد على الخاصية ScaleMode للكائن الهدف.
dest_wd, dest_ht: (اختياريان) عرض و ارتفاع الصورة كما نريدها على الكائن الهدف. أيضاً الوحدات تعتمد على الخاصية ScaleMode للكائن الهدف. إذا أهمل أي منهما يتم استعمال قيم المصدر (src_wd أو src_ht).
src_x, src_y: (اختياريان) إحداثيات الزاوية العلوية اليسرى للجزء الذي نريد نسخه من الصورة المصدر. الوحدات تعتمد على الخاصية ScaleMode للكائن المصدر. إذا أهمل أي منهما يتم اعتبار أن قيمته = 0.
src_wd, src_ht: (اختياريان) عرض و ارتفاع الجزء الذي نريد نسخه من الصورة المصدر. الوحدات تعتمد على الخاصية ScaleMode للكائن المصدر. إذا أهما أي منهما يتم استعمال كامل عرض أو كامل ارتفاع الكائن المصدر.
opcode: (اختياري) قيمة عددية صحيحة تستعمل فقط مع الصور من النوع Bitmap لتحديد كيفية رسم الصورة الهدف (تداخل ألوان الصورة المصدر مع الكائن الهدف). لرسم الصورة بشكل طبيعي اتركه فارغاً أو استعمل القيمة الافتراضية vbSrcCopy (لمعرفة القيم التي يمكن استعمالها اكتب RasterOpConstants ثم نقطة).
مهم: اترك البارامتر opcode فارغاً إذا كنت تتعامل مع صور غير الـ Bitmap (امتدادها bmp) مثلاً ico أو wmf لأن ذلك سيتسبب في حدوث خطأ (بسبب تميم المنهج PaintPicture نفسه).
من فوائد المنهج PainPicture:
1. انكماش أو توسع الصورة الهدف إذا اختلف عرضها (dest_wd) أو ارتفاعها (dest_ht) (أو كلاهما) عن العرض أو الارتفاع المصدر (src_wd أو src_ht).
2. يمكن قلب الصورة أفقياً أو عمودياً (أو معاً) إذا كانت قيم dest_wd أو dest_ht سالبة.
3. يمكننا تحديد الجزء الذي نريد نسخه من الصورة المصدر (باستعمال src_x, src_y, src_wd, src_ht).
4. يمكننا تحديد مكان و حجم الصورة الهدف (باستعمال dest_x, dest_y, dest_wd, dest_ht).
============================================
بالنسبة إلى الخاصية AutoRedraw (للـ Form و الـ PictureBox):
أريد أن أبين هنا نقطة توضيحية، و هي أن كل النوافذ و المكونات التي نراها على الشاشة (في برنامجنا و غيره) تستقبل باستمرار آلاف الرسائل من النظام Windows. من بين هذه الرسائل رسالة تطلب من النافذة أو المكون أن يعيد رسم و تلوين نفسه (Repaint أو Refresh) كلما تطلب الأمر ذلك (مثلاً عند تغيير حجم النافذة أو ظهور جزء منها كان مخفياً وراء نافذة أخرى). هذه الرسالة تعرف في ويندوز باسم WM_PAINT.
الخاصية AutoRedraw، و هي من النوع Boolean أي يمكن أن تكون True أو False، لها علاقة مباشرة بهذا الأمر، و هي خاصية أساسية عند العمل بالمناهج الرسومية (Graphics Methods) و التي تشمل: Circle و Cls و Line و Point و Print و PSet:
** إذا كانت الخاصية AutoRedraw مضبوطة على True: فإن ما نرسمه على الـ Form أو الـ PictureBox يظهر على الشاشة بالإضافة إلى رسمه على صورة محفوظة في الذاكرة (Memory Image) و هي صورة نقطية Bitmap. في هذه الحالة لا يتم تنفيذ الإجراء Paint (إذا كان موجوداً) و يتم إعادة تلوين (Repaint) الكائن باستعمال الصورة المحفوظة في الذاكرة (يعني أنه يتم تحديث تلقائي للكائن).
** إذا كانت الخاصية AutoRedraw مضبوطة على False: فإن ما نرسمه على الـ Form أو الـ PictureBox يظهر فقط على الشاشة (تعطيل التحديث التلقائي)، و يتم تنفيذ الإجراء Paint عند الضرورة.
الصورة المحفوظة في الذاكرة يمكن الوصول إليها وقت التنفيذ عن طريق الخاصية Image للـ Form أو الـ PictureBox.
لإجراء اختبار بسيط يبين الفرق بين أن تكون AutoRedraw مضبوطة على True أو على False، ضع زر أمر على النموذج و اكتب به الكود التالي مثلاً:
- Print "This is Test Text: AutoRedraw = " & IIF(AutoRedraw, "True", "False")
اترك الخاصية AutoRedraw للنموذج على False و شغل البرنامج. انقر الزر لطباعة النص ثم قم بتصغير النافذة أو إخفائها بنافذة أخرى ثم أظهرها مرة أخرى. سيختفي النص المطبوع لأنه تمت طباعته على الشاشة فقط و لم يحفظ في صورة الذاكرة.
عد إلى التصميم و اضبط الخاصية AutoRedraw للنموذج على True ثم جرب مرة أخرى. سيبقى النص المطبوع لأنه عند إعادة عرض النافذة (بعد تصغيرها أو إخفائها وراء نافذة أخرى) يتم استعمال صورة الذاكرة لاسترجاع صورة النافذة كما كانت.
نرجو الاستفادة و السلام.