السلام عليكم,
سنتكلم هنا عن كيفية برمجة نافدة من نوع SDI .
وسنقوم بثلاثة مراحل :
المرحلة الأولى سنضع فيها الكود الأساسي لهده النافدة.
المرحلة الثانية سنزيد فيها إيقونة ونغير لون النافدة
المرحلة الثالثة سنزيد فيها menu .
لكي نبدأ نفتح مشروع من نوع windows لا نختار MFC ونختار مشروع فارغ ونزيد فيه ملف فارغ ونملأه كما يلي:
أولا نزيد الملف الرأسي : #include<windows.h>
بعد هدا يأتي السطر التالي:
LRESULT CALLBACK WndProc(HWND ,UINT ,WPARAM ,LPARAM );
وهنا سنعرف الدالة التي ستقوم بتحليل الرسائل الموجهة للوندوز وسنعود إليها من بعد :
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpCmdLine,int nCmdShow)
هنا نبدأ بالدالة winmain وهده مثل main في الكنسول أي ستحدد نقطة بداية البرنامج وهي سترسل لنا بارامترات منها :
HInstance وهو ليس إلا رقم من 32 بايت والوندوز أعطته هدا النوع ليمكن تفرقته مع الآخرين وهو ليس إلا عنوان الداكرة التي سيوضع فيه البرنامج وغالبا ما يكون 400000 بالهيكس.
HPrevInstance تعني الإنستنس السابقة إدا ما كانت نسخة من البرنامج شغالة من قبل
LpCmdLine هده ستدل على المعلومات الإضافية التي يمكن أن نعطيها للبرنامج من خلال Command Line.
وأخيرا nCmdShow كيف ستضهر الشاشة.
بعد هدا يجب ملء structure من نوع WNDCLASSEX وهي تحتوي على 12 عنصرا ويجب إعطاؤها وهي كثيرة ومتنوعة ويمكن أن نستعمل ما يلي وإدا أردنا أشياءا أخرى يمكن أن نبحث عن ما نريد وهنا لا يمكن أن أعطي كلها لأنها كثيرة. والعناصر كالتالي .
1 - cbSize وهو طول structure وسنعطيه sizeof(WNDCLASSEX)
2 – style نعطيه 0 ويعطينا نتيجة في كل الحالات
3 – lpfnWndProc عنوان الدالة التي تقوم بتحليل الرسائل ونعطيها فقط اسم الدالة الدي اخترناه وفي مثالنا سيكون مثلا WndProc
4 – cbClsExtra هدا أيضا سنعطيه 0
5 – cbWndExtra 0 أيضا
6 hInstance نعطيه الإنستنس اللي في WinMain
7 – hCursor نعطيه مثلا الكرسور من نوع السهم وسيكون LoadCursor(NULL,IDC_ARROW)
8 – hbrBackgroundهو لون النافدة لكي نعطيه ألوان الوندوز سيكون
(HBRUSH)(COLOR_WINDOW+1)
9- lpszMenuName سنعطيه 0 لأننا لا نريد الآن أي Menu
10- lpszClassName نعطيه أي اسم سنعرف به هده class
11- hIcon نعطيه الإيقونة وهنا سيكون 0 في البداية لأننا لا نريد إيقونة
12 hIconSm كدلك الإيقونة من النوع الصغير وستكون 0 أيضا
وبعدما نملأ هده الستراكت التي نكون سميناها مثلا wndcl
نقوم بتسجيل الكلاس كما يلي : RegisterClassEx(&wndcl)
إدا نجحت المهمة ستعيد لنا الدالة شيء مختلف عن الصفر و0 في حالة خطء ما ونفترض هنا أن الأمور كلها تمام.
وبعد التسجيل نخلق النافدة ب CreateWindow(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11)
سيكون لها 11 بارامتر كالتالي:
P1 ليس إلا اسم الدي أعطيناه للكلاس السابق أو الإسم الدي أعطيناه ل lpszClassName
P2 يكون الإسم الدي نريد أن نعطيه للنافدة.
P3 سيكون Style وهناك العديد منه ويمكن اختيار ما نشاء و WS_OVERLAPPEDWINDOW فيه مجموعة تعطي الأكثر استعمالا
P4 P5 و P6 و P7 سيكونوا هم إحداثيات النافدة x و y عرض وطول الشاشة ويمكن أن نعطيهم القيمة CW_USEDEFAULT إدا كنا لا نريد وضعا محددا.
P8 هو هاندل الأب وبما أن النافدة هنا هي الأب سنعطيه NULL
P9 سيكون Menu إدا أردنا Menu آخر أو مختلف عن الدي أعطيناه في الكلاس وفي مثالنا يكون NULL
P10 يكون الإنستنس hInstance
P11 سيكون lpParam وهي معطاة إضافية نرسلها إلى النافدة إدا أردنا دلك وسنعطيها NULL لأننا لا نريد إعطاء أي إضافة
إدا نجحت هده ستعطينا الخاندل للنافدة التي خلقناها وستعطي مثلا HWND hWnd
بعد هدا نضهر النافدة باستعمال ShowWindow(hWnd,nCmdShow) علما أن hWnd هو الهاندل المرجع من الدالة CreateWindow
بعد هدا نقوم بتحديث النافدة UpdateWindow(hWnd)
والآن ندخل في دوامة الرسائل كما يلي :
while(GetMessage(&msg,NULL,0,0)) حين تكون رسالة
{
TranslateMessage(&msg); يمكن أن نقول أن هدا سيشرح الرسالة أو يتعرف عنها
DispatchMessage(&msg); يرسل الرسالة إلى من يهمه الأمر
}
انتهينا من جانب WinMain والآن ندخل دالة التحليل للرسائل. في هدا المثال لن نقوم إلا بتحليل رسالة واحدة وهي عندم ننهي البرنامج.والدالة تكون دائما كما يلي:
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wpa,LPARAM lpa)
طبعا يمكن أن نختار اسمها كما نريد ولكن يكون نفس الإسم اللي في الكلاس.
البارامتر الأول هو هاندل النافدة.
الثاني هو رقم الرسالة التي وصلت.
الثالث والرابع هما تعريفات إضافية تتغير حسب الرسالة.ويمكن أن ننضر في الكود كيف نحلل انهاء البرنامج ودلك بتحليل الرسالة WM_DESTROY أو هدم النافدة وهنا سنرسل أو بالأخص نضع رسالة تسمى PostQuitMessage(0) وهده تتطلب بارامتر واحد هو كود الإنتهاء وهنا نعطي 0 لهدا الكود.
وبما أنه ستصل رسائل متعددة فكل الرسائل التي لم نحللها سترسلها إلى الدالة DefWindowProc(hwnd,msg,wpa,lpa)
وبعد هدا ستكون لنا نافدة لا يشتغل فيها شيء إلا مغادرتها.
وفي الجلسة القادمة سنغير بعض الأشياء وسنزيد إيقونات وMenu .
في الملف المرفق المشروع لبرمجة نافدة في أبسط حالاتها.
إلى اللقاء .
