في هذا الجزء من دورة البرمجه في GTK+ , سوف نقدم بعض ال widgets في GTK+ .
ال Widgets هي الاحجار الاسايه لبناء الواجهات الرسوميه. علي مر السنين , بعض ال widgets قد اصبحت قياسيه في كل ال toolkits وكل منصات التشغيل . كمثال الزرار button , صندوق تحقق او حتي شريط الانتقال. فلسفة ال Gtk+ ان تجعل عدد ال widgets قليل . ال widgets المخصوصه والتي تطلبت مواصفات خاصه يتم انشائها علي انها widgets مخصصه (اي بالطلب) .
GtkButton هو مثال علي Widget بسيط يستخدم في بدأ حدث ما (trigger an action) .
#include <gtk/gtk.h> int main( int argc, char *argv[]) { GtkWidget *window; GtkWidget *fixed; GtkWidget *button; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "GtkButton"); gtk_window_set_default_size(GTK_WINDOW(window), 230, 150); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); fixed = gtk_fixed_new(); gtk_container_add(GTK_CONTAINER(window), fixed); button = gtk_button_new_with_label("Quit"); gtk_fixed_put(GTK_FIXED(fixed), button, 50, 50); gtk_widget_set_size_request(button, 80, 35); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(gtk_main_quit), G_OBJECT(window)); g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_widget_show_all(window); gtk_main(); return 0; }
هذا المثال يعرض زرار موضوع في وعاء ثابت (fixed container) . هذا التطبيق ينغلق عندما يتم نقر الزرار .
button = gtk_button_new_with_label("Quit");هذا الكود يقوم بانشاء زرار جديد بملصق عنواني.
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(gtk_main_quit), G_OBJECT(window));
هنا نقوم بربط الاشاره Clicked بالزرار . هذه الاشاره عندما تبعث سوف يتعامل معها الزرار باستدعاء الداله gtk_main_quit() التي سوف تنهي البرنامج .
Figure: GtkButton
ال widget المسمي ب GtkCheckButton لديه حالتين . Checked/Unchecked اي معلم او غير معلم .
#include <gtk/gtk.h> void toggle_title(GtkWidget *widget, gpointer window) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) { gtk_window_set_title(window, "GtkCheckButton"); } else { gtk_window_set_title(window, ""); } } int main(int argc, char** argv) { GtkWidget *window; GtkWidget *frame; GtkWidget *check; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(window), 230, 150); gtk_window_set_title(GTK_WINDOW(window), "GtkCheckButton"); frame = gtk_fixed_new(); gtk_container_add(GTK_CONTAINER(window), frame); check = gtk_check_button_new_with_label("Show title"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), TRUE); GTK_WIDGET_UNSET_FLAGS(check, GTK_CAN_FOCUS); gtk_fixed_put(GTK_FIXED(frame), check, 50, 50); g_signal_connect_swapped(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(check, "clicked", G_CALLBACK(toggle_title), (gpointer) window); gtk_widget_show_all(window); gtk_main(); return 0; }
سوف نقوم بعرض عنوان علي حسب حالة ال GtkCheckButton .
check = gtk_check_button_new_with_label("Show title"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), TRUE);
يتم انشاء GtkCheckButton جديد ويتم تعليمه كحاله افتراضيه . لاننا نعرض عنوان بشكل افتراضي ايضا.
GTK_WIDGET_UNSET_FLAGS(check, GTK_CAN_FOCUS);هذا الكود يقوم بتعطيل التركيز علي ال widget . انا ببساطه لم يعجبني الشكل حول الزرار التحقيق (check button) .
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) { gtk_window_set_title(window, "GtkCheckButton"); } else { gtk_window_set_title(window, ""); }
نقوم بعرض عنوان للنافذه علي حسب حالة الزرار.GtkCheckButton.
Figure: GtkCheckButton
هي نافذه باطار منسق وملصق عنواني .
#include <gtk/gtk.h> int main( int argc, char *argv[]) { GtkWidget *window; GtkWidget *table; GtkWidget *frame1; GtkWidget *frame2; GtkWidget *frame3; GtkWidget *frame4; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(window), 250, 250); gtk_window_set_title(GTK_WINDOW(window), "GtkFrame"); gtk_container_set_border_width(GTK_CONTAINER(window), 10); table = gtk_table_new(2, 2, TRUE); gtk_table_set_row_spacings(GTK_TABLE(table), 10); gtk_table_set_col_spacings(GTK_TABLE(table), 10); gtk_container_add(GTK_CONTAINER(window), table); frame1 = gtk_frame_new("Shadow In"); gtk_frame_set_shadow_type(GTK_FRAME(frame1), GTK_SHADOW_IN); frame2 = gtk_frame_new("Shadow Out"); gtk_frame_set_shadow_type(GTK_FRAME(frame2), GTK_SHADOW_OUT); frame3 = gtk_frame_new("Shadow Etched In"); gtk_frame_set_shadow_type(GTK_FRAME(frame3), GTK_SHADOW_ETCHED_IN); frame4 = gtk_frame_new("Shadow Etched Out"); gtk_frame_set_shadow_type(GTK_FRAME(frame4), GTK_SHADOW_ETCHED_OUT); gtk_table_attach_defaults(GTK_TABLE(table), frame1, 0, 1, 0, 1); gtk_table_attach_defaults(GTK_TABLE(table), frame2, 0, 1, 1, 2); gtk_table_attach_defaults(GTK_TABLE(table), frame3, 1, 2, 0, 1); gtk_table_attach_defaults(GTK_TABLE(table), frame4, 1, 2, 1, 2); g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), G_OBJECT(window)); gtk_widget_show_all(window); gtk_main(); return 0; }
هذا المثال يعرض اربع انواع من الاطارات . الاطارات معلبه داخل وعاء جدول Table container .
frame1 = gtk_frame_new("Shadow In"); gtk_frame_set_shadow_type(GTK_FRAME(frame1), GTK_SHADOW_IN);
نقوم بانشاء اطارجديد من نوع GtkFrame ونقوم بوضع نوع الظل الخاص به .
Figure: GtkFrame
تعرضنا له من قبل , واظنك تعرف ماهو . هو widget مخصص لعرض النصوص.
#include <gtk/gtk.h> int main( int argc, char *argv[]) { GtkWidget *window; GtkWidget *label; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_title(GTK_WINDOW(window), "Nymphetamine"); gtk_window_set_default_size(GTK_WINDOW(window), 350, 400); label = gtk_label_new("Cold was my soul\n\ Untold was the pain\n\ I faced when you left me\n\ A rose in the rain....\n\ So I swore to the razor\n\ That never, enchained\n\ Would your dark nails of faith\n\ Be pushed through my veins again\n\ \n\ Bared on your tomb\n\ I'm a prayer for your loneliness\n\ And would you ever soon\n\ Come above onto me?\n\ For once upon a time\n\ On the binds of your lowliness\n\ I could always find the slot for your sacred key "); gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER); gtk_container_add(GTK_CONTAINER(window), label); g_signal_connect_swapped(window, "destroy", G_CALLBACK (gtk_main_quit), NULL); gtk_widget_show_all(window); gtk_main(); return 0; }
هذا المثال يعرض كلمات من اغنيه . "استمع اليها" .
label = gtk_label_new("Cold was my soul\n\ Untold was the pain\n\ ...
نقوم بانشاء GtkLabel جديد. يمكنا ان نقوم باضافة نص متعدد السطور .
gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER);نقوم بمحورة الملصق النصي في وسط النافذه.
Figure: GtkLabel
في ملصق عناوني يمكنا ان نستخدم ايضا لغات markup مثل ال HTML. في المثال القادم نعرض ذلك.
#include <gtk/gtk.h> int main( int argc, char *argv[]) { GtkWidget *window; GtkWidget *label; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_title(GTK_WINDOW(window), "markup label"); char *str = "<b>ZetCode</b>, Knowledge only matters"; label = gtk_label_new(NULL); gtk_label_set_markup(GTK_LABEL(label), str); gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER); gtk_container_add(GTK_CONTAINER(window), label); gtk_widget_show(label); gtk_window_set_default_size(GTK_WINDOW(window), 300, 100); g_signal_connect(window, "destroy", G_CALLBACK (gtk_main_quit), NULL); gtk_widget_show(window); gtk_main(); return 0; }
هذا المثال يقوم بعرض جزء من النص بصورة BOLD .
char *str = "<b>ZetCode</b>, Knowledge only matters";هذا هو النص الذي سوف نقوم بعرضه .
label = gtk_label_new(NULL); gtk_label_set_markup(GTK_LABEL(label), str);
نقوم بانشاء ملصق جديد ونضع النص بداخله ويتم عرضه بهذا الشكل.
Figure: markup label
Home Contents Top of Page