فى هذه الجزئية سنتحدث عن Pango
Pango is a free and open source computing library for rendering internationalized texts in high quality. Different font backends can be used, allowing cross-platform support. (wikipedia)
Pango provides advanced font and text handling that is used for Gdk and Gtk.
فى المثال التالى نعرض كيفية تغيير الخط الخاص بال label
center.cs using Gtk; using System; class SharpApp : Window { private Label label; public SharpApp() : base("Pango") { SetPosition(WindowPosition.Center); DeleteEvent += delegate { Application.Quit(); }; string text = @"Excess of joy is harder to bear than any amount of sorrow. The more one judges, the less one loves. There is no such thing as a great talent without great will power. "; label = new Label(text); Pango.FontDescription fontdesc = Pango.FontDescription.FromString("Purisa 10"); label.ModifyFont(fontdesc); Fixed fix = new Fixed(); fix.Put(label, 5, 5); Add(fix); ShowAll(); } public static void Main() { Application.Init(); new SharpApp(); Application.Run(); } }
فى الكود بالأعلى، لدينا label به 3 اقتباسات.. ونريد تغيير الخط الى Pursia 10
string text = @"Excess of joy is harder to bear than any amount of sorrow. ...
النص الظاهر على ال label
Pango.FontDescription fontdesc = Pango.FontDescription.FromString("Purisa 10");الصف FontDescription يستخدم لتحديد سمات الخط المطلوب، والطرية FromString تنشئ لنا كائنا -خط- من تمثيل نصى -كتابة السمات بصورة نصية-
label.ModifyFont(fontdesc);
نقوم بتغيير
الخط
Figure: Quotations
فى المثال التالى سنعرض كافة خطوط النظام فى شجرة
systemfonts.cs using System; using Pango; using Gtk; public class SharpApp : Window { ListStore store; FontFamily[] fam; public SharpApp() : base("System fonts") { BorderWidth = 8; SetDefaultSize(350, 250); SetPosition(WindowPosition.Center); DeleteEvent += delegate { Application.Quit(); }; ScrolledWindow sw = new ScrolledWindow(); sw.ShadowType = ShadowType.EtchedIn; sw.SetPolicy(PolicyType.Automatic, PolicyType.Automatic); Context context = this.CreatePangoContext(); fam = context.Families; store = CreateModel(); TreeView treeView = new TreeView(store); treeView.RulesHint = true; sw.Add(treeView); CreateColumn(treeView); Add(sw); ShowAll(); } void CreateColumn(TreeView treeView) { CellRendererText rendererText = new CellRendererText(); TreeViewColumn column = new TreeViewColumn("FontName", rendererText, "text", Column.FontName); column.SortColumnId = (int) Column.FontName; treeView.AppendColumn(column); } ListStore CreateModel() { ListStore store = new ListStore( typeof(string) ); foreach (FontFamily ff in fam) { store.AppendValues(ff.Name); } return store; } enum Column { FontName } public static void Main() { Application.Init(); new SharpApp(); Application.Run(); } }
هذا المثال يعرض كل الخطوط المتاحة
Context context = this.CreatePangoContext();هذا الكود ينشئ متغير سياق Context، يشمل المعلومات العامة حول عملية ال rendering
fam = context.Families;من متغير السياق نحصل على كل عائلات الخطوط المتاحة
foreach (FontFamily ff in fam) { store.AppendValues(ff.Name); }
نحصل على اسماء كل عائلة -تمثل فى كائن من الصف FontFamily- ونخزنها فى مخزن البيانات
Figure: System fonts
Pango معتادة للعمل مع ال unicode
icon.cs using Gtk; using System; class SharpApp : Window { public SharpApp() : base("Unicode") { SetPosition(WindowPosition.Center); DeleteEvent += delegate { Application.Quit(); }; string text = @"Фёдор Михайлович Достоевский родился 30 октября (11 ноября) 1821 года в Москве.Был вторым из 7 детей. Отец, Михаил Андреевич, работал в госпитале для бедных. Мать, Мария Фёдоровна (в девичестве Нечаева), происходила из купеческого рода."; Label label = new Label(text); Pango.FontDescription fontdesc = Pango.FontDescription.FromString("Purisa 10"); label.ModifyFont(fontdesc); Fixed fix = new Fixed(); fix.Put(label, 5, 5); Add(fix); ShowAll(); } public static void Main() { Application.Init(); new SharpApp(); Application.Run(); } }
نعرض بعض النص المكتوب ب azbuka
string text = @"Фёдор Михайлович Достоевский родился 30 октября ...نستطيع استخدامه مباشرة
Label label = new Label(text);عادة نستخدمه فى ال label
Figure: Unicode
فى المثال الأخير.. سنستكشف Pango اكثر.. سنرسم نص ملون وفى المنتصف لمساحة رسم DrawingArea
pango.cs using System; using Gtk; using Pango; public class SharpApp : Window { public SharpApp () : base ("Australia") { SetDefaultSize(250, 200); SetPosition(WindowPosition.Center); DeleteEvent += delegate { Application.Quit(); }; Gdk.Color white = new Gdk.Color(255, 255, 255); DrawingArea drawingArea = new DrawingArea(); drawingArea.ModifyBg(StateType.Normal, white); drawingArea.ExposeEvent += OnExposeEvent; Add(drawingArea); ShowAll(); } void OnExposeEvent (object sender, ExposeEventArgs a) { DrawingArea drawingArea = sender as DrawingArea; int width = drawingArea.Allocation.Width; Gdk.PangoRenderer renderer = Gdk.PangoRenderer.GetDefault(drawingArea.Screen); renderer.Drawable = drawingArea.GdkWindow; renderer.Gc = drawingArea.Style.BlackGC; Context context = drawingArea.CreatePangoContext(); Pango.Layout layout = new Pango.Layout(context); layout.Width = Pango.Units.FromPixels(width); layout.SetText("Australia"); FontDescription desc = FontDescription.FromString("Serif Bold 20"); layout.FontDescription = desc; renderer.SetOverrideColor(RenderPart.Foreground, new Gdk.Color(200, 30, 30)); layout.Alignment = Pango.Alignment.Center; renderer.DrawLayout(layout, 0, 0); renderer.SetOverrideColor(RenderPart.Foreground, Gdk.Color.Zero); renderer.Drawable = null; renderer.Gc = null; } public static void Main() { Application.Init(); new SharpApp(); Application.Run(); } }
نرسم كلمة Australia افقيا وفى المنتصف وباللون الأحمر الغامق.
Gdk.PangoRenderer renderer = Gdk.PangoRenderer.GetDefault(drawingArea.Screen); renderer.Drawable = drawingArea.GdkWindow; renderer.Gc = drawingArea.Style.BlackGC;
نستدعى ال renderer الإفتراضى للشاشة ونجهزه للرسم
Context context = drawingArea.CreatePangoContext(); Pango.Layout layout = new Pango.Layout(context);
ننشئ مخطط من Pango.Layout ، وهو دريفر عالى المستوى لوضع قطع من النصوص
layout.Width = Pango.Units.FromPixels(width);نحدد عرض المخططات
layout.SetText("Australia");نحدد النص
FontDescription desc = FontDescription.FromString("Serif Bold 20"); layout.FontDescription = desc;
نحدد الخط للمخطط
renderer.SetOverrideColor(RenderPart.Foreground, new Gdk.Color(200, 30, 30)); layout.Alignment = Pango.Alignment.Center;
نحدد اللون والإزاحة
renderer.DrawLayout(layout, 0, 0);نرسم المخطط
renderer.SetOverrideColor(RenderPart.Foreground, Gdk.Color.Zero); renderer.Drawable = null; renderer.Gc = null;
نقوم بتنظيف الموارد
Figure: Australia
فى هذه الجزئية تعاملنا مع مكتبة Pango
Home Contents Top of Page