باستخدام نوافذ الطبقات لإنشاء حدود نافذة ناعمة

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

  •  09-09-2019
  •  | 
  •  

سؤال

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

لقد جاءت مع حل لهذا استخدام Windows الطبقات، لكننا نريد التأكد من أن هذا سيتم تشغيله (ونأمل أن يعمل بشكل جيد) على مجموعة متنوعة من الأنظمة، وأريد أن أرى ما إذا كان أي شخص لديه أي أفكار أفضل، أو طرق تحسين ما أفعله. أعلم أن ويندوز الطبقات تتطلب WIN2000 أو الأحدث، وهذا جيد، كما هو الحال بالفعل متطلبات لأسباب أخرى. من بعض الاختبارات الأساسية يبدو موافقا على نظام التشغيل Vista، ولكن هذا ليس ضمانا بعد.

إليك ما أقوم به: لدي نافذة، اتصل بها، مع الضوابط والنص، وأي شيء يتألف من هذه النافذة. لدي Window B كطفل من النافذة A، إلا أنه يحتوي على أسلوب WS_POPUP بدلا من WS_CHILD، لذلك يمكنه وضع نفسه خارج منطقة A ويتم رسمها على رأس الضوابط. يحتوي Window B أيضا على نمط WS_EX_LAYERED، وعلى التهيئة، أدعو UpdateLayerEdWindow. مع العلم ULW_ALPHA ومصدر DC مع صورة نقطية 32 بت مع قناة ألفا، للحصول عليه للرسم مع Per-pixel Alpha.

تكون الصورة النقطية المستخدمة في المصدر DC للإطار B أكثر بكثير من حد كبير حول حدود النافذة التي أرغب في مزجها بسلاسة من خلفية النافذة إلى شفافية كاملة. وأود أن تخطي نهج النافذة بأكمله واستخدام نافذة طبقية واحدة، باستثناء ذلك عند استخدام UpdateLayerEdWindow، يتم رسمها من المخزن المؤقت الذي يتم الاحتفاظ به في الذاكرة، بدلا من رسائل WM_PAINT النموذجية وكل ذلك، ومحاولة الحصول عليها ضوابط الأطفال التفاعلية (ونوافذ الأطفال) للعمل بشكل جيد مع تلك الأصوات مثل المتاعب الرائعة (وربما لن تعمل حتى بالنسبة لكل شيء).

لذلك، إنه في الأساس نافذة أما مع جميع عناصر التحكم في الأطفال وأي شيء، مع نافذة B تعويم مباشرة فوقها، رسم حدود ناعمة لطيفة. أرد على رسائل WM_MOVE وهكذا من خلال تحريك النافذة B جنبا إلى جنب معها، ولدي نافذة B تعطيل لذلك لا يمكن أن تحصل على التركيز أو الإدخال (النقرات التي تمر بالفعل، لأن أجزاء منه من عتامة صفرية، مثل الأغلبية من أجزاء الداخلية، يتم استبعادها بالفعل من اختيار).

للركلات، إليك ما تبدو القطع، لإظهار ما أعنيه أفضل قليلا.

لذلك، يعمل، لكنني لا أستطيع أن أكون متأكدا من أنها أفضل طريقة للقيام بذلك. لدي سؤالان:

  • هل هذا الصوت مقبول، أم أن هناك أي شيء فظيع للغاية حول هذا الموضوع؟
  • كما يعمل حاليا، يبدو أنه يستخدم مخزن مؤقت خارج الشاشة حجم النافذة (والذي يمكن أن يصل إلى 1024 × 768) على الرغم من أن عدد قليل جدا من البكسلات لها أي بيانات عتيقة غير صفرية - هل ستكون تستحق النفقات العامة والتعقيد الإضافي لقطعه إلى قطع حدودية منفصلة وتركيبها معا؟
هل كانت مفيدة؟

المحلول

يستخدم منتجي نوافذ الطبقات لرسم علامات التبويب الصغيرة التي أرفقها لكل نافذة. اعتدت أن نوافذ الطبقات للحصول على التقريب السلس دون التعرج. المشكلة السيئة الوحيدة التي قمت بتشغيلها حتى الآن هي أن بعض خربات النوافذ OpenGL على رأس النوافذ الطبقات على نظام التشغيل Windows XP و Vista بدون DWM. إنها مشكلة منخفضة المستوى ولم تكن شركة Microsoft مفيدة للغاية. يمكنك إعادة إنتاجه عن طريق فتح Google Earth وسحب طلبك عبر نافذة التقديم الرئيسية، ستتختفي نافذة الطبقات الخاصة بك.

نصائح أخرى

لقد اكتشفت شيئا واحدا ما يلي: إن وجود قطع منفصلة للإطار يمكن أن يجعل أسرع بكثير من وجود نافذة إطار عملاقة واحدة، مع مساحة كبيرة من البكسلات الفارغة في المنتصف. ليس لدي أي أرقام فعلية، ولكن فقط من اختبار سريع للمحاولة كلاهما، كان هناك كمون ملحوظ عندما يتداخل عدة نوافذ مع إطارات كاملة، ولكن عندما تم قطع إطاراتهم إلى مكونات أصغر، كان الكثير من القصاص وبعد بغض النظر عن وجود نوافذ متعددة الطبقات مع سياقات الأجهزة الخاصة بها لا تسهم كثيرا، فإن وجود مساحات كبيرة من البكسل (فارغة أم لا!) لا تزال تسيطر على الكثير من الحمل.

  1. لا تنس الاختبار تحت RDP و VM (Hyper-V & VMware)
  2. جرب العديد من بطاقات GFX وعلى NetBooks وأجهزة الكمبيوتر المحمولة (إن وجدت).
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top