Win32: كيفية جعل إسقاط الظل الشرف نافذة الطبقات غير المستطيلة؟

StackOverflow https://stackoverflow.com/questions/2224220

سؤال

لقد أنشأت أ نافذة الطبقات عن طريق إضافة ال WS_EX_LAYERED. نمط ممتد:

wndClass.ExStyle = wndClass.ExStyle | WS_EX_LAYERED;

سيستخدم Windows أسود كقيمة لون مفتاح Chroma. سأترك حد كبير من الأسود لجعل المشكلة واضحة:

alt text


بعد إنشاء النافذة، أخبرها استخدام الأسود كمفتاح كروما:

SetLayeredWindowAttributes(hwnd, 0x00000000, 255, LWA_COLORKEY);

الآن تظهر نافذة الطبقات المنبثقة شفافة جزئيا:

alt text


المشكلة هي الخطوة الأخيرة. أريد أن استخدام cs_dropshadow. نمط الطبقة المتاحة منذ نظام التشغيل Windows XP، لإنشاء ظل قطرة:

wndClass.Style = wndClass.Style | CS_DROPSHADOW;

يظهر Shadow Drop، لكن الظل يحيط بالنافذة المستطيلة الأصلية، ولا يأخذ في الاعتبار شفافية النافذة التي توفرها النافذة الطبقات:

هل يعرف أحد الخيار السحري الذي فاتته في مكان ما الذي سيجعل ظلال الإسقاط يكرم النافذة ذات الطبقات غير المستطيلة؟


مثال آخر على حيث تظهر هذه المشكلة هي عندما لا تشمل الحشو / الهامش 6PX. نافذة تلميح كما تم رسمها بواسطة مواضيع Windows® غير مستطيلة. هذا يترك فجوة صغيرة واضحة حيث تكون النافذة شفافة، لكن الظل الإسقاط لا يظهر:

alt text

تمكنت Microsoft من اجعلها تعمل، كما ترون من هذا التلميح من Internet Explorer:

alt text


أبحث أقرب في النوافذ tooltips نافذة تلميح الفئة. استخدام spyxx. - يمكنني الحصول على نافذة مستقرة، وأنماط الطبقة:

يقول Spyxx:

Rectangle:     (440, 229)-(544, 249), 104x20
Restored Rect: (440, 229)-(544, 249), 104x20
Client Rect:   (0, 0)-(104, 20), 104x20

لذلك كل شيء يشير إلى النافذة نفسها كونها 104 × 20 بكسل، مع انخفاض الظل خارج النافذة نفسها. (وهو ما يتفق مع CS_DROPSHADOW.)

التالي أستطيع أن ننظر إلى أنماط tooltips نافذة الطبقة:

Windows Styles:     94000001

    WS_POPUP        80000000
    WS_VISIBLE      10000000
    WS_CLIPSIBLINGS  4000000
    TTS_ALWAYSTIP          1

Extended Styles:    00080088

    WS_EX_LAYERED      80000
    WS_EX_TOOLWIN         80
    WS_EX_TOPMOST          8

ومن المثير للاهتمام، لا يستخدم CS_SAVEBITS (0x800) وهو مفيد للنوافذ الصغيرة، قصيرة الأجل،

ولا تستخدم CS_DROPSHADOW (0x20000). حتى الآن أتساءل كيف يتم الرسم خارج نافذتها الخاصة؟

ملحوظة: يتم توثيق Windows الطبقات الشفافة كتقنية مفضلة على المناطق.

يحرر: كانت النوافذ الطبقات موجودة مع Windows 2000. تمت إضافة cs_dropshadow مع XP.

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

المحلول

يتم توثيق Windows الطبقات الشفافة كتقنية مفضلة على المناطق.

ومع ذلك، CS_DROPSHADOW هل انتبه إلى المناطق. إذا قمت بتقطعها أو تشكيل نافذتك بطريقة أخرى باستخدام منطقة، فسوف تتبع الخراب القصير المخطط الجديد.

لحسن الحظ، أنت يمكن استخدم المناطق مع نوافذ الطبقات، ومن خلال الجمع بين الاثنين الحصول على التأثير الذي تبحث عنه.

راجع للشغل: Tooltips_Class32. هل استخدم cs_dropshadow - لن ترى ذلك في أنماط النافذة لأنها نمط فئة، وليس نمط النافذة.

نصائح أخرى

لماذا لا تستخدم LWA_ALPHA وبناء الظل في الصورة؟

تحرير في الرد على تعليقك:

أ) لا يمنعك باستخدام PNG ALPHA الموجهة إلى الظل فقط. BLT الصور 2 معا واستخدامها كصورة واحدة واحدة.
ب) ليس من الصعب توليد الظل قطرة. في الصورة، قمت بنشرها أسود مع 3 قيم ألفا مختلفة.
ج) لكنه لا يعمل كذلك؟ أي الوقت للحصول على الإبداع.
د) ثم لا تحاول واحصل على Windows للقيام بشيء لن يفعله لك.
ه) غير ذي صلة تماما. مقبض نوافذ الطبقات لك.

أوصي بشدة تتعلم المزيد عن نوافذ الطبقات لأنها يمكن أن تساعدك على هدفك.

Edit2: لديك الصورة النقطية. من السهل إلى حد ما المسح الضوئي على الصورة والعثور على البتات التي ستكون معفدة اللون (عن طريق تحديد الأسود بنفسك) والدوخة تعديل ذلك للحصول على ألفا من 0 حيث سيحتوي كل شيء آخر على ألفا من 255 (لا: قد تضطر إلى تحويل الصورة إلى صورة 32 بت من تنسيق ألوان أقل، يمكنك القيام بذلك عن طريق إنشاء DC جديد ونسخ الصورة). هذا سيعطيك نفس التأثير مع LWA_ALPHA كما هو الحال مع LWA_Colorkey. من هناك من السهل إلى حد ما تحديد البكسل على الحافة، حيث يتغير اللون إلى (R = 0، G = 0، B = 0، A = 0). ثم قمت بتغيير هذا البكسل الأول للحصول على ألفا لعام 192، والمرء أن يفجره إلى 128 وواحد أدناه إلى 64. لديك الآن تدرج Alpha'd أسفل الصورة التي ستبدو مثل الظل. يمكنك ضبط ألفا للحصول على التأثير الذي تريده.

CS_DROPSHADOW يعمل فقط مع النوافذ المستطيلة القياسية. WS_EX_LAYERED ويندوز لا يدعم كل شيء. إنها أكثر من طريقة منخفضة المستوى والخدمة الذاتية لرسم ما تريد بالضبط.

للحصول على Shadow Drop، عليك أن تولد Drop-Shadow بنفسك من قناة ألفا في الصورة.

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