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

هل تعرفون اننا نستطيع استعمال دوال الAPI التي تقوم بهذا العمل وهذا ما سنشرحه هنا
Desktop Window Manager
باختصار DWM الواجهة الجديدة المسؤولة على السيطرة على تحديث النوافذ الموجودة على سطح المكتب لويندوز فيستا أو 7 وبواسطته نحصل على الشفافية وتأثيرات أخرى مثل 3D flip , طريقة تنفيذ البرامج او ظهورها ايضا
اذا كل التطبيقات تستفيد من هذا الinterface بدون أي تعديل على الكود ومن أجل التعديل أو الاستفادة أكثر من امكانيات هذا الinterface عن طريق دوال الapi الموجودة في الملف dwmapi.dll
قبل البدء
يجب قبل استعمال تأثير الزجاج على الفورم أن نتأكد من أشياء ضرورية
نتأكد في البدء أن التطبيق المنشئ تنفذ فعلا على نظام فيستا تفاديا لبعض المشاكل
If Environment.OSVersion.Version.Major < 6 Then
MessageBox.Show("التطبيق يتطلب ويندوز فيستا ")
End If
بعدها يتم اغلاق التطبيق طبعا
شئ آخر يجب التأكد منه وهو تفعيل خاصية Aero على الفيستا لانه حتى ولو كان النظام فعلا فيستا فربما تجد هذه الخاصية غير مفعلة بسبب شاشة العرض التي قد تكون غير متوافقة مع نظام فيستا
نستطيع التأكد من ذلك عن طريق الدالة DwmIsCompositionEnabled الموجودة بالDWM التي تعطينا حالة الDWM لسطح المكتب
<DllImport("dwmapi.dll", PreserveSig:=False)> _
Public Shared Function DwmIsCompositionEnabled() As Boolean
End Function
لكن يبقى هناك مشكل آخر في حالة قام المستخدم بتعطيل خاصية الAero بعد ان قمنا بتطبيق التأثير على النافذة لان DwmIsCompositionEnabled اصبحت هنا تأخذ القيمة false لذلك يجب علينا مراقبة هذا التغير
طريقة المراقبة تكون عن طريق رسائل النظام وهنا نقوم بمراقبة الرسالة WM_DWMCOMPOSITIONCHANGED التي ترسل في حالة تغير حالة الWDM ومن ثم وجب علينا التأكد هل هي مفعلة او لا من جديد
Protected Overloads Overrides Sub WndProc(ByRef msg As Message)
MyBase.WndProc(msg)
Const WM_DWMCOMPOSITIONCHANGED As Integer = &H31E
Select Case msg.Msg
Case WM_DWMCOMPOSITIONCHANGED
If DwmIsCompositionEnabled() Then
MessageBox.Show("الخاصية مفعلة")
Else
MessageBox.Show("الخاصية غير مفعلة")
End If
End Select
End Sub
تأثير الزجاج
نستطيع الآن للموضوع من أجل تطبيق الشفافية على كامل الفورم بتأثير الزجاج المعمول به على نظام فيستا
الفورم العادي يكون بالشكل التالي
وهنا لا نفصد الشفافية كخاصية بل أكثر من ذلك طبعا
الطريقة الأسهل هنا وهي استعمال الدالة DwmExtendFrameIntoClientArea للوصول إلى الحواف الشفافة للنافذة وصولا إلى كل أو حيز محدد من منطقة محددة للنافذة
Public Structure Margins
Public _left, _right, _top, _bottom As Integer
Public Sub New(ByVal left As Integer, ByVal right As Integer, _
ByVal top As Integer, ByVal bottom As Integer)
_left = left
_right = right
_top = Top
_bottom = Bottom
End Sub
End Structure
<DllImport("dwmapi.dll", PreserveSig:=False)> _
Public Shared Function DwmExtendFrameIntoClientArea(ByVal hWnd As IntPtr, ByRef pMarInset As Margins) As Integer
End Function
اولا وقبل كل شئ نقوم بانشاء كائن Margings
الذي سيحدد لكل حافة المسافة بالبيكسل اين ستطبق بداخل حيز الفورم المستقبل القيمة -1 تعبر على أن الحافة يجب ان تصل إلى كل مناطق الفورم ومن أجل الغاءه نعين القيمة 0 للحافة
نقوم باستعمال الاجراء DwmExtendFrameIntoClientArea لتطبيق العملية
Dim gMargins As Margins = New Margins(-1, 0, 0, 0) DwmExtendFrameIntoClientArea(Me.Handle, gMargins) Me.Invalidate()
هنا الاجراء invalidate يجبر الفورم على اعادة الرسم لذلك هنا يجب المرور على الحدث Paint للفورم من أجل تطبيق التأثير لرؤيته يجب استعمال اللون الأسود على كامل المنطقة
نكتب في الحدث الكود التالي:
If (DwmIsCompositionEnabled()) Then e.Graphics.FillRectangle(Brushes.Black, Me.ClientRectangle) End If
يتبع





