فى هذه الجزئية سنقوم بعمل بعض الرسم مع المكتبة Cairo كايرو
Cairo is a library for creating 2D vector graphics. We can use it to draw our own widgets, charts or various effects or animations.
التطبيق يشمل عمليه تحديد الشكل الخارجى وملئه من الداخل
simpledrawing.cs using Gtk; using Cairo; using System; class SharpApp : Window { public SharpApp() : base("Simple drawing") { SetDefaultSize(230, 150); SetPosition(WindowPosition.Center); DeleteEvent += delegate { Application.Quit(); };; DrawingArea darea = new DrawingArea(); darea.ExposeEvent += OnExpose; Add(darea); ShowAll(); } void OnExpose(object sender, ExposeEventArgs args) { DrawingArea area = (DrawingArea) sender; Cairo.Context cr = Gdk.CairoHelper.Create(area.GdkWindow); cr.LineWidth = 9; cr.SetSourceRGB(0.7, 0.2, 0.0); int width, height; width = Allocation.Width; height = Allocation.Height; cr.Translate(width/2, height/2); cr.Arc(0, 0, (width < height ? width : height) / 2 - 10, 0, 2*Math.PI); cr.StrokePreserve(); cr.SetSourceRGB(0.3, 0.4, 0.6); cr.Fill(); ((IDisposable) cr.Target).Dispose(); ((IDisposable) cr).Dispose(); } public static void Main() { Application.Init(); new SharpApp(); Application.Run(); } }
فى المثال التالى سنرسم دائرة ونملئها بلون
gmcs -pkg:gtk-sharp-2.0 -r:/usr/lib/mono/2.0/Mono.Cairo.dll simple.csهذه كيفية ترجمة المثال
DrawingArea darea = new DrawingArea();نقوم بعمليات الرسم داخل مساحة رسم DrawingArea
darea.ExposeEvent += OnExpose;كل الرسم يتم فى معالج حدث ال ExposeEvent وهو الطريقة OnExpose
DrawingArea area = (DrawingArea) sender; Cairo.Context cr = Gdk.CairoHelper.Create(area.GdkWindow);
ننشئ كائن السياق من الصف Cairo.Context من ال GdkWindow لمنطقة الرسم
cr.LineWidth = 9;نحدد عرض الخط ل 9 بكسل
cr.SetSourceRGB(0.7, 0.2, 0.0);نحدد اللون للأحمر الغامق
int width, height; width = Allocation.Width; height = Allocation.Height; cr.Translate(width/2, height/2);
نحصل على عرض وارتفاع منقطة الرسم ونحرك نقطة الأصل لمركز النافذة
cr.Arc(0, 0, (width < height ? width : height) / 2 - 10, 0, 2*Math.PI); cr.StrokePreserve();
نرسم الحدود الخارجية للدائرة عن.. الطريقة StrokePreserve ترسم المسار بناءا على العرض وجامع السطر واعدادات الdash بعكس الطريقة Stroke اللتى تحفظ المسار فى داخل سياق كايرو
cr.SetSourceRGB(0.3, 0.4, 0.6); cr.Fill();
نملء الدائرة باللون الأزرق
Figure: Simple drawing
فى المثال التالى سنقوم برسم بعض الأشكال الأساسية
basicshapes.cs using Gtk; using Cairo; using System; class SharpApp : Window { public SharpApp() : base("Basic shapes") { SetDefaultSize(390, 240); SetPosition(WindowPosition.Center); DeleteEvent += delegate { Application.Quit(); }; DrawingArea darea = new DrawingArea(); darea.ExposeEvent += OnExpose; Add(darea); ShowAll(); } void OnExpose(object sender, ExposeEventArgs args) { DrawingArea area = (DrawingArea) sender; Cairo.Context cc = Gdk.CairoHelper.Create(area.GdkWindow); cc.SetSourceRGB(0.2, 0.23, 0.9); cc.LineWidth = 1; cc.Rectangle(20, 20, 120, 80); cc.Rectangle(180, 20, 80, 80); cc.StrokePreserve(); cc.SetSourceRGB(1, 1, 1); cc.Fill(); cc.SetSourceRGB(0.2, 0.23, 0.9); cc.Arc(330, 60, 40, 0, 2*Math.PI); cc.StrokePreserve(); cc.SetSourceRGB(1, 1, 1); cc.Fill(); cc.SetSourceRGB(0.2, 0.23, 0.9); cc.Arc(90, 160, 40, Math.PI/4, Math.PI); cc.ClosePath(); cc.StrokePreserve(); cc.SetSourceRGB(1, 1, 1); cc.Fill(); cc.SetSourceRGB(0.2, 0.23, 0.9); cc.Translate(220, 180); cc.Scale(1, 0.7); cc.Arc(0, 0, 50, 0, 2*Math.PI); cc.StrokePreserve(); cc.SetSourceRGB(1, 1, 1); cc.Fill(); ((IDisposable) cc.Target).Dispose (); ((IDisposable) cc).Dispose (); } public static void Main() { Application.Init(); new SharpApp(); Application.Run(); } }
فى هذا المثال، سننشئ مستطيل ومربع ودائرة وقوس وقطع ناقص سنرسم الحدود بالأزرق والداخل بالأبيض
cc.Rectangle(20, 20, 120, 80); cc.Rectangle(180, 20, 80, 80); cc.StrokePreserve(); cc.SetSourceRGB(1, 1, 1); cc.Fill();
هذه الأسطر ترسم المستطيل والمربع
cc.Arc(330, 60, 40, 0, 2*Math.PI);الطريقة Arc ترسم الدائرة
cc.Scale(1, 0.7); cc.Arc(0, 0, 50, 0, 2*Math.PI);
اذا اردنا رسم شكل بيضاوى.. يجب علينا القيام بعمل Scaling اولا ، حيث تقوم الطريقة Scale هنا بتقليص محور ص
Figure: Basic shapes
اللون هو كائن يمثل تجميعة من الأحمر والأخضر والأزرق RGB القيم المسموحة بين الفترة 0 و 1
colors.cs using Gtk; using Cairo; using System; class SharpApp : Window { public SharpApp() : base("Colors") { SetDefaultSize(360, 100); SetPosition(WindowPosition.Center); DeleteEvent += delegate { Application.Quit(); }; DrawingArea darea = new DrawingArea(); darea.ExposeEvent += OnExpose; Add(darea); ShowAll(); } void OnExpose(object sender, ExposeEventArgs args) { DrawingArea area = (DrawingArea) sender; Cairo.Context cr = Gdk.CairoHelper.Create(area.GdkWindow); cr.SetSourceRGB(0.2, 0.23, 0.9); cr.Rectangle(10, 15, 90, 60); cr.Fill(); cr.SetSourceRGB(0.9, 0.1, 0.1); cr.Rectangle(130, 15, 90, 60); cr.Fill(); cr.SetSourceRGB(0.4, 0.9, 0.4); cr.Rectangle(250, 15, 90, 60); cr.Fill(); ((IDisposable) cr.Target).Dispose(); ((IDisposable) cr).Dispose(); } public static void Main() { Application.Init(); new SharpApp(); Application.Run(); } }
نرسم 3 مستطيلات ب 3 الوان مختلفة
cr.SetSourceRGB(0.2, 0.23, 0.9);نحدد اللون لكائن السياق الخاص بكايرو بإستخدام الطريقة SetSourceRGB والمعاملات ال 3 هى قيم الاحمر والأخضر والأزرق
cr.Rectangle(10, 15, 90, 60); cr.Fill();
ننشئ شكل مستطيل ونملئه باللون السابق
Figure: Colors
Transparency is the quality of being able to see through a material. The easiest way to understand transparency is to imagine a piece of glass or water. Technically, the rays of light can go through the glass and this way we can see objects behind the glass.
In computer graphics, we can achieve transparency effects using alpha compositing. Alpha compositing is the process of combining an image with a background to create the appearance of partial transparency. The composition process uses an alpha channel. (wikipedia.org, answers.com)
transparentrectangles.cs using Gtk; using Cairo; using System; class SharpApp : Window { public SharpApp() : base("Transparent rectangles") { SetDefaultSize(590, 90); SetPosition(WindowPosition.Center); DeleteEvent += delegate { Application.Quit(); } ; DrawingArea darea = new DrawingArea(); darea.ExposeEvent += OnExpose; Add(darea); ShowAll(); } void OnExpose(object sender, ExposeEventArgs args) { DrawingArea area = (DrawingArea) sender; Cairo.Context cr = Gdk.CairoHelper.Create(area.GdkWindow); for ( int i = 1; i <= 10; i++) { cr.SetSourceRGBA(0, 0, 1, i*0.1); cr.Rectangle(50*i, 20, 40, 40); cr.Fill(); } ((IDisposable) cr.Target).Dispose(); ((IDisposable) cr).Dispose(); } public static void Main() { Application.Init(); new SharpApp(); Application.Run(); } }
In the example we will draw ten rectangles with different levels of transparency.
cr.SetSourceRGBA(0, 0, 1, i*0.1);The last parameter of the SetSourceRGBA() method is the alpha transparency.
Figure: Transparent rectangles
فى التالى سنرسم بعض النص على النافذة
soulmate.cs using Gtk; using Cairo; using System; class SharpApp : Window { public SharpApp() : base("Soulmate") { SetDefaultSize(420, 250); SetPosition(WindowPosition.Center); DeleteEvent += delegate { Application.Quit(); }; DrawingArea darea = new DrawingArea(); darea.ExposeEvent += OnExpose; Add(darea); ShowAll(); } void OnExpose(object sender, ExposeEventArgs args) { DrawingArea area = (DrawingArea) sender; Cairo.Context cr = Gdk.CairoHelper.Create(area.GdkWindow); cr.SetSourceRGB(0.1, 0.1, 0.1); cr.SelectFontFace("Purisa", FontSlant.Normal, FontWeight.Bold); cr.SetFontSize(13); cr.MoveTo(20, 30); cr.ShowText("Most relationships seem so transitory"); cr.MoveTo(20, 60); cr.ShowText("They're all good but not the permanent one"); cr.MoveTo(20, 120); cr.ShowText("Who doesn't long for someone to hold"); cr.MoveTo(20, 150); cr.ShowText("Who knows how to love without being told"); cr.MoveTo(20, 180); cr.ShowText("Somebody tell me why I'm on my own"); cr.MoveTo(20, 210); cr.ShowText("If there's a soulmate for everyone"); ((IDisposable) cr.Target).Dispose(); ((IDisposable) cr).Dispose(); } public static void Main() { Application.Init(); new SharpApp(); Application.Run(); } }
هنا عرضنا جزء كلمات اغنية soulmate ل Natasha Bedingfields
cr.SelectFontFace("Purisa", FontSlant.Normal, FontWeight.Bold);هنا حددنا الخط واستخدمنا Pursia bold
cr.SetFontSize(13);حددنا حجم الخط
cr.MoveTo(20, 30);ننتقل للنقطة التى نريد الرسم عندها
cr.ShowText("Most relationships seem so transitory");
الطريقة
ShowText تستخدم لرسم نص ما
على النافذة
Figure: Soulmate
فى هذا الفصل قمنا بعمل بعض الرسوميات بإستخدام كايرو
Home Contents Top of Page