تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
تطبيق تأثير الزجاج على الفيستا
#1
كاتب الموضوع : DreamNet


السلام عليكم ورحمة الله وبركاته

مقدمة:



كما تعلمون أن ويندوز فيستا جاء ببعض التأثيرات في المظهر منها الAero المعروف خصيصا بالفيستا وويندوز 7 ايضا الذي يجعل شريط وحواف النافذة شفاف
طبعا كل التطبيقات تأخذ هذا التأثير بدون أي تغيير لكن لا بد انكم لاحظتم ان بعض تطبيقات ويندوز تجدها كلها شفافة كليا (لا أقصد الشفافية العادية) كمثال :



هل تعرفون اننا نستطيع استعمال دوال الAPI التي تقوم بهذا العمل وهذا ما سنشرحه هنا


Desktop Window Manager

باختصار DWM الواجهة الجديدة المسؤولة على السيطرة على تحديث النوافذ الموجودة على سطح المكتب لويندوز فيستا أو 7 وبواسطته نحصل على الشفافية وتأثيرات أخرى مثل 3D flip , طريقة تنفيذ البرامج او ظهورها ايضا
اذا كل التطبيقات تستفيد من هذا الinterface بدون أي تعديل على الكود ومن أجل التعديل أو الاستفادة أكثر من امكانيات هذا الinterface عن طريق دوال الapi الموجودة في الملف dwmapi.dll


قبل البدء

يجب قبل استعمال تأثير الزجاج على الفورم أن نتأكد من أشياء ضرورية
نتأكد في البدء أن التطبيق المنشئ تنفذ فعلا على نظام فيستا تفاديا لبعض المشاكل


كود :
[color=#000000][COLOR=#007700]If [/color][color=#0000bb]Environment[/color][color=#007700].[/color][color=#0000bb]OSVersion[/color][color=#007700].[/color][color=#0000bb]Version[/color][color=#007700].[/color][color=#0000bb]Major [/color][color=#007700]< [/color][COLOR=#0000bb]6 Then
   MessageBox[/COLOR][color=#007700].[/color][color=#0000bb]Show[/color][color=#007700]([/color][color=#dd0000]"التطبيق يتطلب ويندوز فيستا "[/color][COLOR=#007700])
  [/COLOR][color=#0000bb]End [/color][COLOR=#007700]If  
[/COLOR][/COLOR]

بعدها يتم اغلاق التطبيق طبعا
شئ آخر يجب التأكد منه وهو تفعيل خاصية Aero على الفيستا لانه حتى ولو كان النظام فعلا فيستا فربما تجد هذه الخاصية غير مفعلة بسبب شاشة العرض التي قد تكون غير متوافقة مع نظام فيستا
نستطيع التأكد من ذلك عن طريق الدالة DwmIsCompositionEnabled الموجودة بالDWM التي تعطينا حالة الDWM لسطح المكتب


كود :
[color=#000000][COLOR=#007700]<[/color][color=#0000bb]DllImport[/color][color=#007700]([/color][color=#dd0000]"dwmapi.dll"[/color][color=#007700], [/color][color=#0000bb]PreserveSig[/color][color=#007700]:=[/color][color=#0000bb]False[/color][color=#007700])> [/color][COLOR=#0000bb]_
   [/COLOR][color=#007700]Public [/color][color=#0000bb]Shared [/color][color=#007700]Function [/color][color=#0000bb]DwmIsCompositionEnabled[/color][color=#007700]() As [/color][COLOR=#0000bb]Boolean
   End [/COLOR][COLOR=#007700]Function  
[/COLOR][/COLOR]

لكن يبقى هناك مشكل آخر في حالة قام المستخدم بتعطيل خاصية الAero بعد ان قمنا بتطبيق التأثير على النافذة لان DwmIsCompositionEnabled اصبحت هنا تأخذ القيمة false لذلك يجب علينا مراقبة هذا التغير

طريقة المراقبة تكون عن طريق رسائل النظام وهنا نقوم بمراقبة الرسالة WM_DWMCOMPOSITIONCHANGED التي ترسل في حالة تغير حالة الWDM ومن ثم وجب علينا التأكد هل هي مفعلة او لا من جديد


كود :
[COLOR=#000000][COLOR=#0000bb]  
   [/COLOR][color=#007700]Protected [/color][color=#0000bb]Overloads Overrides Sub WndProc[/color][color=#007700]([/color][color=#0000bb]ByRef msg [/color][color=#007700]As [/color][color=#0000bb]Message[/color][COLOR=#007700])
       [/COLOR][color=#0000bb]MyBase[/color][color=#007700].[/color][color=#0000bb]WndProc[/color][color=#007700]([/color][color=#0000bb]msg[/color][COLOR=#007700])
       Const [/COLOR][color=#0000bb]WM_DWMCOMPOSITIONCHANGED [/color][color=#007700]As [/color][color=#0000bb]Integer [/color][color=#007700]= &[/color][COLOR=#0000bb]H31E
       valeur associée au message
       Select [/COLOR][color=#007700]Case [/color][color=#0000bb]msg[/color][color=#007700].[/color][COLOR=#0000bb]Msg
            [/COLOR][color=#007700]Case [/color][COLOR=#0000bb]WM_DWMCOMPOSITIONCHANGED
               [/COLOR][color=#007700]If [/color][color=#0000bb]DwmIsCompositionEnabled[/color][color=#007700]() [/color][COLOR=#0000bb]Then
    MessageBox[/COLOR][color=#007700].[/color][color=#0000bb]Show[/color][color=#007700]([/color][color=#dd0000]"الخاصية مفعلة"[/color][COLOR=#007700])
             Else
[/COLOR][color=#0000bb]MessageBox[/color][color=#007700].[/color][color=#0000bb]Show  [/color][color=#007700]([/color][color=#dd0000]"الخاصية غير مفعلة"[/color][COLOR=#007700])
                [/COLOR][color=#0000bb]End [/color][COLOR=#007700]If
                Exit [/COLOR][COLOR=#0000bb]Select
      End Select
    End Sub  
[/COLOR][/COLOR]



تأثير الزجاج


نستطيع الآن للموضوع من أجل تطبيق الشفافية على كامل الفورم بتأثير الزجاج المعمول به على نظام فيستا
الفورم العادي يكون بالشكل التالي



وهنا لا نفصد الشفافية كخاصية بل أكثر من ذلك طبعا



الطريقة الأسهل هنا وهي استعمال الدالة DwmExtendFrameIntoClientArea للوصول إلى الحواف الشفافة للنافذة وصولا إلى كل أو حيز محدد من منطقة محددة للنافذة




كود :
[COLOR=#000000][COLOR=#0000bb]
    [/COLOR][color=#007700]Public [/color][COLOR=#0000bb]Structure Margins
        [/COLOR][color=#007700]Public [/color][color=#0000bb]_left[/color][color=#007700], [/color][color=#0000bb]_right[/color][color=#007700], [/color][color=#0000bb]_top[/color][color=#007700], [/color][color=#0000bb]_bottom [/color][color=#007700]As [/color][COLOR=#0000bb]Integer
        [/COLOR][color=#007700]Public [/color][color=#0000bb]Sub [/color][color=#007700]New([/color][color=#0000bb]ByVal left [/color][color=#007700]As [/color][color=#0000bb]Integer[/color][color=#007700], [/color][color=#0000bb]ByVal right [/color][color=#007700]As [/color][color=#0000bb]Integer[/color][color=#007700], [/color][COLOR=#0000bb]_
                       ByVal top [/COLOR][color=#007700]As [/color][color=#0000bb]Integer[/color][color=#007700], [/color][color=#0000bb]ByVal bottom [/color][color=#007700]As [/color][color=#0000bb]Integer[/color][COLOR=#007700])
            [/COLOR][color=#0000bb]_left [/color][color=#007700]= [/color][COLOR=#0000bb]left
            _right [/COLOR][color=#007700]= [/color][COLOR=#0000bb]right
            _top [/COLOR][color=#007700]= [/color][COLOR=#0000bb]Top
            _bottom [/COLOR][color=#007700]= [/color][COLOR=#0000bb]Bottom
        End Sub
    End Structure
    [/COLOR][color=#007700]<[/color][color=#0000bb]DllImport[/color][color=#007700]([/color][color=#dd0000]"dwmapi.dll"[/color][color=#007700], [/color][color=#0000bb]PreserveSig[/color][color=#007700]:=[/color][color=#0000bb]False[/color][color=#007700])> [/color][COLOR=#0000bb]_
    [/COLOR][color=#007700]Public [/color][color=#0000bb]Shared [/color][color=#007700]Function [/color][color=#0000bb]DwmExtendFrameIntoClientArea[/color][color=#007700]([/color][color=#0000bb]ByVal hWnd [/color][color=#007700]As [/color][color=#0000bb]IntPtr[/color][color=#007700], [/color][color=#0000bb]ByRef pMarInset [/color][color=#007700]As [/color][color=#0000bb]Margins[/color][color=#007700]) As [/color][COLOR=#0000bb]Integer
    End [/COLOR][COLOR=#007700]Function  
[/COLOR][/COLOR]

اولا وقبل كل شئ نقوم بانشاء كائن Margings

الذي سيحدد لكل حافة المسافة بالبيكسل اين ستطبق بداخل حيز الفورم المستقبل القيمة -1 تعبر على أن الحافة يجب ان تصل إلى كل مناطق الفورم ومن أجل الغاءه نعين القيمة 0 للحافة
نقوم باستعمال الاجراء DwmExtendFrameIntoClientArea لتطبيق العملية


كود :
[color=#000000][COLOR=#0000bb]Dim gMargins [/color][color=#007700]As [/color][color=#0000bb]Margins [/color][color=#007700]= New [/color][color=#0000bb]Margins[/color][color=#007700](-[/color][color=#0000bb]1[/color][color=#007700], [/color][color=#0000bb]0[/color][color=#007700], [/color][color=#0000bb]0[/color][color=#007700], [/color][color=#0000bb]0[/color][COLOR=#007700])
[/COLOR][color=#0000bb]DwmExtendFrameIntoClientArea[/color][color=#007700]([/color][color=#0000bb]Me[/color][color=#007700].[/color][color=#0000bb]Handle[/color][color=#007700], [/color][color=#0000bb]gMargins[/color][COLOR=#007700])
[/COLOR][color=#0000bb]Me[/color][color=#007700].[/color][color=#0000bb]Invalidate[/color][COLOR=#007700]()  
[/COLOR][/COLOR]

هنا الاجراء invalidate يجبر الفورم على اعادة الرسم لذلك هنا يجب المرور على الحدث Paint للفورم من أجل تطبيق التأثير لرؤيته يجب استعمال اللون الأسود على كامل المنطقة
نكتب في الحدث الكود التالي:

كود :
[color=#000000][COLOR=#007700]If ([/color][color=#0000bb]DwmIsCompositionEnabled[/color][color=#007700]()) [/color][COLOR=#0000bb]Then
  e[/COLOR][color=#007700].[/color][color=#0000bb]Graphics[/color][color=#007700].[/color][color=#0000bb]FillRectangle[/color][color=#007700]([/color][color=#0000bb]Brushes[/color][color=#007700].[/color][color=#0000bb]Black[/color][color=#007700], [/color][color=#0000bb]Me[/color][color=#007700].[/color][color=#0000bb]ClientRectangle[/color][COLOR=#007700])
[/COLOR][color=#0000bb]End [/color][COLOR=#007700]If  
[/COLOR][/COLOR]

تحميل التطبيق

المصدر موقع developpez مترجم بتصرف
}}}
تم الشكر بواسطة:



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم