الدرس الاول visual c++ ...

الكاتب : bassam4000   المشاهدات : 2,650   الردود : 9    ‏2003-08-27
      مشاركة رقم : 1    ‏2003-08-27
  1. bassam4000

    bassam4000 عضو

    التسجيل :
    ‏2003-05-25
    المشاركات:
    140
    الإعجاب :
    0
    السلام عليكم ورحمة الله وبركاتة
    اخواني الاْعزاء
    اليوم سنبداء باليوم الاول من تعلم الفيجوال c++
    ويجب الانتباه الى هذة الدروس هي ترجمة لكتاب تعليم الفيجول c++ حصلت علية من الانترنت مش من راسي لذا وجب التنوية الترجمة كانت مجهود متواضع مني
    ملاحظة :- يمكن الصور المرفقة ماتظهر بالارتباطات التشعبية لاني قليل خبرة في هذا المجال وعلى من عندة فكرة عن كيفية اظهار هذة الصور فليعلمني .....


    اليوم الأول التالي


    تعلم visual c++ في 21 يوــــــــــــــــــم

    اليوم سوف نتعلم او تأخذ فكرة عن بيئة الـvisual c++ وبعض الأدوات المقدمة من اجل بناء
    التطبيقات..واليوم سوف نتعلم التالي :
    * المساحة الأساسية في بيئة الـvisual c++ .
    *معالج التطبيق application wizard ,وكيف يمكنك استخدامة لبناء القاعدة التحتية لتطبيقك المزمع .
    *رسام الحوار dialog painter , وكيف يمكنك استخدامة لرسم نافذة حوار ..
    *صنف المعالج class wizard و وكيفية استخدامة كملحق وظيفي في نافذة التطبيق..
    1- the visual c++ development envirment: .
    لكل مساحة هدف محدد في بيئة الـvisual c++ . يمكن تعديلها حسب احتياجاتك .
    . 2- the workspace :
    عندما تبداء فبجوال c++ هي مساحة سوف تظهر لك تعرف بمساحة العمل وهي المفتاح لك للمرور عبر القطع ولاجزاء المختلفة من مشروعك المطور وهي تسمح لك لترى أجزاء التطبيق بثلاث طرق مختلفة :
    *class view تسمح لك باجتياز والتعامل مع منبع الشفرة في c++ class level .
    *resource view تسمح لك بإيجاد وتحرير كل من المنابع المختلفة في تطبيقك ومن ضمنها
    نافذة الحوار ,التصميم,الأيقونات ,القوائم .
    *file view تسمح لك لكي ترى وتمر خلال كل الملفات المعمولة في تطبيقك .

    3- the output pane :
    لوحة الإخراج ربما تكون غير مرئية عندما تبداء البرنامج وهي تظهر عندما تقوم بجمعcompile أول تطبيق لك
    وهي تبقى حتى تختار close .
    ولوحة الإخراج تعني أين سيقوم الـdeveloper بتمرير أي معلومات أنت بحاجة إليها ,كذلك مكان العمليات التي
    يقوم بها الـcompiler مثل التصريح statement ,التحذير warning , رسالة الخطاءerror message
    أيضا قيام مصحح الأخطاء فيc++ بعرض كل المتغيرات مع القيم الصحيحة لها متوافق مع خطواتك اثنا الكود
    4- the editor area:
    هي المكان الذي سوف تستخدمة في كتابة الكود وتصميم نوافذ الحوار او الأيقونات ..
    5-Menu bar:
    هناك ثلاثة منها
    *toolbarch01\01fig01.gif theالقياسي تحوي أدوات الفتح والإغلاق والحفظ .......الخ .
    *the wizard bar وهو يسمح بإنجاز عدد من فعالية class wizard بدون فتح الـclass wizard .
    *the ch01\01fig03.gif build minibar وهو يزودك بأغلب الأوامر المستخدمة والشائعة لاستخدام التطبيق واختبارة في حين
    هناك the full build toolbar الذي يسمح لك بالتنقل بين اعدادات البناء المتعددة(مثلا بين تصحيح الأخطاء
    وإطلاق سراح التطبيق ) .

    البدء في أول مشروع لك:
    سوف نقوم بعمل مشروع للتقديم بواسطة زرين بشكل مبدي كما في الشكلch01\01fig04.gif , والشكل
    اتبع الخطوات التالية :
    1- خلق مساحة عمل .
    2-استخدم معالج التطبيقات لخلق إطار عمل .
    3-اعد ترتيب صندوق الحوار الذي فتح بشكل تلقائي بواسطة معالج التطبيقات بشكل مشابة لشكل التطبيق المرغوب
    4-أضف الشفرة .
    5- اعمل أيقونة جديدة للمشروع (التطبيق) .
    التفصيل:
    1- خلق مشروع مساحة عمل..هنا كل تطبيق في الـvisual c++ يحتاج لمشروع مساحة عمل خاص بة
    ومساحة العمل تتضمن الدليل أين سيتم الاحتفاظ بشفرة العمل ..
    لفتح مساحة عمل اتبع:
    1- file .....new..........project tab......MFC App Wizard(exe) .
    2-اطبع اسم للمشروع مثلا (Day1) في the project name file .
    3- click ok.
    استخدام معالج التطبيقات لخلق هيكل التطبيق:
    إن الـApp Wizard يسألك سلسلة من الأسئلة عن ما هو التطبيق الذي أنت في صدد بنأة وماهي الميزات
    الوظيفية التي تحتاجها , وهو يستخدم هذة المعلومات لخلق هيكل للتطبيق الذي يمكنك بشكل فوري من تجميعة
    واستخدامة ..هذا الهيكل يزودك بالبنية التحتية التي تحتاجها لبناء تطبيقك ..سوف ترى ذلك كالتالي :
    *1* الخطوة الأولى في المعالج App تحديد انك تريد إنشاء تطبيق لصندوق حوار ..انقرnext .
    *2*الخطوة الثانية هي قيام المعالج بسؤالك عن عدد الميزات التي تريد تضمينها في تطبيقك . اترك الـActive Xبدون تعليم انقر next .
    *3* في الخطوة الثالثة في الحقل please enter title اكتب ما تشاء hello مثلاً انقر next .
    *4* في الخطوة الرابعة انقر next واترك الخيارات على ما هي علية .
    *5*في الخطوة الأخيرة سوف يريك المعالج الصنف الذي صنعة لك من اجل التطبيق finish لجعل الـApp Wizard
    يولد او ينتج لك هيكل المشروع.
    *6*ستلاحظ ألان بعد إنتاج المشروع ظهور الـworkspace pane .
    *7*ألان اختر من شريط الأدوات build ثم hello.exe buildلكي يتم تجميع المشروع .
    *8*سوف ترى ألان العمليات التي جرت ورسائل أخرى في output pane التي تظهر في الأسفل .
    *9* اختر أيضا build ثم execute hello.exe .
    *10*سيظهر لك المشروع رسالة TODO مع ok & cancel hello في شريط العنوان ..

    تصميم نافذة تطبيقك :
    لتغير التصميم الافتراضي للتطبيق عليك إتباع الخطوات التالية :
    * انقر على زر الـresource view الموجود أسفل نافذة لوحة مسحة العمل workspace pane .
    *اتبع الخطوات في الشكل.. resource tree..
    * نقر مزدوج على IDD_Day1_DIALOG لفتح نافذة تحرير .
    *حدد النص المعروض وامحي بـDelete key .
    *حدد زر الـcancelواسحبة للأسفل او زي ما تشتي .. ثم اعد تغير ا بعادة وليكن مثل الشكلـ.
    * ثم نقر بزر الفارة الأيمن على زر الـcancel لتفتح قائمة pop-upحدد من القائمة المنسدلة خصائص ثم خصائص صندوق حوارproperties dialog .
    *غير قيمة الـcaption إلى &close . الـclose من الزاوية اليسر العليا ..
    *حرك واعد ترتيب أبعاد الـok بنفس الطريقة .
    *ونفس الحال بز الفارة اليمين على ok.....قائمة...انقر خصائص ...في صندوق الذي سوف يظهر غير
    الـID value إلى ID hello...والـcaption إلى &hello ...
    * شغل البرنامج وسترى كيف يظهر ..

    إضافة الكود(الشفرة) إلى التطبيق..
    يمكن إضافة الكود إلى تطبيقك من خلا ل الـclass wizard. يمكنك استخدام الـclass wizard لبناء نافذة رسالةwindow message والتي يمكن او ربما يقوم التطبيق بتلقيها ,من ضمنها الوظائف التي يجب أن تمرر لكي يتم معالجتها .. يمكنك إضافة الشكل الوظيفي للتطبيق بإتباع الخطوات التالية :
    ** لإضافة بعض الأشكال الوظيفية لـزر الـhello بزر الفارة اليمين ومن القائمة المنسدلة اختر class wizard .
    ** ثم حدد الـIDHELLO من Object ID ثم حدد BN_CLICKED انقر عليها مرتين ليظهر لك صندوق صغير يحوي نمط الوظيفةon hello ثم موافق ..
    **ثم بالنقر المزدوج على على on hello من قائمة member function ليظهر لك محرر الكود ضع فية
    تحتOn Hello function..
    Void CHelloDlg::OnHello()
    {
    // TODO: Add your control notification handler code here//
    Message Box("hello . this is my first application!");
    }
    ركز هنا ضروري الـM)) كبيرة في الـMessage Box أيضا الـ B وليسm او b .. ليست مثل الفيجول بيسك (يعني الـc++ تتعرف على كل حرف m M بشكل مختلف في حين الفيجول الحرفين نفس الشيء) .
    بعدين قم بالـcompile( F7) وبعدين run(F5) ..
    الدن بقي أن تضيف بعض الرتوش إلى التطبيق مثل أيقونة للتطبيق و زر للتكبير وآخر للتصغير ..
    *1* إضافة أيقونة :
    1- في لوحة الـworkspace اختر من شجرة الملفات المنسدلة IDR_MAINFRAME
    2-استخدم أدوات الرسم الموجودة لإعادة رسم الأيقونة كما تحب .
    3- قم بالـcompile و الـrun سترى الأيقونة التي صنعتها في الزاوية العليا اليسرى للتطبيق.

    *2* إضافة زري تصغير وتكبير:
    1- حدد صندوق الحوار كله (أي التطبيق الذي نعمل علية) .
    2- بعد بزر الفارة اليمين وقم باختيار dialog properties .
    3-في الصندوق الخصائص الذي سوف يظهر حدد واختر زر الـstyles ومن هناك اختر الـmaximize & minimize .
    س& ج :
    1- كيف أستطيع تغير عنوان الرسالة عند النقر على hello ؟
    جـ: يمكنك ذلك بإضافة السطر التالي إلى الكود
    MessageBox(" hello . this is my first application!",
    "السلام عليكم"); ركز M&B
    2- كيف أستطيع تغير النص في رسالةAbout window ؟
    جـ: هذا يكون موجود في dialogs folder في resource view في workspace pane
    نقر مزدوج على IDD_ABOUTBOX سوف يفتح مصمم صندوق الحوار dialog designer وهنا
    تستطيع تغير ما تريد ..
    انتهى اليوم الأول ......................................bassam4000
     
  2.   مشاركة رقم : 2    ‏2003-08-27
  3. bassam4000

    bassam4000 عضو

    التسجيل :
    ‏2003-05-25
    المشاركات:
    140
    الإعجاب :
    0
    الدرس الثاني visual ++c

    اليوم الثاني
    استــــــــخدام الـcontrols في تطبيقك :



    العديد من الأشياء التي سوف تجدها في كل نافذة تطبيق مثل الـ الأزرار button وصندوق التعليم check box وحقل الكتابة text fields هذة كلها تعرف بالـcontrols اليوم سوف نتعلم :
    *ماهية الـbasic controls في الـvisual c++ .
    *كيف تعطي تصريح او مرفق متغير إلى الـcontrol .
    *كيف تزامن القيمة بين الـcontrol والمتغير .
    *كيف تحدد اوامر المستخدم باجتياز نافذة التطبيق .
    *كيف تؤدي الحدث action بواسطة الـcontrol .
    *كيف تتعامل مع وتغير مظهر الـcontrol في حين التطبيق يشتغل .

    *1* نوافذ السيطرة او التحكم الأساسية(the basic windows controls) :
    العديد من اوامر التحكم القياسية موجودة في نظام التشغيل ويندوز مثل نظام الشجرة المنزلقةslider tree , على العموم اليوم سوف نتعامل مع نصف در زن من الـcontrols التي تكون موجودة في كل نافذة
    تطبيق .
    - النص الثابتstatic text.
    -صندوق النصوصtext box .
    -أزرار الأمر .
    -صندوق التعليمcheck box.
    -radio button .
    -combo box او Drop down list box .
    -إضافة للعديد منها تظهر في شريط الأوامر ..
    *1*النص الثابت static box :
    المستخدم فيما بعد لا يستطيع تغيرة لكن أنت ألان قادر على اختيار ما تريد في مرحلة التكوين .
    فالمستخدم بقراءة فقط .
    *2*صندوق التحرير edit box :
    هذا يسمح للمستخدم ( المستخدم هنا المقصود بة إلي اشترا البرنامج خالص ويشتغل علية أنت المبرمج وليس المستخدم) بإدخال او تغيير النص ..edit box هو واحد من الأدوات الأساسية للسماح للمستخدم بإدخال معلومات محددة التي يحتاجها التطبيق .وهو يقبل النصوص فقط .وليس الأشكال .
    *3*زر الأمر command button :
    يستخدمة المستخدم لتنفيذ بعض الـaction يكون علية كتابة تدل على وظيفة مثل Go كما يمكن أن يحمل صورة كجزء من الزر .
    *4* صندوق التعليم check box:
    وهو مربع الشكل يمكن للمستخدم تعليمة او عدم تعليمة بإشارة صح .وهو يستخدم لتشغيل او إطفاء وظيفة محددة on/off ..
    *5*radio button :
    يكون بشكل دائرة لكي يملى بدائرة سوداء وهو مشابة للـcheck box ولكنة يستخدم لمجموعة من القيم التي تكون في نفس الحالة في نفس التوقيت ..
    *6*combo box :
    وهو عبارة عن صندوق نص مع قائمة من القيم المتغيرة المرفقة وأنت تستخدم الـcombo box لتضمين العديد من الخيارات .
    *7* إضافة control إلى نافذتك :
    المشروع حق اليوم سوف يتضمن العديد من أدوات السيطرة في نافذة واحدة هذا العدد من الأدوات يحوي وظائف مختلفة , ففي أعلى نافذة التطبيق هناك حقل النص حيث سيقوم المستخدم بإضافة النص
    او الرسالة عند الضغط على الزر بجانب حقل النص , والى الأسفل من حقل النص(التحرير )هناك زرين
    اللذان أيضا يؤديان إلى ملء حقل التحرير إما برسالة افتراضية او مسح الحقل , إلى الأسفل منها يوجد
    قائمةdrop-down list box او combo box التي تحوي مجموعة من النوافذ القياسية للتطبيق ز
    عندما يقوم المستخدم بتحديد احد هذة الخيارات فان البرنامج سوف يعمل . next هناك مجموعتين من
    الـcheck boxes التي تظهر الـcontrol التي اخترتها في النصف العلوي كما ذكرنا من قبل زر
    الـcontrols لعرض رسالة مستخدم وcontrols لتشغيل برنامج أخر .
    الجانب الأيسر من الـcheck boxes سوف يفعل او يبطل تفعيل مجموعة من المجموعات التي أنجزتها
    الجانب الأيمن من الـcheck boxes سوف يظهر او يخفي مجموعة من المجموعات التي اخترتها من
    الـcontrols .

    عمل تطبيق جديد وتصميم هيكل لة :
    1*اعمل مشروع جديدAppWizard سميةday2 .
    2*اعمل نفس الاعدادات حق اليوم الأول مع تحدي في عنوان الـdialog title وسميةvisual c++ controls .
    3*بعد تكوين الهيكل , صمم التطبيق بحيث يبدو كما في الشكل ...1)
    4*ادخل الاعدادات كما في الجدول التالي:

    Object Property Setting
    Static Text ID IDC_STATIC
    Caption This is an example of a Visual C++ Application using a number of controls.
    Static Text ID IDC_STATICMSG
    Caption Enter a &Message:
    Static Text ID IDC_STATICPGM
    Caption Run a &Program:
    Edit Box ID IDC_MSG
    Button ID IDC_SHWMSG
    Caption &Show Message
    Button ID IDC_DFLTMSG
    Caption &Default Message
    Button ID IDC_CLRMSG
    Caption &Clear Message
    Button ID IDC_RUNPGM
    Caption &Run Program
    Button ID IDC_EXIT
    Caption &Exit
    Combo Box ID IDC_PROGTORUN
    Group Box ID IDC_STATIC
    Caption Enable Actions
    Group Box ID IDC_STATIC
    Caption Show Actions
    Check Box ID IDC_CKENBLMSG
    Caption &Enable Message Action
    Check Box ID IDC_CKENBLPGM
    Caption E&nable Program Action
    Check Box ID IDC_CKSHWMSG
    Caption S&how Message Action
    Check Box ID IDC_CKSHWPGM
    Caption Sh&ow Program Action
    5*بعد ملء كل هذة الـcontrols في نافذة صندوق الحوار وإعداد كل الخواص حقها اعد فتح خصائص صندوق الحوار من اجل الـcombo box الذي وضعت في النافذة وفي الـdata tab في خصائص صندوق الحوار وادخل ما يلي هناك باستخدام ctrl&enter key :
    notepad, paint, solitaire كما في الشكل) .

    6*تعيين الأمر control tab order :
    ألان لديك كل الـ controls على النافذة حقك الآن عليك انن تتأكد من أن الـtab key في لوحة المفاتيح شغال للسماح للمستخدم أن يتنقل بواسطتة بين الأزرار الموجودة في النافذة ..يمكن عمل ذلك كالتالي :
    *إما أن تحد النافذة كلها او زر control واحد في مساحة العمل كما في الشكل)
    *اختر layout ........tab order ...... من القائمة سوف ترى أرقام بجانب كل واحدة من الـcontrol
    *استخدم الماوس لتحديد رقم الـcontrol إلي تشتية يتفعل بالـtab key 1..2...3....وهكذا وغلق النافذة.
    * ألان حدد الـdialog window وبزر الفارة اليمين اختر من القائمة المنسدلة Mnemonics
    *اذالم يكن هناك أي تضارب في الذاكرة menmonics سوف تظهر لك رسالة no duplicate mnemonics have been found.
    *أما إذا وجد تضارب في الذاكرة فالرسالة ستكون duplicate mnemonic found:'e' .
    *7***إضافة مرفق متغير إلى الـcontrols:
    انه لمن المهم إضافة متغير لكل controls في الـvisual c++ قبل البدء بكتابة الكود كل الـcontrols
    عدا الـcommand والـtext static تقبل قيمة مرفقة سوف تتفاعل مع هذة المتغيرات عند كتابة الكود
    القيمة التي تدخل في في شاشة الـcontrols توضع في هذة المتغيرات لاستخدامها في كود التطبيق .
    بنفس الطريقة أي قيمة يضعها كود التطبيق ضمن هذة المتغيرات يتم تحديثها في الـcontrols في النافذة
    لكي يراها المستخدم ..
    كيف يتم التصريح لهذة المتغيرات والموافقة بينها وما بين الـcontrols التي وضعتها في النافذة .لكي تعمل ذلك اتبع ما يلي :
    1* افتحclass wizard كما تعلمت في الدرس السابق .
    2*حدد member variables tab .
    3*حدد الـ ID لواحدة من الـControls التي أنت بحاجة إلى إرفاق متغير إليها مثلا IDC_MSG .
    4*انقر علىadd variable button .
    5* ثم أضف add member variable dialog ادخل اسم المتغير , وحدد الباب category ,
    variable type .ثم اضغط ok .
    6* اعد الخطوة الثالثة لعدد من الـcontrols او كلها حسب حاجتك (يجب أن تضيف المتغيرvariable
    إلى تطبيقك حسب ما ه مبين في الجدول التالي):
    Control Variable Name Category Type
    IDC_MSG m_strMessage Value CString IDC_PROGTORUN m_strProgToRun Value CString IDC_CKENBLMSG m_bEnableMsg Value BOOL IDC_CKENBLPGM m_bEnablePgm Value BOOL IDC_CKSHWMSG m_bShowMsg Value BOOL IDC_CKSHWPGM m_bShowPgm Value BOOL
    7*بعد إضافة المتغيرات المناسبة لك انقر ok لإغلاق الـclass wizard .

    **8** إرفاق وظيفة للـcontrols :
    قبل إضافة الكود إلى الـcontrols أنت بحاجة إلى إضافة كود صغير إلى المتغيرات لإعداد القيم المبدئية
    لمعظمها اتبع ما يلي :
    1-استخدم الـclass wizard وفي الـmessage maps tab حدد الـOnInitDialog function في قائمة الـmember function .كما في الشكل ..4)
    2-انقر edit code لوضع الشفرة حق الـOnInitDialog function .
    3-جد الـ محددTODO marker الذي يدلك أين تبداء بكتابة الكود . ثم أضف الكود التالي :
    BOOL CDay2Dlg::OnInitDialog( )
    {
    CDialog::OnInitDialog( );

    .
    .
    .
    // TODO:Add extra initialization here
    //put a default message in the message edit
    m_strMessage = " هنا مكان الرسالة";
    // set all of the check boxes to checked
    m_bshowMsg = TRUE;
    m_bshowPgm = TRUE;
    m_benableMsg = TRUE;
    m_benablePgm = TRUE

    // update the dialoge with the values
    update data(FALSE);
    return TRUE;
    }
    سوف يقوم هذا الكود بإعداد رسالة بدئية للمستخدم في صندوق التحرير edit box الذي سوف يستخدم
    لعرض رسائل للمستخدم .بعدها تقوم بإعداد كل الـcheck boxes إلى حالة التعليم او التفعيل .
    the update data function هي المفتاح للعمل مع الـvisual c++ هذة الوظيفة تأخذ المعطيات من المتغير
    وتحدث الـcontrols على الشاشة بقيم المتغيرات . كما أنها تأخذ المعطيات من الـcontrols وتضع
    القيم المتغيرة الملحقة مع أي قيمة يقوم بتغيرها المستخدم . والعملية يتم التحكم بها بواسطة الـargument (true , false) فعندما تكون الـargument=false عندها القيمة في المتغير يتم تمريرها إلى الـcontrols في النافذة .أما إذا كانتtrue فان المتغير يٌحدث بأي شيء يظهر في النافذة.
    كنتيجة : ما القيمة لتمرير الوظيفة والمعتمدة على الاتجاة للتحديث .فبعد تحديث واحد او أكثر من المتغيرات في الكود ,فأنت بحاجة إلى استدعاء معطيات التحديث وتمريرها على أنهاfalse= argument ..
    اذاكنت بحاجة لقراءة المتغيرات للحصول على القيم الصحيحة فأنت بحاجة لاستدعاء معطيات التحديث بقيمةtrue قبل قراءة أي متغير . سوف تحصل على تعليق كلما أضفت المزيد من الشفرة إلى التطبيق.

    إغلاق التطبيق :
    إن أول شيء يجب آخذة بعين الاعتبار للتأكد من أن المستخدم يستطيع إغلاق التطبيق .لأنك أزلت زري الـok & cancel وأضفت أزرار جديدة ولإغلاق النافذة لمكان تضع فية الكود في وظيفة تدعى exit
    لعمل ذلك اتبع التالي :
    1*استخدم الـclass wizard أضف وظيفة للـIDD_EXIT ......BN_CLICKED message..........
    ..........كما تعلمت في الأعلى ..
    2*انقر على edit code .
    3*ادخل الكود التالي ك:
    void CDay2Dlg::OnExit()
    {
    // TODO: Add your control notification handler code here

    // MY CODE STARTS HERE
    // Exit the program
    OnOK();

    // MY CODE ENDS HERE
    }
    طبعاً///////السلاشات هذة وما بداخلها ليست مهمة ويمكن عدم كنابتها وإنما للتوضيح والمهم هو:
    // Exit the program حتى من ممكن بدون هذا السطر
    OnOK();
    إظهار رسالة المستخدم :
    إظهار رسالة المستخدم التي يضعها في الـedit box هو سهل جداً حيث يمكن إضافة وظيفة إلى زر اظهر الرسالة واستدعاء الـMessage Box function أضف الكود التالي :
    void CDay2Dlg::OnShwmsg()
    {
    // TODO: Add your control notification handler code here
    // MY CODE STARTS HERE
    // Update the message variable with what the user entered
    UpdateData(TRUE);
    // Display the message for the user
    MessageBox(m_strMessage);
    // MY CODE ENDS HERE
    }
    أهم ما في الكود هو السطرين التاليين :
    void CDay2Dlg::OnShwmsg()
    {
    // TODO: Add your control notification handler code here
    UpdateData(TRUE);
    MessageBox(m_strMessage);
    }
    ألان بعد قيامك بعمل compile وتشغيل البرنامج سوف تكون قادر على عرض الرسالة التي كتبتها في
    edit box ..



    ألان مسح الرسالة :
    لتحيقق ذلك يمكنك إضافة وظيفة إلى زر مسح الرسالة يمكن إضافة هذة الوظيفة بواسطة الـclass wizard هذا من السهولة بمكان بحيث يتم إعدادvariable m_strmesage إلى empty string ثم تحديث الـcontrols في النافذة لعكس هذا التأثير .
    لعمل ذلك اطبع الكود التالي
    :void CDay2Dlg::OnClrmsg()
    {
    // TODO: Add your control notification handler code here
    // MY CODE STARTS HERE

    // Clear the message
    m_strMessage = "";
    // Update the screen
    UpdateData(FALSE);

    // MY CODE ENDS HERE
    }
    عدم عرض الـcontrols حق الرسالة واخفائة:
    أخر شيء تعملة هو إضافة وظيفة لتفعيل الرسالة وإظهار الرسالة وذلك بتعليم الـcheck box أول هذة الشيك بوكس فهو لتفعيل او لإبطال أدوات التحكمcontrols لعدم عرض رسالة المستخدم عندما يكون الشيك بوكس معلم فان أدوات السيطرة كلها مفعلة وهكذا كل واحد يدل علية اسمة .
    لعمل ذلك أضف الشفرة التالية :
    void CDayDlg::Onckenblmsg()
    {
    //TODO:add your control notification hander code here
    //GET the current value from the screen
    Updatedata(TRUE);
    // is the enable message action check box checked ?
    if (m_benableMsg == TRUE)
    {
    //todo with the showing controls that have anything
    GetDlgItem(IDC_MSG)->EnableWindow(TRUE);
    GetDlgItem(IDC_SHWMSG)->EnableWindow(TRUE);
    GetDlgItem(IDC_DFLTMSG)->EnableWindow(TRUE);
    GetDlgItem(IDC_CLRMSG)->EnableWindow(TRUE);
    GetDlgItem(IDC_STATICMSG)->EnableWindow(TRUE);
    }
    else
    {
    GetDlgItem(IDC_MSG)->EnableWindow(FALSE);
    GetDlgItem(IDC_SHWMSG)->EnableWindow(FALSE);
    GetDlgItem(IDC_DFLTMSG)->EnableWindow(FALSE);
    GetDlgItem(IDC_CLRMSG)->EnableWindow(FALSE);
    GetDlgItem(IDC_STATICMSG)->EnableWindow(FALSE);
    }
    }
    void CDay2Dlg::OnCkshwmsg()
    {
    Updatedata(TRUE);
    if(m_bshowMsg ==TRUE)
    {
    GetDlgItem(IDC_MSG)->ShowWindow(TRUE);
    GetDlgItem(IDC_SHWMSG)->ShowWindow(TRUE);
    GetDlgItem(IDC_DFLTMSG)->ShowWindow(TRUE);
    GetDlgItem(IDC_CLRMSG)->ShowWindow(TRUE);
    GetDlgItemIDC_STATICMSG)->ShowWindow(TRUE);
    }
    else
    {
    GetDlgItem(IDC_MSG)->ShowWindow(FALSE);
    GetDlgItem(IDC_SHWMSG)->ShowWindow(FALSE);
    GteDlgItem(IDC_DFLTMSG)->ShowWindow(FALSE);
    GetDlgItem(IDC_CLRMSG)->ShowWindow(FALSE);
    GetDlgItem(IDC_STATICMSG)->ShowWindow(FALSE);
    }
    }
    اعتقد انك فهمت ما الذي حدث في الجزء الأول من هذة الوظيفة .أولا قمت بتحديث المتغير بالأرقام الصحيحة للـcontrols على النافذة بعدين التحقق من القيم المنطقية للمتغيرات المضافة وتخصيصها للـcheck box
    فإذا الـvariable =true فأنت تريد أن تفعل او تظهر الـcontrols أما إذا كانت =false فيعني انك تريد إخفاء او إبطال الـcontrol .
    حتى هذة النقطة فان الكود بداء يصعب عليك لا تخف فالوظيفة الأولى GetDlgItem ..(ركز على الأحرف الكبيرة والصغيرة ) هذة الوظيفة تمرر الـID حق الـcontrols الذي تريد تغييرةالوظيفة تقوم بإعادة الموضوع الـobject التابعة للـcontrols ويمكن أن نسمي هذة الوظيفة بالمرجعة
    للـobject حق الـcontrols بينما التطبيق شغال . شاهد التطبيق .

    ألان تشغيل تطبيق آخر :
    تذكر انك أضفت ثلاثة أسماء لنوافذ تطبيقية في الـcombo box هي(Padnote , paint , solitaire)
    حيث عند تشغيل تطبيقك يمكنك أن تشاهد في القائمة المنسدلة من الـcombo box ومن ثم اختيار أين منها بالماوس وما عليك لعمل ذلك سوى إضافة الكود التالي في زر شغل البرنامج :
    void CDay2Dlg::OnRunPgm( )
    {
    // TODO:Add your control notification hander code here
    UpdatData(TRUE);
    CString strPgmName;
    //خلي أسماء البرامج كماهي ظاهرة
    strPgmName.MaKeUpper( );
    //هل المستخدم اختار تشغيل الرسام paint
    if (strPgmName == "PAINT')
    //نعم اختارة
    WinExec("pbrush.exe",SW SHOW);
    //هل المستخدم اختار المذكرةNotepadm
    if (strPgmName == "NOTEPAD")
    //أيوا اختارة
    WinExec("notepad.exe", SW_SHOW);
    //هل المستخدم اختار السوليتير البطة
    if (strPgmName == "SOLITAIRE")
    //أيوا
    WinExec("sol.exe", SW_SHOW);
    }

    أول شيء حدث هو قيام الوظيفة باستدعاء الـUpdateData لكي تحتل المتغير بقيمةالـcontrols على النافذة والشي التالي مهما بدا تافة هو أن تعطي تصريح مرور declare لـCString جديد , للمتغير ونسخ قيمة الـcombo box إليها .هذا ضروري جداً عندما تكون القيمة موجودة في الـCString variable .
    وهي تعتمد على كيف تريد لتطبيقك أن يتصرف .الخط الثاني في الشفرة يدعىCString function
    وهو الـMakeUpper والذي يحول الـstring إلى حالة الظهور uppercase .اذا استخدمت متغيرCStrin المرفق مع الـcombo box فالمرة القادمة الـupdateData ستسمى false والقيمة في الـcombo box سوف تتحول إلى الـuppercase ..
     
  4.   مشاركة رقم : 3    ‏2003-08-27
  5. bassam4000

    bassam4000 عضو

    التسجيل :
    ‏2003-05-25
    المشاركات:
    140
    الإعجاب :
    0
    اليوم الثاني

    استــــــــخدام الـcontrols في تطبيقك :







    العديد من الأشياء التي سوف تجدها في كل نافذة تطبيق مثل الـ الأزرار button وصندوق التعليم check box وحقل الكتابة text fields هذة كلها تعرف بالـcontrols اليوم سوف نتعلم :

    *ماهية الـbasic controls في الـvisual c++ .

    *كيف تعطي تصريح او مرفق متغير إلى الـcontrol .

    *كيف تزامن القيمة بين الـcontrol والمتغير .

    *كيف تحدد اوامر المستخدم باجتياز نافذة التطبيق .

    *كيف تؤدي الحدث action بواسطة الـcontrol .

    *كيف تتعامل مع وتغير مظهر الـcontrol في حين التطبيق يشتغل .



    *1* نوافذ السيطرة او التحكم الأساسية(the basic windows controls) :

    العديد من اوامر التحكم القياسية موجودة في نظام التشغيل ويندوز مثل نظام الشجرة المنزلقةslider tree , على العموم اليوم سوف نتعامل مع نصف در زن من الـcontrols التي تكون موجودة في كل نافذة

    تطبيق .

    - النص الثابتstatic text.

    -صندوق النصوصtext box .

    -أزرار الأمر .

    -صندوق التعليمcheck box.

    -radio button .

    -combo box او Drop down list box .

    -إضافة للعديد منها تظهر في شريط الأوامر ..

    *1*النص الثابت static box :

    المستخدم فيما بعد لا يستطيع تغيرة لكن أنت ألان قادر على اختيار ما تريد في مرحلة التكوين .

    فالمستخدم بقراءة فقط .

    *2*صندوق التحرير edit box :

    هذا يسمح للمستخدم ( المستخدم هنا المقصود بة إلي اشترا البرنامج خالص ويشتغل علية أنت المبرمج وليس المستخدم) بإدخال او تغيير النص ..edit box هو واحد من الأدوات الأساسية للسماح للمستخدم بإدخال معلومات محددة التي يحتاجها التطبيق .وهو يقبل النصوص فقط .وليس الأشكال .

    *3*زر الأمر command button :

    يستخدمة المستخدم لتنفيذ بعض الـaction يكون علية كتابة تدل على وظيفة مثل Go كما يمكن أن يحمل صورة كجزء من الزر .

    *4* صندوق التعليم check box:

    وهو مربع الشكل يمكن للمستخدم تعليمة او عدم تعليمة بإشارة صح .وهو يستخدم لتشغيل او إطفاء وظيفة محددة on/off ..

    *5*radio button :

    يكون بشكل دائرة لكي يملى بدائرة سوداء وهو مشابة للـcheck box ولكنة يستخدم لمجموعة من القيم التي تكون في نفس الحالة في نفس التوقيت ..

    *6*combo box :

    وهو عبارة عن صندوق نص مع قائمة من القيم المتغيرة المرفقة وأنت تستخدم الـcombo box لتضمين العديد من الخيارات .

    *7* إضافة control إلى نافذتك :

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

    او الرسالة عند الضغط على الزر بجانب حقل النص , والى الأسفل من حقل النص(التحرير )هناك زرين

    اللذان أيضا يؤديان إلى ملء حقل التحرير إما برسالة افتراضية او مسح الحقل , إلى الأسفل منها يوجد

    قائمةdrop-down list box او combo box التي تحوي مجموعة من النوافذ القياسية للتطبيق ز

    عندما يقوم المستخدم بتحديد احد هذة الخيارات فان البرنامج سوف يعمل . next هناك مجموعتين من

    الـcheck boxes التي تظهر الـcontrol التي اخترتها في النصف العلوي كما ذكرنا من قبل زر

    الـcontrols لعرض رسالة مستخدم وcontrols لتشغيل برنامج أخر .

    الجانب الأيسر من الـcheck boxes سوف يفعل او يبطل تفعيل مجموعة من المجموعات التي أنجزتها

    الجانب الأيمن من الـcheck boxes سوف يظهر او يخفي مجموعة من المجموعات التي اخترتها من

    الـcontrols .



    عمل تطبيق جديد وتصميم هيكل لة :

    1*اعمل مشروع جديدAppWizard سميةday2 .

    2*اعمل نفس الاعدادات حق اليوم الأول مع تحدي في عنوان الـdialog title وسميةvisual c++ controls .

    3*بعد تكوين الهيكل , صمم التطبيق بحيث يبدو كما في الشكل ...1)

    4*ادخل الاعدادات كما في الجدول التالي:



    Object Property Setting

    Static Text ID IDC_STATIC

    Caption This is an example of a Visual C++ Application using a number of controls.

    Static Text ID IDC_STATICMSG

    Caption Enter a &Message:

    Static Text ID IDC_STATICPGM

    Caption Run a &Program:

    Edit Box ID IDC_MSG

    Button ID IDC_SHWMSG

    Caption &Show Message

    Button ID IDC_DFLTMSG

    Caption &Default Message

    Button ID IDC_CLRMSG

    Caption &Clear Message

    Button ID IDC_RUNPGM

    Caption &Run Program

    Button ID IDC_EXIT

    Caption &Exit

    Combo Box ID IDC_PROGTORUN

    Group Box ID IDC_STATIC

    Caption Enable Actions

    Group Box ID IDC_STATIC

    Caption Show Actions

    Check Box ID IDC_CKENBLMSG

    Caption &Enable Message Action

    Check Box ID IDC_CKENBLPGM

    Caption E&nable Program Action

    Check Box ID IDC_CKSHWMSG

    Caption S&how Message Action

    Check Box ID IDC_CKSHWPGM

    Caption Sh&ow Program Action

    5*بعد ملء كل هذة الـcontrols في نافذة صندوق الحوار وإعداد كل الخواص حقها اعد فتح خصائص صندوق الحوار من اجل الـcombo box الذي وضعت في النافذة وفي الـdata tab في خصائص صندوق الحوار وادخل ما يلي هناك باستخدام ctrl&enter key :

    notepad, paint, solitaire كما في الشكل) .



    6*تعيين الأمر control tab order :

    ألان لديك كل الـ controls على النافذة حقك الآن عليك انن تتأكد من أن الـtab key في لوحة المفاتيح شغال للسماح للمستخدم أن يتنقل بواسطتة بين الأزرار الموجودة في النافذة ..يمكن عمل ذلك كالتالي :

    *إما أن تحد النافذة كلها او زر control واحد في مساحة العمل كما في الشكل)

    *اختر layout ........tab order ...... من القائمة سوف ترى أرقام بجانب كل واحدة من الـcontrol

    *استخدم الماوس لتحديد رقم الـcontrol إلي تشتية يتفعل بالـtab key 1..2...3....وهكذا وغلق النافذة.

    * ألان حدد الـdialog window وبزر الفارة اليمين اختر من القائمة المنسدلة Mnemonics

    *اذالم يكن هناك أي تضارب في الذاكرة menmonics سوف تظهر لك رسالة no duplicate mnemonics have been found.

    *أما إذا وجد تضارب في الذاكرة فالرسالة ستكون duplicate mnemonic found:'e' .

    *7***إضافة مرفق متغير إلى الـcontrols:

    انه لمن المهم إضافة متغير لكل controls في الـvisual c++ قبل البدء بكتابة الكود كل الـcontrols

    عدا الـcommand والـtext static تقبل قيمة مرفقة سوف تتفاعل مع هذة المتغيرات عند كتابة الكود

    القيمة التي تدخل في في شاشة الـcontrols توضع في هذة المتغيرات لاستخدامها في كود التطبيق .

    بنفس الطريقة أي قيمة يضعها كود التطبيق ضمن هذة المتغيرات يتم تحديثها في الـcontrols في النافذة

    لكي يراها المستخدم ..

    كيف يتم التصريح لهذة المتغيرات والموافقة بينها وما بين الـcontrols التي وضعتها في النافذة .لكي تعمل ذلك اتبع ما يلي :

    1* افتحclass wizard كما تعلمت في الدرس السابق .

    2*حدد member variables tab .

    3*حدد الـ ID لواحدة من الـControls التي أنت بحاجة إلى إرفاق متغير إليها مثلا IDC_MSG .

    4*انقر علىadd variable button .

    5* ثم أضف add member variable dialog ادخل اسم المتغير , وحدد الباب category ,

    variable type .ثم اضغط ok .

    6* اعد الخطوة الثالثة لعدد من الـcontrols او كلها حسب حاجتك (يجب أن تضيف المتغيرvariable

    إلى تطبيقك حسب ما ه مبين في الجدول التالي):

    Control Variable Name Category Type

    IDC_MSG m_strMessage Value CString IDC_PROGTORUN m_strProgToRun Value CString IDC_CKENBLMSG m_bEnableMsg Value BOOL IDC_CKENBLPGM m_bEnablePgm Value BOOL IDC_CKSHWMSG m_bShowMsg Value BOOL IDC_CKSHWPGM m_bShowPgm Value BOOL

    7*بعد إضافة المتغيرات المناسبة لك انقر ok لإغلاق الـclass wizard .



    **8** إرفاق وظيفة للـcontrols :

    قبل إضافة الكود إلى الـcontrols أنت بحاجة إلى إضافة كود صغير إلى المتغيرات لإعداد القيم المبدئية

    لمعظمها اتبع ما يلي :

    1-استخدم الـclass wizard وفي الـmessage maps tab حدد الـOnInitDialog function في قائمة الـmember function .كما في الشكل ..4)

    2-انقر edit code لوضع الشفرة حق الـOnInitDialog function .

    3-جد الـ محددTODO marker الذي يدلك أين تبداء بكتابة الكود . ثم أضف الكود التالي :

    BOOL CDay2Dlg::OnInitDialog( )

    {

    CDialog::OnInitDialog( );



    .

    .

    .

    // TODO:Add extra initialization here

    //put a default message in the message edit

    m_strMessage = " هنا مكان الرسالة";

    // set all of the check boxes to checked

    m_bshowMsg = TRUE;

    m_bshowPgm = TRUE;

    m_benableMsg = TRUE;

    m_benablePgm = TRUE



    // update the dialoge with the values

    update data(FALSE);

    return TRUE;

    }

    سوف يقوم هذا الكود بإعداد رسالة بدئية للمستخدم في صندوق التحرير edit box الذي سوف يستخدم

    لعرض رسائل للمستخدم .بعدها تقوم بإعداد كل الـcheck boxes إلى حالة التعليم او التفعيل .

    the update data function هي المفتاح للعمل مع الـvisual c++ هذة الوظيفة تأخذ المعطيات من المتغير

    وتحدث الـcontrols على الشاشة بقيم المتغيرات . كما أنها تأخذ المعطيات من الـcontrols وتضع

    القيم المتغيرة الملحقة مع أي قيمة يقوم بتغيرها المستخدم . والعملية يتم التحكم بها بواسطة الـargument (true , false) فعندما تكون الـargument=false عندها القيمة في المتغير يتم تمريرها إلى الـcontrols في النافذة .أما إذا كانتtrue فان المتغير يٌحدث بأي شيء يظهر في النافذة.

    كنتيجة : ما القيمة لتمرير الوظيفة والمعتمدة على الاتجاة للتحديث .فبعد تحديث واحد او أكثر من المتغيرات في الكود ,فأنت بحاجة إلى استدعاء معطيات التحديث وتمريرها على أنهاfalse= argument ..

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



    إغلاق التطبيق :

    إن أول شيء يجب آخذة بعين الاعتبار للتأكد من أن المستخدم يستطيع إغلاق التطبيق .لأنك أزلت زري الـok & cancel وأضفت أزرار جديدة ولإغلاق النافذة لمكان تضع فية الكود في وظيفة تدعى exit

    لعمل ذلك اتبع التالي :

    1*استخدم الـclass wizard أضف وظيفة للـIDD_EXIT ......BN_CLICKED message..........

    ..........كما تعلمت في الأعلى ..

    2*انقر على edit code .

    3*ادخل الكود التالي ك:

    void CDay2Dlg::OnExit()

    {

    // TODO: Add your control notification handler code here



    // MY CODE STARTS HERE

    // Exit the program

    OnOK();



    // MY CODE ENDS HERE

    }

    طبعاً///////السلاشات هذة وما بداخلها ليست مهمة ويمكن عدم كنابتها وإنما للتوضيح والمهم هو:

    // Exit the program حتى من ممكن بدون هذا السطر

    OnOK();

    إظهار رسالة المستخدم :

    إظهار رسالة المستخدم التي يضعها في الـedit box هو سهل جداً حيث يمكن إضافة وظيفة إلى زر اظهر الرسالة واستدعاء الـMessage Box function أضف الكود التالي :

    void CDay2Dlg::OnShwmsg()

    {

    // TODO: Add your control notification handler code here

    // MY CODE STARTS HERE

    // Update the message variable with what the user entered

    UpdateData(TRUE);

    // Display the message for the user

    MessageBox(m_strMessage);

    // MY CODE ENDS HERE

    }

    أهم ما في الكود هو السطرين التاليين :

    void CDay2Dlg::OnShwmsg()

    {

    // TODO: Add your control notification handler code here

    UpdateData(TRUE);

    MessageBox(m_strMessage);

    }

    ألان بعد قيامك بعمل compile وتشغيل البرنامج سوف تكون قادر على عرض الرسالة التي كتبتها في

    edit box ..







    ألان مسح الرسالة :

    لتحيقق ذلك يمكنك إضافة وظيفة إلى زر مسح الرسالة يمكن إضافة هذة الوظيفة بواسطة الـclass wizard هذا من السهولة بمكان بحيث يتم إعدادvariable m_strmesage إلى empty string ثم تحديث الـcontrols في النافذة لعكس هذا التأثير .

    لعمل ذلك اطبع الكود التالي

    :void CDay2Dlg::OnClrmsg()

    {

    // TODO: Add your control notification handler code here

    // MY CODE STARTS HERE



    // Clear the message

    m_strMessage = "";

    // Update the screen

    UpdateData(FALSE);



    // MY CODE ENDS HERE

    }

    عدم عرض الـcontrols حق الرسالة واخفائة:

    أخر شيء تعملة هو إضافة وظيفة لتفعيل الرسالة وإظهار الرسالة وذلك بتعليم الـcheck box أول هذة الشيك بوكس فهو لتفعيل او لإبطال أدوات التحكمcontrols لعدم عرض رسالة المستخدم عندما يكون الشيك بوكس معلم فان أدوات السيطرة كلها مفعلة وهكذا كل واحد يدل علية اسمة .

    لعمل ذلك أضف الشفرة التالية :

    void CDayDlg::Onckenblmsg()

    {

    //TODO:add your control notification hander code here

    //GET the current value from the screen

    Updatedata(TRUE);

    // is the enable message action check box checked ?

    if (m_benableMsg == TRUE)

    {

    //todo with the showing controls that have anything

    GetDlgItem(IDC_MSG)->EnableWindow(TRUE);

    GetDlgItem(IDC_SHWMSG)->EnableWindow(TRUE);

    GetDlgItem(IDC_DFLTMSG)->EnableWindow(TRUE);

    GetDlgItem(IDC_CLRMSG)->EnableWindow(TRUE);

    GetDlgItem(IDC_STATICMSG)->EnableWindow(TRUE);

    }

    else

    {

    GetDlgItem(IDC_MSG)->EnableWindow(FALSE);

    GetDlgItem(IDC_SHWMSG)->EnableWindow(FALSE);

    GetDlgItem(IDC_DFLTMSG)->EnableWindow(FALSE);

    GetDlgItem(IDC_CLRMSG)->EnableWindow(FALSE);

    GetDlgItem(IDC_STATICMSG)->EnableWindow(FALSE);

    }

    }

    void CDay2Dlg::OnCkshwmsg()

    {

    Updatedata(TRUE);

    if(m_bshowMsg ==TRUE)

    {

    GetDlgItem(IDC_MSG)->ShowWindow(TRUE);

    GetDlgItem(IDC_SHWMSG)->ShowWindow(TRUE);

    GetDlgItem(IDC_DFLTMSG)->ShowWindow(TRUE);

    GetDlgItem(IDC_CLRMSG)->ShowWindow(TRUE);

    GetDlgItemIDC_STATICMSG)->ShowWindow(TRUE);

    }

    else

    {

    GetDlgItem(IDC_MSG)->ShowWindow(FALSE);

    GetDlgItem(IDC_SHWMSG)->ShowWindow(FALSE);

    GteDlgItem(IDC_DFLTMSG)->ShowWindow(FALSE);

    GetDlgItem(IDC_CLRMSG)->ShowWindow(FALSE);

    GetDlgItem(IDC_STATICMSG)->ShowWindow(FALSE);

    }

    }

    اعتقد انك فهمت ما الذي حدث في الجزء الأول من هذة الوظيفة .أولا قمت بتحديث المتغير بالأرقام الصحيحة للـcontrols على النافذة بعدين التحقق من القيم المنطقية للمتغيرات المضافة وتخصيصها للـcheck box

    فإذا الـvariable =true فأنت تريد أن تفعل او تظهر الـcontrols أما إذا كانت =false فيعني انك تريد إخفاء او إبطال الـcontrol .

    حتى هذة النقطة فان الكود بداء يصعب عليك لا تخف فالوظيفة الأولى GetDlgItem ..(ركز على الأحرف الكبيرة والصغيرة ) هذة الوظيفة تمرر الـID حق الـcontrols الذي تريد تغييرةالوظيفة تقوم بإعادة الموضوع الـobject التابعة للـcontrols ويمكن أن نسمي هذة الوظيفة بالمرجعة

    للـobject حق الـcontrols بينما التطبيق شغال . شاهد التطبيق .



    ألان تشغيل تطبيق آخر :

    تذكر انك أضفت ثلاثة أسماء لنوافذ تطبيقية في الـcombo box هي(Padnote , paint , solitaire)

    حيث عند تشغيل تطبيقك يمكنك أن تشاهد في القائمة المنسدلة من الـcombo box ومن ثم اختيار أين منها بالماوس وما عليك لعمل ذلك سوى إضافة الكود التالي في زر شغل البرنامج :

    void CDay2Dlg::OnRunPgm( )

    {

    // TODO:Add your control notification hander code here

    UpdatData(TRUE);

    CString strPgmName;

    //خلي أسماء البرامج كماهي ظاهرة

    strPgmName.MaKeUpper( );

    //هل المستخدم اختار تشغيل الرسام paint

    if (strPgmName == "PAINT')

    //نعم اختارة

    WinExec("pbrush.exe",SW SHOW);

    //هل المستخدم اختار المذكرةNotepadm

    if (strPgmName == "NOTEPAD")

    //أيوا اختارة

    WinExec("notepad.exe", SW_SHOW);

    //هل المستخدم اختار السوليتير البطة

    if (strPgmName == "SOLITAIRE")

    //أيوا

    WinExec("sol.exe", SW_SHOW);

    }



    أول شيء حدث هو قيام الوظيفة باستدعاء الـUpdateData لكي تحتل المتغير بقيمةالـcontrols على النافذة والشي التالي مهما بدا تافة هو أن تعطي تصريح مرور declare لـCString جديد , للمتغير ونسخ قيمة الـcombo box إليها .هذا ضروري جداً عندما تكون القيمة موجودة في الـCString variable .

    وهي تعتمد على كيف تريد لتطبيقك أن يتصرف .الخط الثاني في الشفرة يدعىCString function

    وهو الـMakeUpper والذي يحول الـstring إلى حالة الظهور uppercase .اذا استخدمت متغيرCStrin المرفق مع الـcombo box فالمرة القادمة الـupdateData ستسمى false والقيمة في الـcombo box سوف تتحول إلى الـuppercase ..
     
  6.   مشاركة رقم : 4    ‏2003-08-27
  7. العمراوي

    العمراوي مشرف سابق

    التسجيل :
    ‏2002-11-24
    المشاركات:
    7,510
    الإعجاب :
    4
    حياك الله أخي ومشكور .,.,.,.,

    والكتاب الذي ذكرته موجود معي وبالإنجليزي وبصراحة أتعبنا جدا في قرآءته فمشكور ألف شكر على الترجمة .,.,.,.,.,

    وجعلها الله في ميزان حسناتك .,.,.,.,
     
  8.   مشاركة رقم : 5    ‏2003-08-27
  9. العمراوي

    العمراوي مشرف سابق

    التسجيل :
    ‏2002-11-24
    المشاركات:
    7,510
    الإعجاب :
    4
    مشكور أخي .,.,.,.,

    واصل والله معاك .,.,.,.,
     
  10.   مشاركة رقم : 6    ‏2003-08-27
  11. م/ محمد أسد

    م/ محمد أسد قلم فضي

    التسجيل :
    ‏2003-06-05
    المشاركات:
    4,873
    الإعجاب :
    0
    اخي العزيز

    بالنسبة الى طريقة اظهار الصور

    تكتبها بالشكل الاتي


    ومن ثم رابط الصورة
    [img/]

    وعفوا على التقصير
     
  12.   مشاركة رقم : 7    ‏2003-08-27
  13. م/ محمد أسد

    م/ محمد أسد قلم فضي

    التسجيل :
    ‏2003-06-05
    المشاركات:
    4,873
    الإعجاب :
    0
    نص مقتبس من رسالة : المحقق كونان
     
  14.   مشاركة رقم : 8    ‏2003-08-27
  15. الكوماندر

    الكوماندر مشرف سابق

    التسجيل :
    ‏2002-07-23
    المشاركات:
    1,047
    الإعجاب :
    0
    مشكور

    مشكور اخي بسام.

    موضوع جميل للغايه.

    بارك الله فيك وجعلها في ميزان حسناتك يوم القيامه.

    وتم دمج الدرس الاول مع الثاني لكي لا تضيع الدروس بين المواضيع.

    اكرر شكري لك عزيزي.

    ومنتظرين باقي الدروس.

    تحياتي لك اخي الكريم.
     
  16.   مشاركة رقم : 9    ‏2003-08-27
  17. bassam4000

    bassam4000 عضو

    التسجيل :
    ‏2003-05-25
    المشاركات:
    140
    الإعجاب :
    0
    اليوم الثالث:
    اخواني الاعزاء
    اريد التنبية لاني حاولت ان تكون كتابة الكود من اليسار الى اليمين
    لكن للاسف لم استطع ذلك , لذا اقترح بعد نسخ الدرس كاملاً الى الهارد ديسك عندك
    ان تضغط Ctrl+Shift على يسار الكيبورد . من اجل قراءة الكود بشكل افضل
    اما بالنسبة للصور يمكن لمن لدية استعداد ان ينسقها يمكن ان ارسلها لة بالايميل كمرفق لان محرر المجلس في المستكشف عندي يظهر رسالة خطاء عند محاولتي تنسيق وارفاق الصور على شكل ارتباط مع بقية الموضوع ليكون الشرح افضل لهذا الدرس او بقية الدروس ان والله الموفق


    الدرس الثالث :

    السماح للمستخدم بالتفاعل مع الماوس والكيبورد في تطبيقك .

    اعتماداً على نموذج التطبيق أو نوعة الذي قمت بخلقة فأنت بحاجة ربما إلى الانتباة إلى ما سيقوم بة المستخدم بالماوس , أنت يجب أن تعرف متى وأين سيتم نقر الماوس وأين سيتم إطلاق الزر .

    كما انك بحاجة لمعرفة المكان الذي سيتم أنها أو كبح الماوس .

    شيء أخر يجب أن تعرفة هو قراءة حدث الكيبورد , كما مع الماوس أنت بحاجة لمعرفة متى سيتم ضغط الحرف وكم من الوقت لازم قبل الانتهاء من مسكة ومتى تتركة.

    اليوم ستتعلم :

    * ماهو متغير حدث الموسmouse events وكيف تبنية وتخصصة للتطبيق .

    *وكيف تجعل لة تأثير في تطبيقك .

    *ماهو متغير الكيبوردkeyboard events المتوفر لاستخدامة والحدث الذي سوف يجعل كل واحد منها يعمل .

    *كيف يتم التقاط الـmouse events واخذ الحدث بناء على الحرف الذي بضغطة المستخدم .



    فهم الـmouse events:

    كما تعلمت أمس عندما تعمل مع معظم الـcontrols فأنت مقيد باختيار الحدثevents المتوفر في

    الـclass wizard .عندما ياتي تأثير الماوس فان معظم التأثيرات المتوفرة هي النقر والنقر المزدوج .

    بالنظر إلى خصائص الماوس حقك فانة يخبرك بان هناك أكثر من الحدثين السابقين .

    فماذا عن زر الماوس الأيمن :كيف يمكنك أن تخبرة عند الضغط علية ؟ وماذا عن برامج الرسم ؟

    وماذا عن إتباع المكان الذي تسحب إلية الماوس ؟

    إذا فتحت الـclass wizard في واحد من مشروعاتك حدد dialog في Object IDs تنقل بين تلك الرسائل المتوفرة سوف تجد عدد من mouse-related events الموجودة في الجدول التالي:

    Message Description

    WM_LBUTTONDOWN The left mouse button has been pressed

    WM_LBUTTONUP The left mouse button has been released

    WM_LBUTTONDBLCLK The left mouse button has been double-clicked

    WM_RBUTTONDOWN The right mouse button has been pressed

    WM_RBUTTONUP The right mouse button has been released

    WM_RBUTTONDBLCLK The right mouse button has been double-clicked

    WM_MOUSEMOVE The mouse is being moved across the application window space
    WM_MOUSEWHEEL The mouse wheel is being moved
    الرسم بالماوس:drawing with the mouse

    اليوم سوف ننشأ برنامج رسم بسيط الذي يستخدم بعض الـmouse event المتوفرة في الجدول السابق

    التي تسمح للمستخدم أن يرسم صورة بسيطة في نافذة صندوق الحوار هذا التطبيق يعتمد غالباً على WM_MOUSEMOVE event message والتي تؤشر للماوس أن يبداء الحركة .

    سوف ترى كيف تستطيع أن تخبر من هذة الـevent function ما إذا زر الماوس الأيسر (ممسوك أو متروك)=(down or up) .

    سوف تتعلم كيف تخبر أين الماوس على النافذة .

    اتبع التالي :

    *1* اخلق MFC App Wizard سمية Mouse .

    *2*حدد أن هذا المشروع سوف يكون dialog-based كما في الدرسين السابقين .

    *3*استخدم الاعدادات الافتراضية في الـapp wizard لا تغير شي غير الخطوة الثانية واكتب الـtitle

    في suitable dialog مثلا mouse&keyboard .

    *4*بعد خلق هيكل التطبيق امسح كل أزرار التحكم control من النافذة مثل الـok & cancel

    هذا يقدم لك سطح الصندوق من اجل الرسم هذة الخطوة ضرورية لكي تسمح للكيبورد حقك يمسك أي حدثevent .(ملاحظة بقاء الأزرار على الصندوق الحوار سوف يوجة أي حدث في الكيبورد إلى هذة الأزرار) .

    *5* افتح الـclass wizard حدد WM_MOUSEMOVE منlist message وأضف وظيفة بالنقر على add function وبعدين OK بقبول الاقتراح الوارد لاسم الوظيفة .

    *6* انقر Edit code لتحري الكود للـOnMouseMove التي عملتها للتو ثم أضف الكود التالي :

    ( void CMouseDlg::OnMuseMove(UNIT nFlages, CPoint point

    }

    //TODO:Add your message handler code here and/or call default

    //بداية الكود

    //تححق مما اذا كان الزر الأيسر للماوس ممسوكdown

    ( if ((nFlags & MK_LBUTTON) == MK_LBUTTON }

    //اجعل أمر الجهاز الحدث هنا........device context
    ;(CClinetDC dc(this
    //ارسم الـpixel
    ;(dc.SetPixel(point.x, point.y,RGB(0,0,0
    {
    //نهاية الكود
    ;(CDialog::OnMouseMove(nFlags, point
    {
    انظر إلى تعريف الوظيفة في بداية الكود سترى أن الكود اخذ اثنتين من الـargument مررت

    لداخل الوظيفة الأولى هي Set of Flags =(اجعل الإشارة) وهي قادرة على تحديد ما اذا كان زر الماوس ممسوك وايهما هو . وهذا التحديد موضوع في بداية الكود بواسطة التصريحif)) .

    if ((nFlags & MK_LBUTTON) == MK_LBUTTON)

    في النصف الأول من الشرط يبداء التقييم ,الـFALGS تتم فلترتها وتدل على أن الزر الأيسر ممسوك .

    النصف الثاني من الشرط تتم مقارنة الـflags المفلترة التي تدل على أن الزر الأيسر ممسوك .

    الـargument الثانية هي موقع مؤشر الفارة وهذة تعطيك نسق إحداثي على الشاشة أين الموس موجود بدقة يمكنك استخدام هذة المعلومات لرسم نقطة على الـdialog window .

    قبل أن تستطيع رسم نقطة على النافذة يجب أن تحصل على device context من اجل الـdialog window وهذا يتم بالتصريح declaring لطلب جديدnew instance للـCClientDC class .

    هذا الصنف سوف يلبس أو يغلف الـdevice context واغلب العمليات المنجزة علية بما في ذلك العمليات

    الرسومية المجراة . حيث أنة في وعي أو إحساس(ذهن) الـdevice context لوحةcanvas(صورة ) مبنية والتي تستطيع الرسم على التطبيق . حتى حصولك على الـcanvas لا تستطيع رسم أي شيء ..

    بعد خلق الـdevice context حقك يمكنك استدعى الـ functionSetPixel التابعة لة , وما اللون الذي تم تحديدة في الـargument السابقتين واللون المحدد بالـargument الثالثة . الآن اجمع البرنامجcompile وشغلة وحاول ترسم علية .(لاحظ أن الألوان متوفرة بين0 -250)



    استخدام AND OR الثنائي :

    أنت بحاجة لمعرفة النموذجين المختلفين الـAND والـOR في الـC++ كيف تعملان .الصنفين من الـANDs & ORs منطقيان وثنائيان ..

    الـANDs & ORs الـlogical المنطقيان يستخدمان في العمليات المنطقية والشرطية مثلاif & while

    التان تتحكمان بالدفق الشرطي .

    الـANDs & ORs الـbinary الثنائيان يستخدمان لتوحيد قيمتين في المستوى الثنائي .

    العلامة& تستخدم لتدل على AND (فعلامة واحدة& تدل على أن الـAND ثنائي بينما علامتين && تدل على الـAND المنطقي ) وهو تستخدم على الشكل التالي في الـif :

    اذا كانت الحالة AND فان هناك حالات غيرها فأينما تكون الحالتين true قبل أن يكون الـstatement =true ..

    الـAND الثنائية تستخدم لتهيئة أو عدم تهيئة الـbits , فعندما تكون قيمتين ANDed ثنائيتين فان واحدة فقط من الـbits تعد إلى الـ1 بينما كل البقية تعد إلى الـ0 لكي تفهم شاهد التالي

    Value 1 01011001

    Value 2 00101001

    فإذا كانتAND الثنائية بوضع القيمتين مع بعضهما سوف تنتهي بـANDed value 000001001))

    أي قمت بجمعهما.

    الـOR يتم تمثيلها بمحرف ألبيبPIPE Character () فمثلا اثنين من ( ) فهي تمثل OR logical المنطقي بينما واحدة( ) تمثل OR binary ..

    الـlogical OR تستخدم في الشرط وتتحكم بالتدفق المنطقي .بينما الـbinary OR تستخدم لجمع القيم في المستوى الثنائي وبواسطتها تفهم العبارة التالية ( اذا الـbit معدة للـ1 فان البقية منها تعد إلى 0)

    وهناك طريقة واحدة لإعداد الـbit إلى الـ0 في حين البقية أصلا في الحالة 0 .. كالتالي :

    Value 1 01011001

    Value 2 00101001

    فإذا وضعنا القيمتين مع بعض تكون النتيجة :

    ORed value 01111001

    في هذة الحالة أي bit معدة للـ1 تبقى كما هي في النتيجة بينما هناك حالة واحدة حيث تكون الـbit معدة غلى الـ0 وهي عندما تكون القيمتين معدة اصلا إلى الـ0 ..



    الخاصية الثنائية للـflags :

    الـAND & OR تستخدم في الـC++ للإعداد وقراءة خاصيةالـflags ..attribute flags الخاصية

    هي قيمة للـbit للقيمة المحددة في مكان الخيار المحدد الذي هو الاغلاق أو التشغيل .

    وهذة تفعل للمبرمج استخدام تعريف للـflags .تعريف الـflags هي قيمةbit تعد إلى الـ1 أو مجموعة من القيم الأخرى التي يعد فيها الـbit إلى الـ1 لذلك فهذة الخيارات المتعددة تعد بقيمة مفردة ..

    الـflag تتحكم بخيارات مختلفة تكون فيها الـORed مع بعضها , وعمل flags مركبة التي تحدد ما الخيار الذي يجب أن تكون on وايها off ..

    اذا كان هناك اثنتين من الـflags التان تحددان حالتين شرطيتين كـbits اثنتين مختلفتين في النوع فيكون هناك اثنتين من الـflags يمكن أن تصبحان ORed :

    Flag 1 00001000

    Flag 2 00100000

    Combination 00101000

    حيث ما يحدث في الكود:

    if ((nFlags , MK_LBUTTON))

    فأنت تستطيع تعديل هذا الطريق لفحص فيما اذا كانت الـflag ليست في المجموع على الشكل التالي:

    if (!(nFlags , MK_LBUTTON))



    تحسين برنامج الرسم :

    اذا شغلت البرنامج حقك يكمن أن تواجة مشكلة صغيرة في رسم خط مستقيم حيث عليك تحريك الماوس ببطء شديد فكيف تحل برامج الرسم الأخرى هذة المشكلة ؟ ببساطة فهي ترسم بين نقطتين بالماوس

    مع أن هذا يبدو مخادع قليلاً فهي الطريقة التي يعمل فيها برنامج الرسم في الكمبيوتر .

    فكلما حركت الماوس على الشاشة فان الكمبيوتر يتحقق من موقع الماوس مع كل نقرة تقوم بها ..

    ولان كمبيوترك لا يمتلك CONSTANT TRAIL فكرة مسبقة عن مكان الماوس اللاحق أين سيذهب

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

    وبسب إن كل برامج الرسم الرئيسية تقوم برسم الخط بين نقطتين فماذا أنت محتاج إلية لتهيئة تطبيقك لكي يستخدم هذة التقنية .

    أولا أنت بحاجة إلى الاحتفاظ بسرعة ووضعية الماوس كما هي أي انك بحاجة إلى إضافة متغيرين إلى نافذة الحوار لكي تحافظ على الإحداثيات X , Y يمكنك ذلك بإتباع الخطوات التالية :

    *1* في لوحة العمل workspace pane حدد...class view tab .

    *2*حدد الـdialog class ...في مثل هذة الحالة CMouseDlg class .

    *3*بزر الفارة اليمين حدد Add Member من القائمة التي تظهر لك.

    *4* ادخل int كنموذج للمتغير وكذلك m_iPrevY كاسم للمتغير وبعدين اختر private من الخيارات الثلاثة تحت لأجل الدخول للـMember variable .

    *5*اضغط ok .

    *6*اعد الخطوات من3-5 واجعل اسم المتغير m_iPrevX لإضافة المتغير الثاني .

    *7* إضافة الكود التالي :

    void CMouseDlg::OnMouseMove(UNIT nFlags, CPoint point)

    {

    //TODO:Add your message and/or default

    //بداية الكود

    //تحقق للتأكد من الزر اليسر للماوس ممسوكdown

    if ((nFlags & MK_LBUTTON) == MK_LBUTTON)

    {

    //اجلب الـdevice context

    CClientDC dc(this);

    //ارسم خط من نقطة prvevious إلى current point

    dc.MoveTO(m_iPrevX, m_iPrevY);

    dc.LineTO(point.x, point.y);

    // احفظ النقطة الصحيحة على انها النقطة المتقدمةprevious point

    m_iPrevX = point.x;

    m_iPrevY = point.y;

    }

    // نهاية الكود

    CDialog::OnMOUSEMove(nFlag, point);

    }

    ذعنا نلقي نظرة على الكود :

    dc.MoveTo(m_iPrevX, m-iPrevY);

    dc.LineTo(m_iPrev.x, m_iPrev.y);

    سوف ترى انك بحاجة للتحرك للموضع الأول وبعدها رسم خط إلى النقطة الثانية . الخطوة الثانية هي هامة

    لأنه يدونها لا يوجد ما يخبر الويندوز أين هي نقطة البداية.



    إضافة اللمسات النهائية للبرنامج:

    *1*استخدم الـ class wizard أضف وظيفة من شان WM_LBUTTONDOWNB message

    على موضوع الـdialog .

    *2*في الـOnLButtonDown function الذي عملتة للتو ضع الكود التالي:

    void CMouseDlg :: OnButtonDown (UNIT nFlags, CPoint point)

    {

    // TODO:Add YOUR message code here

    //بداية الكود

    //خلي النقطة الصحيحة هي نقطة البداية

    m_iPrevX = point.x;

    m_iPrevY = point.y;

    // الكود ينتهي هنا

    CDialog::OnButtonDown (nFlag, point);

    }

    قم بتجميع البرنامج compile وشغلةrun :





    التقاط إشارة الكيبورد:

    قراءة حدث من الكيبورد مشابة لقراءة حدث الماوس , كما هو الحال مع الماوس هناكmessage event

    من اجل عند ضغط حرف كيبورد أو أي مفتاح فان كود الـevent الحدث كالتالي :

    message Description

    WM_KEYDOWN A key has been pressed down

    WM_KEYUP A key has been relased

    من الواضح أن الكيبورد لة عدد قليل من الرسائل من الماوس لكن هناك العديد من الوظائف التي يمكنك عملها بالكيبورد , الـevent message تكون متوفرة في موضوع نافذة التطبيق في حال عدم وجود ازار

    controls لان وجود زر واحد منها سيؤدي إلى ذهاب المدخلان من الكيبورد وتركيزها علية .



    تغيير مؤشر الرسم :

    للحصول على فكرة جيدة على استخدامkeyboard - related event message (لماذا لا تستخدم مفتاح كيبورد لتغيير مؤشر الرسم ) مثلا اجعل الـA key مغير المؤشر الذي يبداء بة تطبيقك .وجعل الـ B key لتغيير المؤشر إلى شكل الدعامة والـC key إلى الساعة الرملية .

    لعمل ذلك اتبع ما يلي :

    *1* استخدم الـclass wizard وأضف منةWM_KEYDOWN message .

    *2*وتحتالـOnKeyDown أضف الكود التالي :s

    void CMouseDlg::OnKeyDown(UINTnChar, UINT nRepCnt, UINT nFlags)

    {

    // TODO: Add your message handler code here and/or call default





    // MY CODE STARTS HERE





    char lsChar; // The current character being pressed

    HCURSOR lhCursor; // The handle to the cursor to be displayed



    // Convert the key pressed to a character

    lsChar = char(nChar);



    // Is the character "A"

    if (lsChar == `A')

    {

    // Load the arrow cursor

    lhCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);

    // Set the screen cursor

    SetCursor(lhCursor);

    }



    // Is the character "B"

    if (lsChar == `B')

    {

    // Load the I beam cursor

    lhCursor = AfxGetApp()->LoadStandardCursor(IDC_IBEAM);

    // Set the screen cursor

    SetCursor(lhCursor);

    }



    // Is the character "C"

    if (lsChar == `C')

    {

    // Load the hourglass cursor

    lhCursor = AfxGetApp()->LoadStandardCursor(IDC_WAIT);

    // Set the screen cursor

    SetCursor(lhCursor);

    }



    // Is the character "X"

    if (lsChar == `X')

    {

    // Load the arrow cursor

    lhCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);

    // Set the screen cursor

    SetCursor(lhCursor);

    // Exit the application

    OnOK();

    }



    // MY CODE ENDS HERE



    CDialog::OnKeyDown(nChar, nRepCnt, nFlags);

    }



    في تعريف الوظيفة سترى ثلاثة argument للـOnKeyDown function . الأولى هي أن المفتاح تم

    الضغط عليةpressed هذة الـ argument هي كود الحرف للمحرف , التي تحول في المحرف في السطر

    الأول من الكود بعد تحويل المحرف ويمكنك تقديم مقارنة واضحة لتحديد المفتاح الذي سيضغط .

    void CMouseDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)

    الـargument الثانية هي الـOnKeyDown function هي عدد المرات التي ينضغط فيها المفتاح

    في الحالة الطبيعية عند ضغط المفتاح وتركة فان القيمة تكون1 وعند ضغط المفتاح واستمريت في ضغطة

    فان هناك الـrepeat count rises لهذا المفتاح وفي النهاية هذة القيمة تخبر الويندوز كم مرة تم ضغط المفتاح .

    الـargument الثالثة للـOnKeyDown function هي تجميع الـflags التي يمكن اختبارها لتقرير فيما اذا كان الـALT key قد تم ضغطة في نفس الوقت الذي تم فية مع المفتاح إلي نتكلم عنة أو ايهما

    تم ضغطة أولا . هذة الـargument لا تخبر الويندوز أي من الـshift or control تم الضغط علية .

    مـــــــلاحظة:(أن الوظيفة LoadCursor تستطيع تمرير الملف أو منبع الاسم للمؤشر المختار لذلك أنت تستطيع خلق المؤشر الخاص بك (فإذا قمت بتصميم المؤشر الخاص بك في resource editor في

    الـvisual c++ فيمكنك تمرير اسم المؤشر الخاص بك كـargument للـLoadCursor function

    فمثلا اذا عملت مؤشر ل وكان أسمة IDC_MYCURSOR يمكنك تحميلة كالتالي:

    lhCursor = AfxGetApp( )->LoadCursor(IDC_MYCURSOR):

    بعد تنزيل المؤشر حقك يمكنك إعداد مؤشر الفارة باستخدامSetCursor function كـstandard.



    عمل تغيير للـstick :

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

    والسبب هو أن النافذة الأخرى موجودة في المقدمة تذهب بعيداً أو لسبب أخر مثلWM_SETCURSOR

    تبعث برسالة إلى تطبيقك .ويجب تغيير ذلك كالتالي:

    *1*أضف متغير جديد من ADD member variable إلىCMouseDlg class كما عملت سابقاً عند تقديمك متغير الموضع لكن هذة المرة فانك تصرح للنموذج على أنة BOOL واسم المتغير m_bCursor .

    *2*ضع الكود التالي من اجل الـm_bCursor في OnInitDialog :

    BOOL CMouseDlg::OnInitDialog( )

    {

    CDialog::OnInitDialog( );

    .

    .

    .

    // set the icon for this dialog . the framework dose this

    //when the application, main window is not a dialog

    SetIcon(m_hIcon, TRUE); //ضع أيقونة كبيرة

    SetIcon(m_hlcon, FALSE): //ضع أيقونة صغيرة

    //بداية الكود

    //intialize the cursor to arrow

    m_bCursor = FALSE;

    //نهاية الكود

    return TRUE;

    }

    *3*بدل وظيفة الـOnKeyDown لإعداد الـm-bCursor flag إلىTRUE كالتالي :

    void CMouseDlg::OnKeyDown(UNIT nChar, UNIT nRepCnt, nFlags)

    {

    //TODO:Add your message here

    //بداية الكود

    //حول المفتاح المضغوط إلى حرف

    lsChar == char(nChar);

    if (lsChar == `A')

    // Load the arrow cursor

    lhCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);

    // Is the character "B"

    if (lsChar == `B')

    // Load the I beam cursor

    lhCursor = AfxGetApp()->LoadStandardCursor(IDC_IBEAM);

    // Is the character "C"

    if (lsChar == `C')

    // Load the hourglass cursor

    lhCursor = AfxGetApp()->LoadStandardCursor(IDC_WAIT);

    // Is the character "X"

    if (lsChar == `X')

    {

    // Load the arrow cursor

    lhCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);

    // Set the cursor flag

    m_bCursor = TRUE;

    // Set the screen cursor

    SetCursor(lhCursor);

    // Exit the application

    OnOK();

    }

    else

    {

    // Set the cursor flag

    m_bCursor = TRUE;

    // Set the screen cursor

    SetCursor(lhCursor);

    }

    // MY CODE ENDS HERE

    CDialog::OnKeyDown(nChar, nRepCnt, nFlags);

    }

    *4*استخدم الـclass wizard وأضف وظيفة للـWM_SETCURSOR message ..

    *5*اكتب الكود التالي في الـOnSetCursor function الذي عملتة للتو أضف الكود التالي :

    BOOL CMouseDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)

    {

    // TODO: Add your message handler code here and/or call default

    // MY CODE STARTS HERE

    // If the cursor has been set, then return TRUE

    if (m_bCursor)

    return TRUE;

    else

    // MY CODE ENDS HERE

    return CDialog::OnSetCursor(pWnd, nHitTest, message);

    }

    الـOnSetCursor function تحتاج دائماً للـreturn TRUE أو أن تستدعى وظيفة سليقةancestor function وهي بحاجة لاستدعائها عند أول تشغيل للتطبيق ,بسب ذلك أنت بحاجة

    إلى جعل المتغير=FALSE من عند ما يقوم المستخدم بضغط المفتاح يتغير المؤشر ,عملية الـOnSetCursor تنفذ بشكل تلقائي فأنت بحاجة لاجتياز هذة العملية والـreturn TRUE عوضا عن ذلك.هذا يسمح للمستخدم أن يرسم بأي مؤشر تم تحديدة بما فيها الساعة الرملية .

    الخلاصةsummary:

    لقد تعلمنا في هذا الفصل كيف تلتقط mouse event message وتقديم بعض العمليات المبنية على

    هذة الـevent .استخدام الـmouse event لبناء برنامج رسم بسيط على صندوق حوار .

    أيضا تعلمنا كيف نختطف keyboard event وتقرير أي مفتاح يتم ضغطة .. استخدام هذة المعلومات

    لتقرير أي مؤشر ستعرضة للقيام بالرسم من اجل هذا العمل يجب عليك معرفة المؤشر الافتراضي للرسم في الـتطبيق ـMFC وكيف تدمج الكود مع هذا السلوك لكي تجعل التطبيق يتصرف بالطريقة التي تريد .



    بعض الأسئلة التي ترد للذهن :

    *1* كيف أستطيع تغيير نوع الخط الذي ارسمة ؟كما أريد رسم خط عريض بألوان مختلفة ؟

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

    يمكن ذلك بتضمين الكود التالي إلى OnMouseMove function والبداء من المكان الذي تجلب منة

    الـdevice context فمثلا اتبع الخطوات التالية لرسم خط عريض احمر :

    //احضر الـdevice context

    CClientDC dc(this);

    //اعمل قلم جديد

    CPen lpen(PS_SOLID, 16, RGB(255, 0, 0));

    //استخدم القلم الجديد

    dc.SelectObject(&lpen);

    //ارسم من النقطة المقدمة إلى النقطة الصحيحة

    dc.MoveTo((m_iPrevX, m_iPrevY);

    dc.LineTo(point.x, point.y);



    *2*كيف يمكنك أن تخبر برسالة ما إذا الـshift or CLT المفتاحين قد تم الضغط غليهما عندما تتلقى

    WM_KEYDOWN message ؟

    يمكنك استدعاء وظيفة اخراى GetKeyState بتحديد أي كود المفتاح لتقرير أي من المفتاحين قد بٌدء

    بضغطة. اذا قيمة العودةreturn value للـGetKeyState function كانت سلبية فان المفتاح بدء بضغطة أما اذا كانت ايجابية فالعكس صحيح .على سبيل المثال اذا ما أردت أن تقرر أن الـshift بدء بضغطة فتستخدم هذا الكود :

    if :):GetKeyState(VK_SHIFT) > 0)

    MessageBox("shift Key is down !);

    عدد كود المفاتيح الافتراضية تكون معرفة في الويندوز لكل المفاتيح الخاصة . هذة الكودات تسمح لك بالبحث عن أحرف خاصة بدون القلق عن كود الـOEM scan .يمكنك استخدام المفاتيح الافتراضية في

    GetKeydown function وتمريرها إلى الــOnKeyDown function كـnChar argument

    يرجع لمستندات ـvisual c++ لاجل قائمة كود المفاتيح الافتراضية.
     
  18.   مشاركة رقم : 10    ‏2003-08-29
  19. dreamy

    dreamy عضو

    التسجيل :
    ‏2003-08-09
    المشاركات:
    24
    الإعجاب :
    0
    اريد الكتاب الانجليزي

    شكرا للأخ بسام على هذا المجهود الرائع
    واتمنى فقط لو ترسل لي رابط لتنزيل الكتاب الانجليزي كاملا لأني اريد اقفز بسرعة الى الدروس المتقدمة في نهاية الكتاب
    واذا عندكم كتب اخرى الرجاء ارسال روابط التحميل وشكرا
     

مشاركة هذه الصفحة