پیاده سازی پخش کننده موزیک با زبان C و GTK-2.0 ( قسمت دوم )

بسم الله الرحمن الرحیم

سلام

خب رسیدیم به قسمت دوم پروژه .

در قسمت قبل

https://virgool.io/CodeLovers/%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D9%BE%D8%AE%D8%B4-%DA%A9%D9%86%D9%86%D8%AF%D9%87-%D9%85%D9%88%D8%B2%DB%8C%DA%A9-%D8%A8%D8%A7-%D8%B2%D8%A8%D8%A7%D9%86-c-%D9%88-gtk-20-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-rjlflylgfiht

تقریبا رابط کاربری برنامه آماده شده بود اما رابط کاربری منو نداشت , و قرار بود تو این قسمت منو رو هم به برنامه اضافه کنیم .

برای اینکار اول از طریق منو ...File > New > Files و گزینه C/C++ Header در codeblocks یک فایل به نام menubar.h ایجاد می کنیم . بعد از همین مسیر اما از طریق گزینه C/C++ Source یک فایل به نام menubar.c هم ایجاد می کنیم . وقتی اینکار ها رو انجام دادیم می بینیم ساختار پروژه تغییر کرده و یک پوشه Headers به پروژه اضافه شده و فایل menubar.h در این پوشه قرار گرفته . همین طور فایل menubar.c هم طبق انتظارمون در پوشه source ایجاد می شه .

قبل اینکه بریم سراغ ایجاد منو بهتره یک نگاهی به عکس زیر داشته باشیم تا ساختار منو در gtk2 تا حدودی دستمون بی یاد .

ساختار منو در GTK-2.0
ساختار منو در GTK-2.0

برای ایجاد منو اول داخل فایل menubar.h متغیر ها و توابعی رو که نیاز داریم تعریف می کنیم . صد البته , هر هدری رو هم که نیاز داریم باید تو این فایل اینکلود کنیم .


تا اینجا کار به جز متغیر accel_group بقیه متغیر ها با توجه عکس (ساختار منو در GTK-2.0) کاربردشون معلومه .

متغیر accel_group هم برای اینه که یک سری short cut به برنامه اضافه کنیم (‌ ما از این متغیر برای اضافه کردن short cut Ctrl+Q به برنامه اضافه می کنیم )‌

تابع create_menu_bar هم که موقع تعریفش متوجه کاربردش می شیم .

حالا وقت اینه که بریم سراغ فایل menubar.c

اول از همه یک نگاه کلی به کد هایی که داخل این فایل داریم میکنیم .

داخل تابع create_menu_bar ما منو خودمون رو ایجاد می کنیم بعد داخل فایل main.c اون رو فراخوانی می کنیم . اما اینکه منو رو چطور ایجاد می کنیم پیشنهاد من اینه از این لینک کمک بگیرید .

http://zetcode.com/gui/gtk2/menusandtoolbars/

حالا نوبته اینه یک سری تغییرات در فایل main.c ایجاد کنیم تا منو به برناممون اضافه بشه .

بعد از خط (main_v_box = gtk_vbox_new(TRUE,0 کد های زیر رو اضافه می کنیم .

create_menu_bar();
// منو رو ایجاد می کنیم
gtk_box_pack_start(GTK_BOX(main_v_box),menu_bar,FALSE,FALSE,0);
// منو رو به برنامه اضافه می کنیم
gtk_window_add_accel_group(GTK_WINDOW(app),accel_group);
// میانبری که قراری تعریف کنیم رو به برنامه اضافه می کنیم

قبل تابع ()gtk_main هم کد های زیر رو اضافه می کنیم :‌

g_signal_connect(quit_mi,&quotactivate&quot,G_CALLBACK(close_app),NULL);
gtk_widget_add_accelerator(quit_mi, &quotactivate&quot, accel_group,
                                               GDK_q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
g_signal_connect(app,&quotdelete_event&quot,G_CALLBACK(close_app),NULL);

داخل کد بالا تابعی که مهمه یک خورده دربارش توضیح بدم تابع g_signal_connect

ساختار GTK به این صورته که وقتی یک event رخ می ده (مثلا دکمه ای فشرده می شه , آیتم منو فعال میشه و ... ) ما می تونیم از طریق این تابع بگیم در صورت رخ دادن این رخداد برنامه چه کاری رو انجام بده . مثلا کد (g_signal_connect(app,"delete_event",G_CALLBACK(close_app),NULL

زیر به این صورت عمل می کنه وقتی برنامه اصلی (‌app) بسته بشه (مثلا از طریق بستن پنجره ) تابع close_app رو فراخوانی می کنه (‌ اگه بخوایم به تابع close_app پارامتری ارسال کنیم به جای NULL پارامتر مورد نظر رو می نویسیم که یک سری قواعد خاص خودشو داره )‌

اما اینکه تابع close_app کجا تعریف شده .

اول از همه مثل ایجاد menubar.h و menubar.c فایل های public_callback_fun.c و public_callback_fun.h ایجاد می کنیم و تابع close_app رو در فایل public_callback_fun.h معرفی و در فایل public_callback_fun.c تعریف می کنیم .

public_callback_fun.h
public_callback_fun.h
public_callback_fun.c
public_callback_fun.c

در آخر حواسمون باید باشه کد های زیر رو هم به اول فایل main.c اضافه کنیم .

#include &quotmenubar.h&quot
#include &quotpublic_callback_fun.h&quot

نتیجه کار ما تا اینجا چنین چیزی می شه :‌

https://aparat.com/v/mz3oL

همین طور که می بینید منو هم به خوبی به برنامه اضافه شده .

کد پروژه روی گیت رو هم آپدیت کردم

https://github.com/Abolfazl-Dalily/DMusicPlayer

خب به آخر قسمت دوم رسیدیم . حالا باید تصمیم بگیریم برای قسمت بعد کدوم قست پروژه رو جلو ببریم

چند تا کار می شه کرد یا برای آیتم های منویی که ساختیم اکشن های مناسبش رو هم ایجاد کنیم ( مثلا وقتی کاربر از منو audio گزینه file رو انتخاب کرد پنچره انتخاب فایل باز بشه و بتونه یک فایل رو انتخاب کنه ) یا اینکه بریم دنبال یک کتابخانه برای کار با فایل های صوتی بگردیم و اونو به پروژه اضافه کنیم .

من که فعلا نظر خاصی ندارم اگه شما نظری دارید خوشحال میشم بشنوم.


سایر نوشته های من :

https://virgool.io/@abolfazldalily/%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%AD%D9%84-%DA%A9%D9%86%D9%86%D8%AF%D9%87-%D8%B3%D9%88%D8%AF%DA%A9%D9%88-99-%D8%A8%D8%A7-%D8%B2%D8%A8%D8%A7%D9%86-c-%D9%88-gtk2-0-laxa83pwd8pf
https://virgool.io/@abolfazldalily/%D9%86%D9%88%D8%B4%D8%AA%D9%86-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%A8%D8%A7%D8%B2%DB%8C-snake-%D8%A8%D8%A7-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%DB%8C-%D9%BE%D9%84%D8%A7%D8%B3-%D9%BE%D9%84%D8%A7%D8%B3-nc2rm6rwwplz