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

أول مشاركة

مغلق
بدأه عنق الزجاجة في 5 أغسطس 2001 · 16 رد · 2,800 مشاهدة · في قسم المواضيع الهامة في قسم السي /سي++
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

حياكم الله أخواني ، وهذه أول مشاركة لي معكم ، فبالصدفة وصلت إليكم عن طريق موقع الردادي ، وقد شدني حسن تنظيم المنتدى واشتماله ، ودي أشارككم بس أعتقد مشاركاتي كلها أسئلة :( ، أرجو منكم ومن الأخ مشرف القسم تحملني ، والله يكتب أجركم .

ودي من الأخ المشرف وكل من لديه المعرفة شرح بسيط جداً جداً - يتخلله الكود البسيط - لكود إظهار نافذة تحت نظام ويندوز طبعاً باستخدام MFC ، ودي أعرف التالي .

أنا مبرمج في فيجوال بيسك ، ودي أقول اللي أريده بالفيجوال بيسك وانتم الله يعينكم تفهمون علي :( .

في الفيجوال بيسك لو أردت إظهار كلمة بسيطة فما علي ، هو إدراج أداة عنوان ثم كتابة بعض النصوص فيها .

ما أريده هو عمل هذه النافذة بالفيجوال سي ، بعد الأخذ في الاعتبار أن المعالج AppWizard قد انتهى والمحرر جاهز ، طبعاً الفورم هو نوع من الكلاس يتكون من عدد من الأحداث والخصائص ، ودي إن هذه المعلومات المشتته في رأسي ، يقوم الإخوة مع الشكر الجزيل بتنظيمها والإضافة عليها

وتقبلوا خالص تحياتي

#2

الصراحه يا أخي لم أفهم القصد الذي تريده .

ياليت تضع لنك للكود المصدري لما ترديه بالغة الفيجوال بسيك

لعلني أستطيع مساعدتك .

#3

شكراً يا أخي لردك .

ما أردته هو نافذة تحتوي على أداة عنوان تحتوي على أي نص ، في الفيجوال بيسك نكتب :

Label1.Caption="VC++"

آمل المساعدة :) ، والشكر للجميع

#4

يالربع ما يصير :( ، عطونا وجه ولو شوي :(

#5

هنا أكثر من طريقه منها ما يلي :-

1- إذا كان المتغير المرتبط بعنصر التحكم هو CString فيكون الكود التالي :-

Lable1 = _T("VC++");
UpdateData(FALSE);

2- أو يكون المتغير من نوع control أي CStatic فيمكن أن تكتب

Lable1.SetWindowText(_T("VC++"));

ملاحظه :- أنا أفترض أنك تستخدم مكتبات MFC و يمكن تحديد نوع المتغير من ClassWizard

#6

مشكور يا أخي ، بس ودي أعرف وش وظيفة UpdateData مع الشكر :)

أخوكم .

#7

السلام عليكم.

الأخ "عنق الزجاجة" : إن وظيفة التابع UpdateData() هي إجراء عملية Syncronization بين الأداة Control و بين المتحول المربوط مع هذه الأداة و هو يحتاج بارامتر واحد فقط من نوع Boolean أي قيمته إما TRUE أو FALSE فعندما نريد تحديث الأداة بالقيمة الموجودة في المتحول المربوط معها نستدعي التابع UpdateData() و ببارامتر مساوي إلى FALSE و عندما نريد العكس ( أي تحديث المتحول المربوط مع الأداة بالقيمة الموجودة حاليا في الأداة ) فإننا نستدعي التابع UpdateData() و ببارامتر مساوي إلى TRUE أو يكفي استدعاء التابع بدون بارامتر لأن هذا التابع له قيمة افتراضية للبارامتر مساوية إلى TRUE فإذا لم تمرر أي بارامتر فإنه سيعتبر البارامتر مساويا إلى TRUE و في المثال الذي كتبه الأخ Smart Star فإن العبارة:

Lable1 = _T("VC++");

استخدمت لتحميل قيمة معينة في المتحول المربوط مع الأداة , ولنقل هذه القيمة إلى الأداة استخدمنا التعليمة:

UpdateData(FALSE);

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

مع التحيات.

#8

شكراً لكم جميعاً .:):):)

لو أردت إظهار الوقت والتاريخ على نفس الأداة ، ما هو الكود اللازم مع الشكر ؟

#9

السلام عليكم.

لاظهار الوقت و التاريخ استخدم الشيفرة التالية :

CTime time= CTime::GetCurrentTime();
label = time.Format("%A %d %B %Y %H:%M:%S");
UpdateData(FALSE);

و كما ترى فقد تم استخدام CTime وهو Class خاص من أجل التعامل مع الوقت و التاريخ في MFC و صرحت عن متحول time من نوع CTime و حصلت على الوقت و التاريخ الحاليين باستخدام التابع GetCurrentTime() و من ثم قمت بعملية تحويل المعلومات الموجودة ضمن time إلى نص عن طريق التابع Format حيث:

%A تدل على اسم اليوم من الاسبوع.

%d تدل على اليوم من الشهر.

%B تدل على اسم الشهر.

%Y تدل على السنة.

%H تدل على الساعة.

%M تدل على الدقائق.

%S تدل على الثواني.

طبعاً يجب أن تنتبه إلى حالة الأحرف ( صغيرة أو كبيرة) :):)

مع التحيات.

#10

أشكرك أخوي عادل خياطة على هذه الإرشادات الجميلة واللي ما رايح أنساها لك طول عمري :) .

بس عندي أسئلة :( :

1- ما هي كلاسات MFC ، وكيف أحصل على مرجع بسيط وسهل لاستخدامها .

2- ألا يمكن أن نستغني عن FORMAT في هذا الكود .

3- ألا يمكن استخدام CTime مباشرة من دون تعيين متغير له ، وإذا كان لا يمكن ما هو السبب ؟ .

وأشكرك مرة أخرى وأخرى :) .

تحياتي

#11

السلام عليكم.

أخي " عنق الزجاجة" إن MFC Classes هي عبارة عن مكتبة ضخمة من ال Classes التي تقوم بوظائف عديدة و هي تسهل عملية البرمجة فهي في كثير من الأحيان تكون كافية لكتابة البرامج بدون الحاجة إلى استخدام توابع API و أفضل مرجع هو MSDN و هي موجودة في موقع Microsoft أو يمكنك الحصول عليها على 3CD .

يمكن الاستغناء عن التابع Format في حالتنا و لكن للحصول على القيم المطلوبة ( مثلا اليوم والسنة و الشهر ... الخ ) وذلك عن طريق توابع Get مثل:

GetYear() من أجل الحصول على السنة.

GetMonth() من أجل الحصول على الشهر .... الخ.

و طبعا لا يمكن استخدام CTime مباشرة و السبب بديهي وهو : أين سأخزن القيمة التي يرجعها التابع GetCurrentTime()؟؟

أتمنى أن أكون قد وضحت الأمور.

مع التحيات.

#12

السلام عليكم :) .

أخي عادل وكل الإخوة ، اشكرك من عميق وأرجو من الله أن يجعل ذلك في ميزان حسناتك آمين .

قدرت طال عمرك أظهر التاريخ في TEXTBOX ، بس بصراحة ما قدرت أطلعه في أداة عنوان :( ، وحاولت في إظهاره برسالة MessageBox ، ومشي الحال تمام ، إلا في أداة العنوان ، ما أدري ليش ؟ ، شوف الصورة يمكن تقرب الفكرة .

WINDOWS.GIF

فيه نقطة ثانية ، من ناحية الفيجوال سي لا تحتوي على أداة تايمر مثل الفيجوال بيسك ، ولحل المشكلة - على ما أعتقد - نحتاج الى عمل حلقة بحيث تقوم بحساب الوقت ، مع السماح لكافة الرسائل بالعمل ، أرجو إلقاء الضوء على هذه النقطة بالتفصيل .

وفيه نقطة أخرى ، ألا يمكن استخدام دوال ++C القياسية ضمن MFC ، وإذا كان يمكن ، كيف مع الشكر :):):) .

تحياتي ، وأشكرك على تطويلة بالك معانا ، ولو سمحت أريد عنوان البريد الإليكتروني يا أخ عادل :) .

#13

الواضح أنك تستخدم ويندوز XP ... :)

بالنسبة إلى أداة ال Static أو ماتسميها على الاغلب ب أداة العنوان .. فيجب أن تنتبه إلى أن تعطيها ID مختلف عن IDC_STATIC .. مثلا IDC_STATIC_TIME وهذا يتم طبعا من ال Resource Editor .

طبعا بما أنك استطعت اظهار الوقت في Edit Box فهي نفس الطريقة من أجل الStatic Control .. ولكن أعتقد مشكلتك كما ذكرت في المقطع السابق ..

سوف اشرح وسوف أركز على الصور من أجل سرعة الشرح وأيضا مع كود بسيط في النهاية من أجل أن ترى البرنامج والتعديلات ..

أولا طبعا قم باضافة أداء static عادية وأعطها ID معين كما هو في الصور التالية :

glass_time1.gif

الآن قم باسناد متحول إلى هذه الأداة عن طريق الكلاس ويزارد كما في الصورة التالية :

glass_time2.gif

من شاشة ال MFC Class Wizard ومن الصفحة Member Variables يمكنك اسناد الناحولات إلى العتاصر على ال Dialog .. وطبعا يمكنك اسناد متحول من النوع CStatic وذلك في حالة احببت تغيير خواص الأداة أو تغيير الخط أو تحريكها أو كل ماله علاقة بالأداة حتى أنه يمكن تغيير نصها بتعليمة واحدة كما ذكر الأخ سمارت في اجابته عليك في SetWindowText ..

هنا سوف أسند متحول من نوع CString طبعا يمكن اسناد متحول رقمي وما إلى ذلك ..

glass_time3.gif

الآن من أجل المؤقت .. طبعا لا يوجد أداه مثل الفيجوال بيسك وهذا بسبب أنه إذا لاحظت أن جميع الأدوات في الفيجوال سي هي أدوات قياسية لويندوز أي عبارة عن Common Controls .. أما التايمر في الفيجوال بيسك فهي عبارة عن أداة اضافية وليست قياسية في الويندوز ..

يمكنك الرجوع إلى الفائدة السابعة للأه عبد الرحمن يعطيع العافية في الصفحة :

http://arabteam.nicmatic.com/vb/showthread...3?threadid=2627

عندما تستدعي التابع SetTimer برقم المؤقت في البارامتر الأول وزمن التوقيت في المتحول الثاني بالمللي ثانية و NULL في المتحول الثالث .. فإن ويندوز يرسل رسالة من نوع WM_TIMER إلى نافذتك التي استدعيت لها ال SetTimer هذه الرسالة تأتي بشك دوري بحيث الزمن بين كل رسالتين هو الزمن الذي حددته تقريبا .

أكيد يجب أن تضع تابع لمعالجة الرسائل WM_TIMER وهذا عن طريق ال Class Wizard كما في الصورة التالية :

glass_time4.gif

بعد أن تضع روتين تنفيذ الرسالة ممكن تضع فيه الكود التي تريد تنفيذه كل ثانية مثلا .. في حالتك كود احضار الوقت واسناده إلى المتحول الذي صنعته ومن ثم استدعاء UpdateData بمتحول FALSE .

وطبعا لا تنسى انهاء المؤقت قبل اغلاق البرنامج عن طريق استدعاء KillTimer ..

الكود بشكل كامل موجود في الوصلة :

http://arabteam.nicmatic.com/atassi/glass_time.zip

:)

Coding on the Cloud and for the Cloud!

My Blog

#14

السلام عليكم.

شكرا لك أخي هاني :):) كفيت ووفيت :):)

مع التحيات.

#15

اه نسيت.

هناك نقطة نسيها الأخ هاني الا و هي النقطة الاخيرة حول مكتبات C++ و الجواب هو طبعا فيكفي وضع #include لاسم ملف ال Header في بداية الملف حتى تستطيع استخدام هذه المكتبات.

و بالنسبة لايميلي فهو:

adel_khayata@hotmail.com

بس لا تبعتلي ايميلات كتييييييييييير :):)

عمبمزح:):):)

خود راحتك أخي "عنق الزجاجة:):):)

مع التحيات.

#16

ألف شكرررررررررررر يا أخ هاني ، وموصول الشكر للأخوة عادل وSmart Star والأخ عبد الرحمن .

بصراحة الواحد ما يدري وش يقول عند هولاء الكرام ، ولكن ما عند الله هو خير لكم .:):):) .

ممكن تأذنوا لي - مشكورين بسؤال - :( .

السؤال قمت بالتغيير في خصائص الصندوق ( الفورم ) ووضعت الخاصية Right to Left ، الحاصل ، رفض هذا التغيير ، وقام بإعطائي رسالة الخطأ التالية :

undefined keyword or key name: WS_EX_LAYOUT_RTL

ولما رحت للتعليمات في MSDN ، قام بإعطائي الحل التالي

open MCLMFCIncludeAfxRes.h and add the following include directive: 

#include

سويت كل هذا الشفلات ، وما زال الخطأ موجوداً :o ؟ ، ما ذا أعمل .

ودي أسأل عن سبب تغيير ID لأداة العنوان ، ولماذا لم يقبل بالإسم الافتراضي ؟ .

ولماذا كل هذه الإقتراحات لـ ID لأي أداة ، علماً أنها تبدأ ببادئات معينة ، فهل من توضيح حول هذه النقطة مع الشكر الجزيل للجميع :):):) .

تحياتي وشكري الجزيل للجميع ومن الأعماق .

أخوكم

#17

السلام عليكم.

أخي "عنق الزجاجة" : لحل مشكلة Right To Left يكفي أن تضيف السطر التالي إلى برنامجك و هو :

#define		WS_EX_LAYOUT_RTL		0X00400000L

و بالنسبة لسؤالك الثاني : لاحظ أنه كلما تضع أداة Static Text فإن ال ID حقها هو IDC_STATIC و ذلك لأنه غالبا ما تكون هذه الأداة لعرض نص ستاتيكي أي ثابت و بالتالي لاداعي لحجز معرفات إضافية و لكن عندما تحتاج إلى تغيير النص الموجود في هذه الأداة بشكل ديناميكي فعليك تغيير المعرف إلى أي قيمة أخرى ( طبعا غير محجوزة مسبقا) أو يمكنك استخدام التابع SetWindowText مباشرة كما ذكر سابقا.

و بالنسبة للبادئة في كل معرف فهي ليست اجبارية و لكنها تدل على نوع الأداة التي تشير إليها فمثلا:

البادئة IDC تعني Identifier Control و

IDD تعني Identifier Dialog و

IDB تعني Identifier Bitmap و

IDS تعني Identifier String ... الخ

مع التحيات.

هذا الموضوع مغلق.

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