11-10-17, 05:11 PM
(آخر تعديل لهذه المشاركة : 11-10-17, 05:42 PM {2} بواسطة silverlight.)
مقدمــــة :
كلمة Blend ترجمتها من الإنجليزية الي العربية تعني مزيج من شيئان أو خليط من شيئان لتخرج في النهاية بشئ فيه انسجام أو تخرج بتوليفة مناسبة من عذا المزيج
ولكي تقوم بعمل Blend للفورم يجب أن تدرس و تفهم التالي :
شفافية الألوان
خلط الألوان
فصل الألوان
استخلاص لون من لون أخر
وعلي ما أعتقد أن مايكروسوفت قد استخدمت هذا الأسلوب في Windows Presentation Foundation (WPF) لكي تحصل علي فورم شكله لطيف و جميل
طبعا هناك بعضا من الناس قد يعتقدون أن WPF أفضل من الناحية الجمالية بكثيير عن الويندوز فورم وبالتاكيد هذا الاعتقاد له احترامه ولكني أختلق تماما مع هذا الرأي
وهذا الموضوع هو إثبات بسيط لما يمكن أن تفعله في الويندوز فورم Windows Forms
وعلي ما أظن و الله أعلم أنك تستطيع أن تفعل في الويندوز فورم الكثيير و الكثيير بشرط أن تكون متفهما لما تفعله
أهم شئ في فكرة Blend هو أن تتعلم كيفية استخلاص لون من لون أخر أو حساب شفافية الألوان
المعادلات الرياضية التي توضح كيفية حساب Blend موجودة في اللينك التالي
Blend Function
والمعادلات مصممة للتعامل مع الصور أصلا
لكن علينا أن لا ننسي أن الصور مكوناتها عبارة عن ألوان و بالتالي نفس المعادلات يمكن استخدامها مع الألوان
أيضا لا يجب أن لا ننسي أن الفورم أصله صورة
الكود التالي عبارة عن مثال توضيحي لكيفية استخدام معادلات مايكروسوفت
مثال:
يمكن استخدام الدالة كالأتي:
حاول عزيزي القارئ أن تغير قيمة المتغير sca و المتغير alpha و تلاحظ اللون الذي ستحصل عليه
بالطبع المعادلات قد تكون تقليدية و معروفة لمعظم المبرمجين و لو بحثت جيدا علي النت ستجد موضوعات كثيرة تتخدث عن Color Blend
لكن ما لم تقوله مايكروسوفت صراحة وتركت للمبرمج أن يكتشفه بنفسه من الموضوع الموجود في اللينك التالي
SetLayeredWindowAttributes function
هو أنه يمكن حساب قيمة Alpha من أي لون
ثم بعد ذلك يتم استخدام هذه القيمة لحساب قيمة Opacity او لحساب قيمة الشفافية الخاصة بالفورم
و الدالة التالية توضح كيفية حساب قيمة الشفافية من لون خلفية الفورم مثلا
الكود التالي يوضح كيفية استخدام الدالة في تخصيص قيمة الشفافية للفروم
يمكن تطبيق الفكرة أعلاه في تغيير شكل الفورم تماما لكن للأسف عليك أن ترسم الفورم كاملا
والكود التالي عبارة عن مثال سريع لتغيير شكل الفورم
أتمني أن يكون الموضوع مقيدا للبعض منكم
تقبلوا تحياتي
كلمة Blend ترجمتها من الإنجليزية الي العربية تعني مزيج من شيئان أو خليط من شيئان لتخرج في النهاية بشئ فيه انسجام أو تخرج بتوليفة مناسبة من عذا المزيج
ولكي تقوم بعمل Blend للفورم يجب أن تدرس و تفهم التالي :
شفافية الألوان
خلط الألوان
فصل الألوان
استخلاص لون من لون أخر
وعلي ما أعتقد أن مايكروسوفت قد استخدمت هذا الأسلوب في Windows Presentation Foundation (WPF) لكي تحصل علي فورم شكله لطيف و جميل
طبعا هناك بعضا من الناس قد يعتقدون أن WPF أفضل من الناحية الجمالية بكثيير عن الويندوز فورم وبالتاكيد هذا الاعتقاد له احترامه ولكني أختلق تماما مع هذا الرأي
وهذا الموضوع هو إثبات بسيط لما يمكن أن تفعله في الويندوز فورم Windows Forms
وعلي ما أظن و الله أعلم أنك تستطيع أن تفعل في الويندوز فورم الكثيير و الكثيير بشرط أن تكون متفهما لما تفعله
أهم شئ في فكرة Blend هو أن تتعلم كيفية استخلاص لون من لون أخر أو حساب شفافية الألوان
المعادلات الرياضية التي توضح كيفية حساب Blend موجودة في اللينك التالي
Blend Function
والمعادلات مصممة للتعامل مع الصور أصلا
لكن علينا أن لا ننسي أن الصور مكوناتها عبارة عن ألوان و بالتالي نفس المعادلات يمكن استخدامها مع الألوان
أيضا لا يجب أن لا ننسي أن الفورم أصله صورة
الكود التالي عبارة عن مثال توضيحي لكيفية استخدام معادلات مايكروسوفت
مثال:
PHP كود :
Private Function CalculateColor(sca As Integer, src As Color, dst As Color) As Color
Dim dstRed As Double = src.R * (sca / 255.0) + dst.R * (1.0 - (sca / 255.0))
Dim dstGreen As Double = src.G * (sca / 255.0) + dst.G * (1.0 - (sca / 255.0))
Dim dstBlue As Double = src.B * (sca / 255.0) + dst.B * (1.0 - (sca / 255.0))
Dim dstAlpha As Double = src.A * (sca / 255.0) + dst.A * (1.0 - (sca / 255.0))
Return Color.FromArgb(CByte(dstAlpha), CByte(dstRed), CByte(dstGreen), CByte(dstBlue))
End Function
يمكن استخدام الدالة كالأتي:
PHP كود :
Dim sca As Integer = 84
Dim src As Color = Color.Blue
Dim dst As Color = Me.BackColor
Dim alpha As Byte = 32
Dim clr As Color = CalculateColor(sca, src, dst)
Dim blended As Color = Color.FromArgb(alpha, clr)
حاول عزيزي القارئ أن تغير قيمة المتغير sca و المتغير alpha و تلاحظ اللون الذي ستحصل عليه
بالطبع المعادلات قد تكون تقليدية و معروفة لمعظم المبرمجين و لو بحثت جيدا علي النت ستجد موضوعات كثيرة تتخدث عن Color Blend
لكن ما لم تقوله مايكروسوفت صراحة وتركت للمبرمج أن يكتشفه بنفسه من الموضوع الموجود في اللينك التالي
SetLayeredWindowAttributes function
هو أنه يمكن حساب قيمة Alpha من أي لون
ثم بعد ذلك يتم استخدام هذه القيمة لحساب قيمة Opacity او لحساب قيمة الشفافية الخاصة بالفورم
و الدالة التالية توضح كيفية حساب قيمة الشفافية من لون خلفية الفورم مثلا
PHP كود :
Private Function GetOpacity(sca As Byte, sourceColor As Color) As Double
sca = Byte.MaxValue - sca
Dim dest As Color = Color.FromArgb(CInt((1 - (sca / Byte.MaxValue)) * Byte.MaxValue), sourceColor)
Return CDbl(CByte(If(dest.A > 255, 255, If(dest.A < 0, 0, dest.A))) / Byte.MaxValue)
End Function
الكود التالي يوضح كيفية استخدام الدالة في تخصيص قيمة الشفافية للفروم
PHP كود :
Me.Opacity = GetOpacity(100, Me.BackColor)
يمكن تطبيق الفكرة أعلاه في تغيير شكل الفورم تماما لكن للأسف عليك أن ترسم الفورم كاملا
والكود التالي عبارة عن مثال سريع لتغيير شكل الفورم
PHP كود :
Public Class Form1
Private _alpha As Byte = 160
Private _shadowColor As Color
Public Property Allpha As Byte
Get
Return Me._alpha
End Get
Set(value As Byte)
Me._alpha = value
Me.Opacity = GetOpacity(_alpha, MyBase.BackColor)
Me.Refresh()
End Set
End Property
Public Property ShadowColor As Color
Get
Return Me._shadowColor
End Get
Set(value As Color)
Me._shadowColor = value
Me.Refresh()
End Set
End Property
Private Function GetOpacity(sca As Byte, sourceColor As Color) As Double
sca = Byte.MaxValue - sca
Dim dest As Color = Color.FromArgb(CInt((1 - (sca / Byte.MaxValue)) * Byte.MaxValue), sourceColor)
Return CDbl(CByte(If(dest.A > 255, 255, If(dest.A < 0, 0, dest.A))) / Byte.MaxValue)
End Function
Protected Overrides Sub OnPaint(e As PaintEventArgs)
MyBase.OnPaint(e)
Dim r As Rectangle = New Rectangle(2, 2, Me.Width - 4, Me.Height - 4)
Using sb As SolidBrush = New SolidBrush(Color.FromArgb(Me._alpha, _shadowColor))
e.Graphics.FillRectangle(sb, r)
End Using
Using sb As New SolidBrush(Color.FromArgb(Me._alpha, _shadowColor))
Dim caption As Rectangle = New Rectangle(3, 3, Me.Width - 6, 28)
e.Graphics.FillRectangle(sb, caption)
e.Graphics.DrawString(Me.Text, Me.Font, New SolidBrush(Color.White), New Point(4, 4))
End Using
End Sub
Protected Overrides Sub OnLoad(e As EventArgs)
MyBase.OnLoad(e)
MyBase.BackColor = Color.Blue
MyBase.StartPosition = FormStartPosition.Manual
MyBase.FormBorderStyle = FormBorderStyle.None
MyBase.ShowInTaskbar = False
MyBase.ShowIcon = False
MyBase.Size = New Size(300, 300)
Me.DoubleBuffered = True
Me._shadowColor = Color.Black
Me.Opacity = GetOpacity(_alpha, MyBase.BackColor)
End Sub
End Class
أتمني أن يكون الموضوع مقيدا للبعض منكم
تقبلوا تحياتي
Retired