السلام عليكم
لقد تعلمنا في الدرس الأول كيفية تثبيت مكتبة ال wxWidgets على اجهزتنا سواءا كانت تحتوي على نظام تشغيل وندوز او لينكس.
الان سنقوم بعمل برنامج بسيط جدا لتجربة عمل المكتبة و هو البرنامج المعتاد Hello world
المتطلبات:
1) فهم جيد للمبادئ البرمجية الغرضية التوجه OOP
2) فهم بعض ال Preprocessor directives
3) معرفة بعض المعلومات عن المكونات المستخدمة في GUI
الان, تحت بيئة برمجتك المفضلة, قم بعمل مشروع جديد wxWidgets project و قم بتسمية هذا المشروع HelloWorld
انا قمت بإستخدام Code::Blocks على بيئة اللينكس لعمل المشروع الجديد و قامت بيئة التطوير هذه بتجهيز 4 ملفات لمشروعي الجديد. (لاحظو انه هذا الترتيب بختلف من بيئة لأخرى)
Header Files: 1) HelloWorldApp.h 2) HelloWorldMain.h Sources: 1) HelloWorldApp.cpp 2) HelloWorldMain.cpp
بالنسبة لهذا الترتيب, فمن المعروف ان لغة السي++ تستوجب عمل ملف هيدر يقوم بتعريف جميع أعضاء الكلاس الجديد (Methods, Data Members) بحيث نقوم بتعرف كل ما هو ضروري للكلاس في ملف الهيدر و من ثم عمل ملف cpp يحتوي على الكود. عمل ملف ال cpp هو إختياري لانه من الممكن يكون كل كود الكلاس في ملف الهيدر لكن لأهداف الترتيب و فصل التعريف عن التنفيذ سنقوم بإتباع وسلة إستخدام ملف ال cpp
خلينا نفحص الملفات واحد تلو الأخر:
HelloWorldApp.h
/***************************************************************
* Name: HelloWorldApp.h
* Purpose: Defines Application Class
* Author: Rakan Alhneiti (rakan.alhneiti@gmail.com)
* Created: 2008-06-21
* Copyright: Rakan Alhneiti (www.it-jo.net)
* License:
**************************************************************/
#ifndef HELLOWORLDAPP_H
#define HELLOWORLDAPP_H
#include <wx/app.h>
class HelloWorldApp : public wxApp
{
public:
virtual bool OnInit();
};
#endif // HELLOWORLDAPP_Hلاحظو معي انه هذا الملف بسيط جدا, حيث يقوم بضمين ملف wx/app.h و الذي يحتوي على الكود اللازم لعمل برنامج كامل جديد. هذا الكلاس يمثل البرنامج الذي نريد عمله, و من مهام هذا الكلاس هو تنفيذ جزء ال Message Loop المعروفة, تزويع الرسائل على النوافذ المستخدمة, حفظ جميع الإعدادات التي تهم البرنامج ككل.
طبعا هنا نرى ان الfunction الوحيد المستخدم هو OnInit و هو عبارة عن دالة يقوم البرنامج بإستدعائها لنا لنقوم بتنفيذ كود له علاقة بإعطاء قيم جديدة للأدوات و الأعضاء الموجودة في برنامجنا.
نشوف ملف ال cpp:
/*
الكود التالي هو
Preprocessor directive
يقوم بالتأكد مما اذا كان مشروع يريد إستخدام ال
Precompiled headers
و هي إستخدام ملفات الهيدر المترجمة, هذه الخطوة تزيد في سرعة عملية الترجمة للبرنامج
انا في مشروعي لانه صغير, اخترت عدم إختيارها لذلك نرى ان شرط ال
ifdef
لن يتحقق و بالتالي لن يتم تضمين ملفات
wx_pch.h
في مشروعنا هذا
*/
#ifdef WX_PRECOMP
#include "wx_pch.h"
#endif
/*
هنا يتم التحقق من المترجم المستخدم
*/
#ifdef __BORLANDC__
#pragma hdrstop
#endif //__BORLANDC__
/*
لاحظو معي هنا ان هذا الكود التالي سيقوم بتضمين ملف الهيدر الذي رايناه و هو
HelloWorldApp.h
و الذي يتمضن تعريف كلاس البرنامج بالإضافة الى تضمين كلاس النافذة الرئيسية في المشروع و التي سنراها لاحقا
*/
#include "HelloWorldApp.h"
#include "HelloWorldMain.h"
IMPLEMENT_APP(HelloWorldApp);
/*
الكود السابق يحتوي على ما يسمى بماكرو و التي تقوم بتسجيل الكلاس الخاص بالبرنامج لعملية ال dynamic construction الخاصة بما يسمى ب
Run-time type identification, سنقوم بالتحدث عن هذا في دروس لاحقة
*/
/*
في الكود التالي نقوم بكتابة الكود اللازم لعملية ال Initialization للكلاس عند إستدعاء البرنامج لهذه الدالة.
*/
bool HelloWorldApp::OnInit()
{
//هنا نقوم بعمل object من كلاس النافذة الذي سنراه لاحقا بالإضافة الى إعطاء هذه النافذة عنوان معين
HelloWorldFrame* frame = new HelloWorldFrame(0L, _("wxWidgets Application Template"));
//و من ثم نقوم بإظهار هذه النافذة
frame->Show();
return true;
}اتوقع كل الموجود حاليا مفهوم مع التحفظ, لكن لا تخافو, لاننا لا يجب علينا معرفة كل شيء حتى نقوم بالبرمجة بهذه المكتبة, فيمكن معرفه كل ما كتب لاحقا بعد دراسة اشياء متقدمة عن المكتبة و فهم طريق عملها بشكل صحيح.
كود النافذة:
الان لنرى الكود الموجود في
HelloWorldMain.h
/*
الكود التالي معروف بإسم Header Inclusion Guard
*/
#ifndef HELLOWORLDMAIN_H
#define HELLOWORLDMAIN_H
#ifndef WX_PRECOMP
#include <wx/wx.h>
#endif
//نقوم بتضمين ملف كلاس البرنامج
#include "HelloWorldApp.h"
/*
هنا قمنا بعمل كلاس جديد يتورث كل خصائصه من كلاس
wxFrame
او كلاس النافذة
*/
class HelloWorldFrame: public wxFrame
{
public:
//constructor
HelloWorldFrame(wxFrame *frame, const wxString& title);
//destructor
~HelloWorldFrame();
private:
//هذا الكود خاص بالأحداث, يمكن غض النظر عنه لانه متقدم و لا يوجد داعي للتحدث عنه مبدئيا
enum
{
idMenuQuit = 1000,
idMenuAbout
};
void OnClose(wxCloseEvent& event);
void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
/*
الإستدعاء التالي هو ايضا يسمى ماكرو و التي تقوم بتعريف جدول خاص بالأحداث الخاصة بالبرنامج و التي سنرى كيفية إستخدامها في دروس لاحقة, مبدئيا يمكن غض النظر عن هذه و ما يليها من كود
*/
DECLARE_EVENT_TABLE()
};
#endif // HELLOWORLDMAIN_Hو للبقية حديث, الان انا نعسان و لازم انام :P
تصبحو على خير
