الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

برمجة النوافد في الوندوز

بدأه chik في 23 ديسمبر 2003 · 6 رد · 2,125 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم,

سنتكلم هنا عن كيفية برمجة نافدة من نوع 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 .

في الملف المرفق المشروع لبرمجة نافدة في أبسط حالاتها.

إلى اللقاء .

Nafida.ZIP

#2

السلام عليكم,

هنا سنأخد برنامج النافدة السابق ونزيد فيه ليرسم لنا إيقونة نختارها.

نزيد resource إلى مشروعنا ونضيف إيقونة وفي الرسورس يمكن أن نعطيها اسم فهدا يمكن أن يكون على شكل كتابة أو رقم ID . هنا سنعطيها اسم على شكل كتابة والإسم هنا يجب أن يوضع بيت الشرطتين " وكمثال سنسميه "MYICON" .كل ما سنغير الآن هو القيمة hIcon في الستراكت WNDCLASSEX وسنكتبها كما يلي :

wndcl.hIcon=LoadIcon(hInstance,"MYICON")

ونعلم أن الدالة ستحمل من الرسورس الإيقونة من البرنامج الدي هو له hInstance وهنا لن يكون إلا برنامجنا هدا وسيحمل الإيقونة التي تحمل الإسم MYICON .

هدا وإدا كنا قد أعطيناها الإسم على شكل رقم ID ولتحويل هدا الرقم لإلى كتاية نستعمل الماكرو التالية MAKEINTREASOURCE وهنا ستكون الكتابة كما يلي :

wndcl.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(ID))

وفي الملف المرفق ستجدون الكود لهدا.

إلى اللقاء.

Nafida2.ZIP

#3

السلام عليكم,

في المثال السابق لقد غيرنا أيضا لون النافدة ولم أتكلم عليه وهدا يتم فقط بتغيير brush الدي نريد استعمالها ولهدا استعملنا الدالة CreateSolidBrush(RGB(255,0,0,0)) فهدا يعني أننا سنأخد brush مملوءة او ملتصقة ولونها نحدده بالماكرو RGB وهده الأخيرة تعني الألوان الرئيسية وهي تدل على :Red Green Blue وهده الماكرو تتطلب 3 بارمترات من 0 إلى 255 وكل واحد يدل على لون معين ويمكن خلط الألوان لنحصل على بقية الألوان الأخرى.

وفي هدا المثال سنأخد براش أخرى ولكن ليست مملوءة

سنزيد هنا menu فس الرسورس ونعطيه اسم من نوع كتابة مثلا "MYMENU" وكما سبق إدا أعطيناه رقما نستعمل الماكرو الدي دكرناها في المثال السابق.

نزيد ما نري في menu كما جاء في المثال مثلا وهنا كل SubMenu سيكون له رقم ID الدي سيميزه وهده الأرقام يتكون معرفة في الملف resource.h الدي سينشؤه البرنامج لدى يجب إدخاله كملف رأسي في برنامجنا إدا كنا سنستعمل هده الأرقام وفي مثالنا هدا سنستعملها.

كل ما سنزيده في البرنامج هو الكود الدي سيعمل حين ننقر على شيء في المينيو.

ويجب أن نعرف أنه حين ننقر على شيء في هدا المينيو فإن النضام يبرسل إلى النافدة رسالة من نوع WM_COMMAND وهي نفس الرسالة التي يرسلها إدا نقرنا على Button ونعلم أيضا أنه في هده الحالة فإن 16 بايت الأولى من البارامتر WPARAM سيحتوي على رقم ID ل MenuItem الدي نقرنا عليه.وهنا يمكننا إدن أن نكتب الكود حسب تحليل هده الرسالة.

والملف المرفق يحتوي على هدا المثال.

إلى اللقاء.

Nafida3.ZIP

#4

يا سيدي الله يوفق بشغلك ....... تبذل جهد كبير مقابل لاشيء !!!! ؟؟؟؟ سوى مرضاة الله ............. روح موفق مرة ثانية

مدونتي

http://mbnoimi.net

#5

السلام عليكم ,,

بارك الله فيك أخي chik مجهود تشكر عليه ,, لايجازيك به البشر ,, لكن من سيجازيك به هو رب البشر ,, "يابختك :) "

وفقكم الله جميعا ,,

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#6

مشكور اخي كثير لكن يحدث معي هدا الخطا عند عمل كومبايل

( في فيجوال سي ++)

--------------------Configuration: Nafida - Win32 Debug--------------------

Compiling...

Nafida.cpp

Linking...

LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main

Debug/Nafida.exe : fatal error LNK1120: 1 unresolved externals

Error executing link.exe.

Nafida.exe - 2 error(s), 0 warning(s)

وعند اضافة المكتبة

LIBCD.lib

يحدث التالي

--------------------Configuration: Nafida - Win32 Debug--------------------

Linking...

LINK : fatal error LNK1104: cannot open file "LIBCD.libcomdlg32.lib"

Error executing link.exe.

Nafida.exe - 1 error(s), 0 warning(s)

فما الحل في رايك ارجو الاجابة

يااخي لان الموضوهدا تبع برمجة النوافد هو الوحيد اللي ماني فاهمو

في السي بلس بلس

وايضا ادا كان عندك كتب عن هدا الموضوع يرجى افادتي

و جزاك الله كل خير

#7

اخي الكريم

اليس من الافضل استخدام مكتبة ال mfc ؟

مواضيع مشابهة