سؤال

أولاً، لا يتعلق الأمر بجعل عنصر تحكم PictureBox شفافًا.يتعلق الأمر بشفافية الصورة النقطية على "اللوحة القماشية" غير الشفافة تمامًا.

سيكون حجم PictureBox دائمًا 300*300 بخلفية بيضاء.ليست هناك حاجة للشفافية للسيطرة.

ما أحتاجه هو طريقة رسم المستطيل الشفاف (أو أي شيء آخر) على صندوق الصورة، بحيث يمكن رؤية أي شيء موجود بالفعل "من خلال" المستطيل.

لنفترض أن لدي الكود التالي

Bitmap bmp = new Bitmap(300, 300);
Graphics g = Graphics.FromImage(bmp);
g.FillRectangle(new SolidBrush(Color.White), 0, 0, 300, 300);
g.FillRectangle(new SolidBrush(Color.Red), 100, 100, 100, 100);
pictureBox.Image = bmp;

سيؤدي هذا إلى رسم مستطيل أحمر في منتصف اللوحة البيضاء.الآن، أحتاج إلى "طبقة" أخرى (شفافة) في الصورة تحتوي على مستطيل آخر، ولكنه شفاف.

أستطيع أن أحاول

Brush brush = new SolidBrush(Color.FromArgb(128, 0, 80, 0));
g.FillRectangle(brush, 50, 50, 200, 200);

وبما أنني أستخدم لونًا بتحديد ألفا = 128، فيجب أن يكون المستطيل الناتج شفافًا بحيث يمكن رؤية المستطيل الأحمر الأول من خلال المستطيل الأخضر الآخر.

ومع ذلك، هذا لا يحدث بشكل صحيح.أستطيع رؤية المستطيل الأحمر خلف المستطيل الأخضر الجديد، لكن جزء المستطيل الأخضر الذي لا يتداخل مع المستطيل الأحمر سيظل معتمًا تمامًا.ومع ذلك، إذا قمت بتعيين قيمة ألفا للون إلى قيمة صغيرة للغاية (على سبيل المثال 1-5)، فسيبدو المستطيل بأكمله شفافًا.وهذا ليس طبيعيا في رأيي - أن 5/255 نصف شفاف فقط وأن 128/255 ليس شفافا على الإطلاق...وإذا كانت هناك سلسلة تم رسمها مسبقًا باستخدام g.DrawString()، فسيتم إما عرض السلسلة خلف المستطيل الأخضر أو ​​لا يتم عرضها، اعتمادًا على مستوى الشفافية.على سبيل المثال، إذا كانت قيمة Alpha أكبر من أو تساوي (حوالي) 40، فلن تكون السلسلة مرئية على الإطلاق، وإذا كانت أقل من 40، فسوف تظهر بشكل أكثر وضوحًا لقيم ألفا الأصغر، وصولاً إلى alpha = 0.

كيف يتم تطبيق هذه الفرشاة (عند إنشائها من لون Argb)؟هل فاتني شيء؟يبدو لي أن تعيين فرشاة شفافة يجعل الخلفية "أكثر وضوحًا" بدلاً من تعيين الكائن "أقل وضوحًا".

شكرا على أي ردود مع الاقتراحات.

[يحرر] يبدو أنه كان لدي خطأ فادح في منطق التطبيق، لذلك حدث روتين الرسم في حلقة، لذلك عندما جمعت عددًا معينًا من المستطيلات الشفافة، أصبحت أكثر سمكًا.

الكود، عند إخراجه من الحلقة، يعمل بشكل صحيح.

خطأي.

هل كانت مفيدة؟

المحلول

نص بديل http://lh4.ggpht.com/_1TPOP7DzY1E/S02ivAoGgTI/AAAAAAAAC6s/ZQvZQ5GdwSU/s800/Capture4.png

يتم عن طريق هذا الكود :

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        Bitmap bmp = new Bitmap(300, 300);
        Graphics g = Graphics.FromImage(bmp);
        g.FillRectangle(new SolidBrush(Color.White), 0, 0, 300, 300);
        g.FillEllipse(new SolidBrush(Color.Blue), 25, 25, 100, 200);
        g.FillRectangle(new SolidBrush(Color.Red), 100, 100, 300, 100);
        g.DrawString("this is a STRING", SystemFonts.DefaultFont, 
            Brushes.Black, new Point(150, 150));
        pictureBox1.Image = bmp;

        Brush brush = new SolidBrush(Color.FromArgb(40, 0, 80, 0));
        g.DrawRectangle(Pens.Black, 50, 50, 200, 200);
        g.FillRectangle(brush, 50, 50, 200, 200);
    }

الجزء الأخضر ليس معتمًا كما ترون...السلسلة مرئية تمامًا.

يبدو لي أن تعيين فرشاة شفافة يجعل الخلفية "أكثر وضوحًا" بدلاً من تعيين الكائن "أقل وضوحًا".

الخلفية "أكثر وضوحًا" والكائن "الأقل وضوحًا" هما نفس الشيء ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top