الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تطبيق تأثير الزجاج على النوافذ داخل ويندوز فيستا

بدأه DreamNet في 3 مايو 2009 · 7 رد · 3,260 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

مقدمة:

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

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

image2.png

هل تعرفون اننا نستطيع استعمال دوال ال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

تأثير الزجاج

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

الفورم العادي يكون بالشكل التالي

post-23361-1241368233_thumb.png

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

post-23361-1241368262_thumb.png

الطريقة الأسهل هنا وهي استعمال الدالة 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

يتبع

تم تعديل هذه المشاركة بواسطة DreamNet في 3 مايو 2009 في 19:37

#2

لو أردنا مثلا تطبيق التأثير فقط على جزء من الفورم ارتفاعه 100 بكسل

هنا علينا تغيير في خصائص الكائن Margins

ليصبح بالشكل التالي:

		 gMargins = New Margins(0, 0, 100, 0)
		 DwmExtendFrameIntoClientArea(Me.Handle, gMargins)
		 Me.Invalidate()

وايضا في الحدث Paint للفورم ايضا يصبح السطر على الشكل التالي:

		 e.Graphics.FillRectangle(Brushes.Black, Rectangle.FromLTRB(0, _
								0, Me.ClientRectangle.Width, gMargins._top))

الناتج بالصورة

post-23361-1241368771_thumb.png

الكتابة والرسم على الشفافية:

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

لكن المكشل هنا أن التأثير يجعل من استعمال اداة مثل الlabel لا يبدو جميلا

image6.png

الlabel به نص أسود frown.gif

image7.png

خلفيته شفافة frown.gif

الحل هنا أن نستعمل الGDI+ من أجل رسم الكتابة على الفورم

وهذا هو الكود الذي سنضعه في الحدث Paint طبعا للفورم


0, Me.ClientRectangle.Width, gMargins._top))
Dim g As Graphics = Me.CreateGraphics()
Dim blackfont As GraphicsPath = New GraphicsPath()
Dim brsh As SolidBrush = New SolidBrush(Color.Blue)

blackfont.AddString("DreamNet", _
New FontFamily("Tahoma"), FontStyle.Regular, 26, _
New Point(40, 10), StringFormat.GenericDefault)

g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality
g.FillPath(brsh, blackfont)
   e.Graphics.FillRectangle(Brushes.Black, Rectangle.FromLTRB(0, _

النتيجة

post-23361-1241369113_thumb.png

التطبيق:

vbWDM.zip

بعض المصادر :

Desktop Window Manager

API DWM

مترجم بتصرف من موقع developpez

#3

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

كعادتك DreamNet, يعجبني كونك من القلة الذين لايحبون الراتبه وطرح المواضيع المكررة والتي اعتدنا وجودها في منتدياتنا ... و الموضوع جميل ويسرني وجود من يتطرق اليه في منتدانا الحبيب

كانت لي مقالة مشابهه في الكود بروجت

http://www.codeproject.com/KB/dialog/rtaGlassEffectLib.aspx

اتمنى ان اجد الوقت لترجمتها ووضعها في منتدانا

اشكرك مرة اخرى

السلام عليكم

مواضيع برمجية تقنية جديدة

----------------------------------------------------------------------------------------------------------------------------------------------

• إستغلال خدمة الـ RSS في برامجنا ومواقعنا ! (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج للبحث في الملفات ومحتواياتها (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• فئة للتراسل بين برنامجين في جهاز واحد ! (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

مواضيع برمجية تقنية قديمة

----------------------------------------------------------------------------------------------------------------------------------------------

• إستغلال رسائل البالونات Balloons في الوينذوز أكس بي(VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• مقالة : لماذا يجب ان نعتني بشفرات برامجنا !؟- (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• لمطوري البرامج و مواقع الويب - برنامج تركيب ألوان - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج : بسيط للتحكم بالنظام, عن طريق الريجستري - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• برنامج : لتقييد و منع تشغيل البرامج الاخرى - (VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• النوافذ المنبثقة و طريقة لإستغلالها في برامجنا -(VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• تقنية الإستدعاء الذاتي - (VB.NET , VB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• مصفوفات الأدوات Control Arrays افكار وتلميحات ! - (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

• أفكار و تلميحات[ المعنى الحقيقي للـ True و False ] - أمثلة (VB.NETVB6.0)

----------------------------------------------------------------------------------------------------------------------------------------------

• دوال الـ APIs و مايقابلها في الدوت نت ! - (VB.NET)

----------------------------------------------------------------------------------------------------------------------------------------------

#4

صراحة موضوع جميل. لطالما تساءلت عن طريقة القيام بذلك و هاأنذا أعرف و بدون عناء بحث أو تفكير.

شكرا على الموضوع الجميل.

تحياتي...

#6

لكن كيف احل مشكلة استخدام PictureBox و Label و مشكلة تغيير النص الموجود داخل Button جميعها تخرج باللون الابيض؟؟؟ حاولت لكن دون فائدة......منتظرين الحل

post-23361-1241369113.png

تم تعديل هذه المشاركة بواسطة mdf في 28 يوليو 2010 في 18:13

#7

هل يعمل على ويندوز 7 ؟

Zefri Yahya - ArabTeam 2000

tpc7rzy94tx8iduak4b.png

#8
mdf كتب:

لكن كيف احل مشكلة استخدام PictureBox و Label و مشكلة تغيير النص الموجود داخل Button جميعها تخرج باللون الابيض؟؟؟ حاولت لكن دون فائدة......منتظرين الحل

post-23361-1241369113.png

OricalcosZy كتب:

هل يعمل على ويندوز 7 ؟

نعم وندوز سفن7 يدعم التأثير الزجاجي.......لكن هناك مشكلة من ناحية PictureBox

مواضيع مشابهة