You are on page 1of 29

1

‫ﺑﺴﻢ اﷲ اﻟﺮﺣﻤﻦ اﻟﺮﺣﻴﻢ وﺑﻪ أﺳﺘﻌﻴﻦ وﻻﺣﻮل وﻻ ﻗﻮة إﻻ ﺑﺎﷲ اﻟﻌﻠﻲ اﻟﻌﻈﻴﻢ وﻣﻦ اﷲ أﺳﺘﻤﺪ اﻟﻤﻌﻮﻧﺔ واﻟﺘﻮﻓﻴﻖ‬
‫ﺳﺒﺤﺎﻧﻚ ﻳﺎرب ﻻ ﻋﻠﻢ ﻟﻨﺎ إﻻ ﻣﺎ ﻋﻠﻤﺘﻨﺎ إﻧﻚ أﻧﺖ اﻟﻌﻠﻴﻢ اﻟﺤﻜﻴﻢ رب زدﻧﻲ ﻋﻠﻤﺎ وﺻﻠﻰ اﷲ ﻋﻠﻰ ﺳﻴﺪﻧﺎ ﻣﺤﻤﺪ‬
‫وﻋﻠﻰ ﺁﻟﻪ وﺻﺤﺒﻪ وﺳﻠﻢ ﺗﺴﻠﻴﻤﺎ‬
‫أﺧﻲ اﻟﻤﺒﺮﻣﺞ ﺳﻢ اﷲ وﺗﻮآﻞ ﻋﻠﻰ اﷲ واﺑﺪأ ﻣﻌﻲ اﻟﻤﺸﻮار ﻓﺮﺣﻠﺔ اﻷﻟﻒ ﻣﻴﻞ ﻧﺒﺪأ ﺑﺨﻄﻮة‬
‫‪ -.1‬ال ‪ MFC‬اﺧﺘﺼﺎر ‪Microsoft Foundation Classes‬‬
‫‪ -.1.1‬ﺗﻌﺮﻳﻒ‪:‬‬
‫إن ال ‪ MFC‬ﻋﺒﺎرة ﻋﻦ ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻟﻔﺌﺎت ﺻﻤﻤﺘﻬﺎ ﻣﺎﻳﻜﺮوﺳﻮﻓﺖ ﺧﺼﻴﺼـﺎ ﻹﻧﺸـﺎء ﺑﺮﻧـﺎﻣﺞ ﻧﻮاﻓﺬﻳـﺔ وذات‬
‫واﺟﻬﺔ رﺳﻮﻣﻴﺔ ﻳﺘﻌﺎﻣﻞ ﻣﻌﻬﺎ اﻟﻤﺴﺘﺨﺪم ﺑﺎﻟﻔﺄرة وأدوات اﻟﻤﻌﺎﻳﻨﺔ‪ ،‬إن آﺘﺎﺑﺔ ﺑﺮﻧـﺎﻣﺞ ﻧﻮاﻓـﺬي ﻳﻤﺮﻧـﻚ ﻋﻠـﻰ‬
‫إﻧﺸﺎء واﺳﺘﻌﻤﺎل آﺎﺋﻨﺎت ﻣﻜﺘﺒﺎت ‪ MFC‬أو آﺎﺋﻨﺎت اﻟﻔﺌﺎت اﻟﻤﺸﺘﻘﺔ ﻣـﻦ ‪ ، MFC‬ﺑﺮﻧـﺎﻣﺞ ‪ Visual C++‬ﻳﻀـﻊ‬
‫ﻓﻲ ﻣﺘﻨﺎول اﻟﻤﺒﺮﻣﺠﻴﻦ اﻷدوات اﻟﺘﻲ ﺗﺴﺎﻋﺪهﻢ ﻓﻲ ﺗﺴﻬﻴﻞ وﺗﺨﺼـﻴﺺ اﺳـﺘﻌﻤﺎل ﻣﻜﺘﺒـﺎت ال ‪ MFC‬آﻤـﺎ‬
‫أﻧﻪ ﻳﺤﺘﻮي ﻋﻠﻰ ﻣﻌﺎﻟﺞ ﻟﺘﻮﻟﻴﺪ ﺷـﻴﻔﺮة ال ‪ MFC‬اﻷآﺜـﺮ اﺳـﺘﻌﻤﺎﻻ ﻣﺜـﻞ هﻴﺎآـﻞ ‪ MDI‬و ‪ SDI‬اﻟﺘـﻲ ﻳﺘﻌﺎﻣـﻞ‬
‫ﻣﻌﻬﺎ اﻟﻤﺒﺮﻣﺠـﻮن ﺑﻜﺜـﺮة آﻤـﺎ أن ﻓﻴـﻪ ﻣﻌﺎﻟﺠـﺎت ﺗﺘـﻮﻟﻰ اﻟﻘﻴـﺎم ﺑﺘﻮﻟﻴـﺪ ﺷـﻴﻔﺮة اﻟﺮﺳـﺎﺋﻞ ‪ Message‬وهـﻲ‬
‫اﻟﺸﻴﻔﺮة اﻟﺘﻲ ﺑﻮاﺳﻄﺘﻬﺎ ﻳﺘﻌﺮف اﻟﻮﻳﻨﺪوز ﻋﻠﻰ اﻟﺤـﺪث اﻟﻤﺮﺳـﻞ ﻣﺜـﻞ اﻟﻨﻘـﺮ ﺑـﺰر اﻟﻤـﺎوس واﻟﻀـﻐﻂ ﻋﻠـﻰ‬
‫ﻟﻮﺣﺔ اﻟﻤﻔـﺎﺗﻴﺢ وﻏﻴﺮهـﺎ ﻣـﻦ اﻷﺣـﺪاث ﻣﻤـﺎ ﻳﺠﻌـﻞ اﻟﻤﺒـﺮﻣﺠﻴﻦ ﻳﻬﺘﻤـﻮن أو ﻳﺮآـﺰون ﻓﻘـﻂ ﻋﻠـﻰ ﺑﺮﻧـﺎﻣﺠﻬﻢ‬
‫اﻟﻤﻨﻮط ﺑﻬﻢ ﺑﻮاﺳﻄﺔ اﺳﺘﺪﻋﺎء وﻇﺎﺋﻒ ال ‪ MFC‬اﻟﺠﺎهﺰة أو ﺗﻄﻮﻳﺮ ﻓﺌﺎت ﺗﺮﺗﻜﺰ ﻋﻠﻴﻬﺎ ﺗﻜﻮن أآﺜﺮ آﻔﺎءة‪.‬‬
‫وﻋﻨﺪﻣﺎ ﻧﻨﺸﺊ ﻣﺸﺮوع ‪ MFC‬ﻓﺈن ‪ Visual C++‬ﻳﻨﺸﺊ إﻃـﺎر ﻋﻤـﻞ ﻳﻀـﻢ ﺟﻤﻴـﻊ اﻟﻤﻠﻔـﺎت اﻟﺘـﻲ ﻳﺘﻌﺎﻣـﻞ‬
‫ﻣﻌﻬﺎ اﻟﻤﺸـﺮوع ﻣﺜـﻞ ﻣﻠﻔـﺎت اﻟﻤـﻮارد ‪ Resource‬وﻣﻠﻔـﺎت اﻟﻔﺌـﺎت اﻟﺘـﻲ ﺗﻨﺘﻬـﻲ ﺑﺎﻻﻣﺘـﺪاد ‪ h‬وﻏﻴﺮهـﺎ ﻣـﻦ‬
‫اﻟﻤﻠﻔﺎت‪.‬‬
‫‪-.2.1‬ﻣﻼﺣﻈﺔ‪:‬‬
‫آﻞ ﻓﺌﺎت ‪ MFC‬ﺗﺤﻤﻞ اﺳﻤﺎ ﻳﺒﺘﺪئ ﺑـﺎﻟﺤﺮف ‪ C‬ﻣﺜـﻞ ‪ CDocument,CView‬ﻟﻬـﺬا ﻳﻨﺼـﺢ ﺑﺸـﺪة اﻟﺘـﺰام هـﺬا‬
‫اﻷﻣﺮ ﻹﻧﺸﺎء ﻓﺌﺎت ﻧﻈﻴﻔﺔ وﻓﻌﺎﻟﺔ وأﻳﻀﺎ ﻗﻴﺎﺳﻴﺔ‪.‬‬
‫أﻣﺎ أﻋﻀﺎء اﻟﻔﺌﺎت ‪ Members‬ﻓﺈﻧﻬﺎ ﺗﺴﺘﻬﻞ ﺑﺎﻟﺒﺎدﺋﺔ _‪m‬‬
‫‪ 23‬ﺑﻨﺎء ﺗﻄﺒﻴﻖ ﻧﻮاﻓﺬي )‪:(Windows‬‬
‫‪ -.1.3‬ال ‪:AppWizard‬‬
‫ﻳــﻮﻓﺮ ‪ Visual C++‬ﻣﻌﺎﻟﺠــﺎ ﻳــﺪﻋﻰ ‪ AppWizard‬ﻳﺘــﻮﻟﻰ وﻳﻐﻨﻴﻨــﺎ ﻋــﻦ ﻣﻬﻤــﺔ ﻋﻈﻴﻤــﺔ وهــﻲ ﺑﻨــﺎء هﻴﻜــﻞ‬
‫اﻟﺒﺮﻧﺎﻣﺞ اﻟﺬي ﻧﻮد ﺗﻄﻮﻳﺮﻩ ﻓﻬﻮ ﻳﻌﺮﱢف ﺗﻠﻘﺎﺋﻴﺎ ﺟﻤﻴﻊ اﻟﻔﺌﺎت اﻟﻀﺮورﻳﺔ ﻟﺘﻄـﻮﻳﺮ ﺑﺮﻧـﺎﻣﺞ وﻳﻨـﺪوز ﻋﻠـﻰ أي ﻧﻤـﻂ‬
‫ﺗﺮﻳﺪﻩ وﻓﻴﻤﺎ ﻳﻠﻲ ﻋﺮض ﻟﻜﻴﻔﻴﺔ اﺳﺘﻌﻤﺎل هﺬا اﻟﻤﻌﺎﻟﺞ اﻟﺴﺤﺮي اﺗﺒﻊ اﻟﺨﻄﻮات اﻟﺘﺎﻟﻴﺔ‪:‬‬

‫اﻟﺨﻄﻮة ‪ :1‬ﻓﺘﺢ ﻣﺸﺮوع ﺟﺪﻳﺪ‪:‬‬


‫اﻟﺨﻄﻮة ‪ :2‬اﺧﺘﺮ اﻟﻨﻮع )‪ ، MFC AppWizard (exe‬واآﺘﺐ اﺳﻢ اﻟﻤﺸﺮوع ﺑﺎﻷﺣﺮف اﻟﻼﺗﻴﻨﻴﺔ وﺣـﺪد ﻣﺴـﺎر‬
‫وﺿﻊ اﻟﻤﻠﻔﺎت اﻟﻤﺸﺮوع واﺣﺬر أن ﻳﻜﻮن ﺿﻤﻦ اﺳـﻢ اﻟﻤﺴـﺎر آﻠﻤـﺔ ﻋﺮﺑﻴـﺔ ﻓﻘـﺪ ﺳـﺒﺐ ﻟـﻲ أﻧـﺎ ﺷﺨﺼـﻴﺎ‬
‫ﻣﺸﻜﻠﺔ ﻋﻨﺪ ﺗﻔﺴﻴﺮ اﻟﺒﺮﻧﺎﻣﺞ وﻟﻢ أﺗﻔﻄﻦ ﻟﻬﺎ إﻻ ﺑﻌﺪ ﺟﻬﺪ ‪.‬‬
‫اﻟﺨﻄﻮة ‪ :3‬اﺧﺘﺮ ﻧﻮع اﻟﻤﺴﺘﻨﺪ اﻟﺬي ﺗﻮد إﻧﺸﺎءﻩ ﺑﺴﻴﻂ ‪ SDI‬أو ﻣﺘﻌﺪد ‪: MDI‬‬

‫ﻓﻲ أﻏﻠﺐ اﻷﺣﻴﺎن ﻳﺴﺘﺤﺴﻦ اﻻﺣﺘﻔﺎظ ﺑﺎﻟﻘﻴﻢ اﻻﻓﺘﺮاﺿﻴﺔ ﻓﻲ اﻟﺨﻄﻮات ‪ 6 5 4‬و ‪7‬‬

‫اﻟﺨﻄﻮة ‪ :4‬ﺗﺤﺪﻳﺪ ﻗﺎﻋﺪة اﻟﺒﻴﺎﻧﺎت اﻟﻤﺮﺑﻮﻃﺔ ﺑﺎﻟﺘﻄﺒﻴﻖ ) ﺧﻴﺎر ﻣﺤﺘﻤﻞ ﻋﻨﺪ اﻟﺘﻌﺎﻣﻞ ﻣﻊ ﻗﻮاﻋﺪ اﻟﺒﻴﻨﺎت(‪.‬‬

‫اﻟﺨﻄﻮة ‪ :5‬هﺬﻩ اﻟﺨﻄﻮة ﻟﺮﺑﻂ آﺎﺋﻨﺎت ‪ OLE‬و ‪ ActiveX‬ﺑﺎﻟﺘﻄﺒﻴﻖ ﻏﺎﻟﺒﺎ ﻳﻜﻮن اﻟﺘﻄﺒﻴﻖ ﺑﺤﺎﺟﺔ إﻟـﻰ ﻣﻠﻔـﺎت‬
‫‪ ActiveX‬أﺧﺮى‪.‬‬
‫اﻟﺨﻄﻮة ‪ :6‬ﻗﺎﺋﻤﺔ ﻟﺨﻴﺎرات ﻣﺘﻌﺪد ﻳﺪﻣﺠﻬﺎ اﻟﻤﻌﺎﻟﺞ ﻓﻲ ﺗﻄﺒﻴﻘﻚ ﻣﺜـﻞ إدراج ﺷـﺮﻳﻂ اﻟﺤﺎﻟـﺔ ودﻋـﻢ آﺎﺋﻨـﺎت‬
‫ﺛﻼﺛﻴﺔ اﻷﺑﻌﺎد وﻏﻴﺮهﺎ اﺧﺘﺮ ﻣﻨﻬﺎ ﻣﺎ ﺗﺸﺎء‪.‬‬

‫اﻟﺨﻄﻮة ‪ :7‬اﺧﺘـﺮ ﻧﻤـﻂ ‪ Style‬اﻟﺘﻄﺒﻴـﻖ ﺧﻴـﺎر ‪ Windows Explorer‬ﻳﻨﺸـﺊ اﻟﺒﺮﻧـﺎﻣﺞ ﺷـﺒﻴﻪ ﺑﻤﺴﺘﻜﺸـﻒ‬
‫اﻟﻮﻳﻨﺪوز‪.‬‬
‫اﻟﺨﻄﻮة ‪ :8‬اﺧﺘﺮ اﻟﻔﺌﺔ اﻟﺘﻲ ﻳﻌﺘﻤﺪ ﻋﻠﻴﻬﺎ اﻟﺘﻄﺒﻴﻖ‬

‫وﻓﻲ اﻷﺧﻴﺮ ﻋﺮض ﻟﺘﻘﺮﻳﺮ اﻟﺒﺮﻧﺎﻣﺞ ﺑﺨﻴﺎراﺗﻪ اﻟﻤﺤﺪدة‪:‬‬


‫‪ -. 2 . 3‬ﻧﻈﺮة ﻋﻠﻰ اﻟﻔﺌﺎت اﻟﻤﻮﻟﺪة ‪:‬‬
‫ال ‪ AppWizard‬ﻳﻮﻟﺪ داﺋﻤﺎ اﻟﻔﺌﺎت اﻟﺘﺎﻟﻴﺔ‪:‬‬
‫‪ : CMainFrame‬ﺗﻤﺜﻞ اﻟﻨﺎﻓﺬة اﻟﺮﺋﻴﺴﻴﺔ ﻟﻠﺘﻄﺒﻴﻖ اﻟﺘﻲ ﺗﺤﺘﻮي ﻋﻠﻰ اﻟﻘﻮاﺋﻢ وأﺷﺮﻃﺔ اﻷدوات وﺷﺮﻳﻂ‬
‫اﻟﺤﺎﻟﺔ‪.‬‬
‫‪ :CChildFrame‬ﺗﻮﻟﺪ هﺬﻩ اﻟﻔﺌﺔ ﻋﻨﺪﻣﺎ ﻳﻜﻮن ﻧﻮع اﻟﺘﻄﺒﻴﻖ ﻣﺘﻌﺪد اﻟﻤﺴﺘﻨﺪات ‪ MDI‬وآﻞ آﺎﺋﻦ ﻣﻦ هﺬﻩ‬
‫اﻟﻔﺌﺔ ﻳﻤﺜﻞ ﻣﺴﺘﻨﺪا ﺟﺪﻳﺪا ﻟﻠﺘﻄﺒﻴﻖ‪.‬‬
‫‪) : C<Project Name>App‬ﻣﺜﻞ ‪ (CDemoApp‬ﺗﻤﺜﻞ هﺬﻩ اﻟﻔﺌﺔ ﺷﻜﻞ اﻟﺘﻄﺒﻴﻖ وﺗﺤﺘﻮي ﻋﻠﻰ‬
‫ﻃﺮﻳﻘﺔ هﺎﻣﺔ و هﻲ ‪ InitInstance‬وهﻲ ﺗﻤﺜﻞ ﺑﺪاﻳﺔ إﻧﺸﺎء اﻟﺒﺮﻧﺎﻣﺞ‪.‬‬
‫‪) : C<Project Name>Doc‬ﻣﺜﻞ ‪ (CDemoDoc‬ﻓﺌﺔ ﺗﻤﺜﻞ آﻞ ﻣﺴﺘﻨﺪ ﻣﻦ اﻟﺘﻄﺒﻴﻖ وهﻲ ﺑﺪورهﺎ‬
‫ﺗﺤﺘﻮي ﻋﻠﻰ أﻋﻀﺎء ﺗﻤﺜﻞ اﻟﻤﺴﺘﻨﺪ‬
‫‪) : C<Project Name>View‬ﻣﺜﻞ ‪ (CDemoView‬ﻓﺌﺔ ﺗﻤﺜﻞ ال ‪ View‬اﻟﺮﺋﻴﺴﻴﺔ ﻟﻠﻤﺴﺘﻨﺪ وهﻲ‬
‫اﻟﻤﻌﺮﻓﺔ ﻓﻲ اﻟﺨﻄﻮة اﻟﺜﺎﻣﻨﺔ‪.‬‬
‫ﻳﺘﻌﻠﻖ ﺑﻜﻞ ﻓﺌﺔ ﻣﻠﻔﺎن ﻣﻠﻒ ﺑﺎﻟﻤﺘﺪاد "‪ ".h‬اﻟﺬي ﻳﻌﺮف آﻞ أﻋﻀﺎء اﻟﻔﺌﺔ ﻣﻦ ﻃﺮق وﻣﺘﻐﻴﺮات واﻟﺜﺎﻧﻲ‬
‫ﺑﺎﻻﻣﺘﺪاد "‪ ".cpp‬واﻟﺬي ﻳﻤﺜﻞ هﻴﻜﻞ اﻟﻄﺮق‪.‬‬
‫‪ -. 2 . 3‬ﺗﻔﺴﻴﺮ اﻟﺒﺮﻧﺎﻣﺞ وﺗﻨﻔﻴﺬﻩ‪:‬‬

‫ﺑﻌﺪ ﺗﻔﺴـﻴﺮ اﻟﺒﺮﻧـﺎﻣﺞ وﺗﺸـﻐﻴﻠﻪ ﺳﻨﺤﺼـﻞ ﻋﻠـﻰ ﺗﻄﺒﻴـﻖ ‪ Windows‬ﻗﻴﺎﺳـﻲ )اﻟﻨﺎﻓـﺬة اﻟﺮﺋﻴﺴـﻴﺔ اﻟﻘـﻮاﺋﻢ‬
‫ﺷﺮﻳﻂ اﻷدوات ‪(...‬وذﻟﻚ ﺑﺪون آﺘﺎﺑﺔ ﺳﻄﺮ واﺣﺪ ﻣﻦ اﻟﻜﻮد أﻟﻴﺲ هﺬا راﺋﻌﺎ!‪.‬‬

‫هﺬا اﻟﺘﻄﺒﻴﻖ ﻣﺒﻨﻲ ﻋﻠﻰ واﺟﻬﺔ ﻣﺘﻌﺪدة اﻟﻤﺴﺘﻨﺪات ‪ MDI‬ﻓﻴﻤﻜﻨﻚ إﻧﺸﺎء أآﺜﺮ ﻣﻦ ﻣﺴﺘﻨﺪ واﺣـﺪ ﻓـﻲ ﺁن‬
‫واﺣﺪ ﺟﺮب اﻷﻣﺮ ‪ New‬ﻣﻦ اﻟﻘﺎﺋﻤﺔ ‪. File‬‬
:‫ ﺗﺸﺨﻴﺺ اﻟﺘﻄﺒﻴﻖ‬-.1 .4
. InitInstance ‫ ﺑﻴﺎن آﻴﻒ ﻳﺒﻨﻰ اﻟﺒﺮﻧﺎﻣﺞ واﻟﻄﺮﻳﻘﺔ‬. 1. 4
‫ ﺗﺒﻴﻦ هﻨﺪﺳﺔ اﻟﺒﺮﻧﺎﻣﺞ اﻟﻌﺎﻣـﺔ وآﻴـﻒ ﻳـﺘﻢ ﺑﻨـﺎؤﻩ آـﻮد هـﺬﻩ‬CDemoApp ‫ ﻣﻦ اﻟﻔﺌﺔ‬InitInstance ‫اﻟﻄﺮﻳﻘﺔ‬
‫ أﻣﺎ أﻧﺎ وأﻧﺖ ﻋﺰﻳﺰي اﻟﻤﺒﺮﻣﺞ ﻓـﻼ ﻳﻬﻤﻨـﺎ ﻣـﻦ هـﺬا اﻟﻜـﻮد‬AppWizard ‫اﻟﻄﺮﻳﻖ ﻳﺘﻢ ﺗﻮﻟﻴﺪﻩ ﺑﻮاﺳﻄﺔ اﻟﻤﻌﺎﻟﺞ‬
:‫ﺳﻮى اﻟﺴﻄﻮر اﻟﺘﺎﻟﻴﺔ‬


// Register the application's document templates. Document templates
// serve as the connection between documents, frame windows and views.
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
MDI‫إﻧﺸﺎء ﻣﺴﺘﻨﺪ ﻣﻦ ﻧﻮع‬
IDR_DEMOTYPE,
RUNTIME_CLASS(CDemoDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CDemoView));
AddDocTemplate(pDocTemplate);
// create main MDI Frame window ‫إﻧﺸﺎء إﻃﺎر اﻟﻨﺎﻓﺬة اﻟﺮﺋﻴﺴﻴﺔ‬
CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
return FALSE;
m_pMainWnd = pMainFrame;

‫اﻟﻮﺳــﻴﻂ اﻷول ﻟﻠﻄﺮﻳﻘــﺔ ‪ CMultiDocTemplate‬وهــﻮ ‪ IDR_DEMOTYPE‬ﻳﻌــﺮف اﻟﻘﺎﺋﻤــﺔ وﺷــﺮﻳﻂ‬
‫اﻷدوات اﻟﻤﺴﺘﻌﻤﻼن ﻓﻲ اﻟﺘﻄﺒﻴﻖ واﻟﻮﺳﺎﺋﻂ اﻟﺜﻼﺛﺔ اﻟﺘﺎﻟﻴﺔ ﺗﻌﺮف اﻟﻤﺴﺘﻨﺪ )‪ (CDemoDoc‬اﻟﻨﺎﻓﺬة اﻹﺑـﻦ‬
‫)‪ (CChildFrame‬و اﻟﻤﻨﻈﺮ ‪ View‬اﻟﻤﺮﺑﻮط ﻣﻊ اﻟﻤﺴﺘﻨﺪ )‪(CDemoView‬‬
‫أﻣﺎ اﻟﻤﺎآﺮو ‪ RUNTIME_CLASS‬ﻓﻬﻮ ﻳﺴﻤﺢ ﺑﺘﻌﻴﻴﻦ ﻧﻮع اﻟﻔﺌﺔ أﺛﻨﺎء اﻟﺘﺸﻐﻴﻞ‬
‫‪ - .2 .4‬إﺿﺎﻓﺔ اﻟﻜﻮد ‪ :‬ﻣﺜﺎل ﻣﻊ اﻟﻄﺮﻳﻘﺔ ‪.Ondraw‬‬
‫آﻞ ﻓﺌﺔ ﻣﻦ اﻟﻨﻮع ‪ CView‬ﺗﺸﺘﻤﻞ ﻋﻠﻰ اﻟﻄﺮﻳﻘﺔ ‪ OnDraw‬ﻳﻮﻟـﺪهﺎ اﻟﻤﻌـﺎﻟﺞ ‪ AppWizard‬ﺗﺴـﻤﺢ ﺑﺎﻟﻜﺘﺎﺑـﺔ‬
‫أو اﻟﺮﺳﻢ ﻓﻲ اﻟﻤﻨﻈﺮ ‪. View‬‬
‫اﻟﻄﺮﻳﻘﺔ ‪ OnDraw‬ﺗﺄﺧﺬ اﻟﻮﺳﻴﻂ ‪ pDC‬ﻣﻦ اﻟﻔﺌﺔ ‪ CDC‬أﻧﻈﺮ إﻟﻰ اﻟﻜﻮد اﻟﻤﻮﻟﺪ‪:‬‬
‫‪//////////////////////////////////////////////////‬‬
‫‪// CDemoView drawing‬‬
‫)‪void CDemoView::OnDraw(CDC* pDC‬‬
‫{‬
‫;)(‪CDemoDoc* pDoc = GetDocument‬‬
‫;)‪ASSERT_VALID(pDoc‬‬
‫‪// TODO: add draw code for native data here‬‬
‫}‬

‫ﻣﻼﺣﻈﺔ‪ :‬اﻟﻔﺌﺔ ‪ CDC‬ﺗﺤﺘﻮي ﻋﻠﻰ آﻞ اﻷدوات اﻟﻀﺮورﻳﺔ ﻟﻠﺮﺳﻢ واﻟﻜﺘﺎﺑﺔ‪.‬‬


‫إذا أردﻧﺎ إﺿﺎﻓﺔ ﺳﻄﺮ ﻣﻦ اﻟﻜﻮد ﻳﺴﻤﺢ ﻟﻨﺎ ﺑﻜﺘﺎﺑﺔ اﻟﺴﻠﺴﻠﺔ "ﻣﺮﺣﺒﺎ"ﻋﻠـﻰ اﻟﺸﺎﺷـﺔ ﻓﺎﻟﻄﺮﻳﻘـﺔ اﻟﻤﻨﺎﺳـﺒﺔ‬
‫هﻲ ‪ TextOut‬أﺿﻒ اﻟﺴﻄﺮ اﻟﺘﺎﻟﻲ اﻟﻤﻮﺿﺢ ﺑﺎﻷزرق‪:‬‬
‫‪/////////////////////////////////////////////////////////////////////////////‬‬
‫‪// CDemoView drawing‬‬

‫)‪void CDemoView::OnDraw(CDC* pDC‬‬


‫{‬
‫;)(‪CDemoDoc* pDoc = GetDocument‬‬
‫;)‪ASSERT_VALID(pDoc‬‬
‫‪// TODO: add draw code for native data here‬‬
‫;)"ﻣﺮﺣﺒﺎ"‪pDC->TextOut(10,10,‬‬
‫}‬
‫ﺑﻌﺪ اﻟﺘﺸﻐﻴﻞ ﺗﺤﺼﻞ ﻋﻠﻰ هﺬﻩ اﻟﻨﺎﻓﺬة‪:‬‬
‫اﻟﻜﻠﻤــﺔ ﻣﺮﺣﺒــﺎ آﺘﺒــﺖ ﺑﻘﻴــﺎس ‪ pixels 10‬ﻣــﺎﺑﻴﻦ ‪ x‬و‪ y‬ﻓــﻲ اﻟﺠﺎﻧــﺐ اﻟﻌﻠــﻮي ﻣــﻦ اﻟﻴﺴــﺎر ﻟﻠﻨﺎﻓــﺬة‬
‫اﻟﺮﺋﻴﺴﻴﺔ‪.‬‬

‫‪ - .3 .4‬إﺿﺎﻓﺔ ﻧﻤﻮذج ﻣﺮﺋﻲ ﻳﻤﻜﻦ اﻟﺘﻌﺎﻣﻞ ﻣﻌﻪ أﺛﻨﺎء اﻟﺘﺼﻤﻴﻢ‪:‬‬


‫ﻹﺿــﺎﻓﺔ ﻋﻨﺼــﺮ ﺟﺪﻳــﺪ اﻧﻘــﺮ ﻋﻠــﻰ اﻟﺸــﺮﻳﺤﺔ » ‪ « RessourceView‬اﻧﺸــﺮ اﻟﻌﻨﺼــﺮ » ‪ « Dialog‬واﻧﻘــﺮ ﺑــﺰر‬
‫اﻟﻤﺎوس اﻷﻳﻤﻦ وا ﺧﺘﺮ ﻣﻦ اﻟﻘﺎﺋﻤﺔ اﻟﻔﺮﻋﻴﺔ اﻷﻣﺮ » ‪.« Insert‬‬

‫ﻓﻲ اﻟﻨﻤﻮذج ‪ Insert Resource‬اﻧﺸﺮ اﻟﻌﻨﺼﺮ ‪ Dialog‬واﺧﺘﺮ ﻧﻮع اﻟﻨﻤﻮذج وﻟﻴﻜﻦ ﻣﺜﻼ “‪.”FormView‬‬
‫أﺿﻒ ﺑﺎﻟﻤﺎوس ﻣﻦ ﺻﻨﺪوق اﻷدوات زري أﻣﺮ إﻟﻰ اﻟﻨﻤﻮذج اﻟﺠﺪﻳﺪ‪.‬‬

‫اﻧﻘﺮ ﺑﺰر اﻟﻔﺄرة اﻷﻳﻤﻦ ﻋﻠﻰ أﺣﺪ اﻟﺰرﻳﻦ واﺧﺘﺮ اﻷﻣﺮ “‪ ”Properties‬ﺗﻈﻬﺮ ﻟﻚ اﻟﻨﺎﻓﺬة اﻟﺘﺎﻟﻴـﺔ اﻟﺘـﻲ ﺗﺘـﻴﺢ ﻟـﻚ‬
‫ﺗﻐﻴﻴﺮ ﺧﺼﺎﺋﺺ اﻷدوات ﻣﺜﻞ اﻟﺘﺴﻤﻴﺔ ‪ Caption‬وﻣﻌﺮف ‪ ID‬اﻷداة وﻏﻴﺮهﺎ ﻣﻦ اﻟﺨﺼﺎﺋﺺ‪.‬‬

‫ﺑﻘﻴﺖ اﻟﻨﻘﻄﺔ اﻟﻬﺎﻣﺔ وهﻲ إﺷﺮاك اﻟﻨﻤﻮذج ﺑﻔﺌﺔ ﻣﻮﺟﻮد أو ﺟﺪﻳﺪة وهﻲ ﺗﻌﺘﺒﺮ روح اﻟﺘﻲ ﺑﻬﺎ ﺣﻴﺎة اﻟﻨﻤـﻮذج‬
‫اﻟﺘﻲ ﻳﻤﻜﻨﻨﺎ ﻣﻦ ﺧﻼﻟﻬﺎ اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻷﺣﺪاث واﻟﺨﺼﺎﺋﺺ واﻟﻄﺮق‬
‫ﻹﺷﺮاك ﻓﺌﺔ ﺟﺪﻳﺪة ﺑﺎﻟﻨﻤﻮذج اﻧﻘﺮ ﺑﺰر اﻟﻤﺎوس اﻷﻳﻤﻦ ﻋﻠﻰ ﻣﻜﺎن ﻓـﺎرغ ﻓـﻲ اﻟﻨﻤـﻮذج واﺧﺘـﺮ ﻣـﻦ اﻟﻘﺎﺋﻤـﺔ‬
‫اﻟﻤﻨﺴﺪﻟﺔ اﻟﺨﻴﺎر “‪”ClassWizard‬‬
‫ﺳﻨﻨﺸﺊ ﻓﺌﺔ ﺟﺪﻳﺪة وﻋﻨﺪ ﻇﻬﻮر اﻟﻨﺎﻓﺬة اﻟﻤﻮاﻟﻴﺔ اآﺘﺐ اﺳﻢ اﻟﻔﺌﺔ ﻓﻲ اﻟﺨﺎﻧﺔ ‪ Name‬ﻣﻊ ﻣﺮاﻋـﺎة اﻟﺒﺎدﺋـﺔ‬
‫‪ C‬وﻟﻴﻜﻦ اﺳﻢ اﻟﻔﺌﺔ ‪ CFormulaire‬ﺛﻢ ﺣﺪد ﻧﻮع اﻟﻔﺌﺔ ﻋﻠﻰ اﻟﻌﻨﺼﺮ ‪.CFormView‬‬

‫ﻟﺘﻐﻴﻴﺮ آـﻮد اﻟﻄﺮﻳﻘـﺔ ‪ InitInstance‬اﻟﺘﺎﺑﻌـﺔ ﻟﻠﻔﺌـﺔ ‪ CDemoApp‬اﻧﻘـﺮ ﻋﻠـﻰ اﻟﺸـﺮﻳﺤﺔ "‪ "Class View‬اﻧﻘـﺮ‬
‫ﻋﻼﻣﺔ اﻟﺠﻤﻊ ﻓﻲ اﻟﻔﺌﺔ ‪ CDemoApp‬ﺛﻢ اﻧﻘﺮ ﻧﻘﺮا ﻣﺰدوﺟﺎ ﻋﻠﻰ اﺳﻢ اﻟﻄﺮﻳﻘﺔ ‪.InitInstance‬‬
#include "Formulaire.h"
‫ﻱﻀﺎف ﻓﻲ أﻋﻠﻰ اﻟﻔﺌﺔ‬
// Register the application's document templates. Document templates
// serve as the connection between documents, frame windows and views.

CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_DEMOTYPE,
RUNTIME_CLASS(CDemoDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CFormulaire));
CFormulaire ‫ إﻟﻰ‬View ‫ﻏﻴﺮ ال‬
AddDocTemplate(pDocTemplate);

// create main MDI Frame window


CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
return FALSE;
m_pMainWnd = pMainFrame;

:‫ﺑﻌﺪ ﺗﻔﺴﻴﺮ اﻟﺘﻄﺒﻴﻖ وﺗﻨﻔﻴﺬﻩ ﻧﺤﺼﻞ ﻋﻠﻰ هﺬا اﻟﺸﻜﻞ‬

.(”splitter“) ‫إﺿﺎﻓﺔ ﻓﺎﺻﻞ‬-.4 .4


‫ ﻟﻔﻌــﻞ ذﻟــﻚ ﻳﺠــﺐ إﻧﺸــﺎء ﻓﺎﺻــﻞ‬،‫آﺜﻴــﺮا ﻣــﺎ ﻧﺤﺘــﺎج ﻓــﻲ ﺗﻄﺒﻴﻘﺎﺗﻨــﺎ إﻟــﻰ دﻣــﺞ ﻣﺴــﺘﻨﺪﻳﻦ ﻓــﻲ إﻃــﺎر واﺣــﺪ‬
‫”( وﺟﻌﻞ هﺬﻳﻦ اﻟﻤﺴﺘﻨﺪﻳﻦ ﺑﻴﻦ هﺬا اﻟﻔﺎﺻﻞ وﻗﺪ ﻳﻜﻮن اﻟﻤﺴﺘﻨﺪان ﻣﻦ ﻧﻮع ﻣﺨﺘﻠﻒ أو ﻣـﻦ ﻧـﻮع‬splitter“)
‫واﺣﺪ‬
‫إذن ﻳﺠﺐ أوﻻ إﻧﺸﺎء ﻓﺌﺔ ﻣﻦ اﻟﻨﻮع “‪ ”CSplitterWnd‬اﻟﻤﺸﺘﻘﺔ ﻣﻦ اﻟﻔﺌﺔ “‪.”CWnd‬‬
‫ﺣﺪد اﻟﺸﺮﻳﺤﺔ “‪ ”ClassView‬ﺿﻊ ﻣﺆﺷﺮ اﻟﻔﺄرة ﻋﻠﻰ اﺳـﻢ اﻟﻤﺸـﺮوع واﻧﻘـﺮ ﺑـﺎﻟﺰر اﻷﻳﻤـﻦ ﺛـﻢ اﺧﺘـﺮ اﻷﻣـﺮ‬
‫‪ New Class‬أﺿﻒ ﻓﺌﺔ ﺗﻌﺘﻤﺪ ﻋﻠﻰ اﻟﻔﺌﺔ ‪.Splitter‬‬

‫ﺑﻤﺠﺮد إﻧﺸﺎء ﻓﺌﺔ ﻣﻦ ﻧﻮع ‪ Splitter‬ﻳﺠﺐ ﺗﻌﺮﻳﻒ اﻟﻌﻨﺎﺻﺮ اﻟﺘﻲ ﺳﻨﺪﻣﺠﻬﺎ ﻓﻲ إﻃﺎر واﺣﺪ وﻧﻔﺼﻠﻬﺎ ﺑﺎﻟﻔﺎﺻﻞ‬
‫اﻟﻔﺌﺔ ‪ CSplitter‬ﺗﺤﺘﻮي ﻋﻠﻰ ﻃﺮﻳﻘﺔ ﺗﻨﺸﺄ ﺗﻠﻘﺎﺋﻴﺎ ﺗﻘﻮم ﺑﻬﺬﻩ اﻟﻤﻬﻤـﺔ ﺣﺴـﺐ اﻟﻤﺘﻄﻠﺒـﺎت وهـﻲ اﻟﻄﺮﻳﻘـﺔ‬
‫‪.OnCreateClient‬‬
CSplitter ‫هﺎهﻮ اﻟﻜﻮد اﻟﻤﻮﻟﺪ أﺛﻨﺎء إﻧﺸﺎء اﻟﻔﺌﺔ‬
BOOL CSplitter::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext*
pContext)
{
return m_wndSplitter.Create(this,
2, 2, // TODO: adjust the number of rows, columns
CSize(10, 10), // TODO: adjust the minimum pane size
pContext);
}

:‫اﺳﺘﺒﺪﻟﻪ ﺑﺎﻟﻜﻮد اﻟﺘﺎﻟﻲ‬


BOOL CSplitter::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext*
pContext)
{
if (!m_wndSplitter.CreateStatic(this, 1, 2))//2‫ وﺣﻘﻠﻴﻦ‬1‫إﻧﺸﺎء ﻓﺎﺻﻞ ذي ﺧﻂ‬
{
TRACE0("Failed to CreateStaticSplitter\n");
return FALSE;
}
if (!m_wndSplitter.CreateView(0, 0,//‫إﺿﺎﻓﺔ اﻟﻠﻮح اﻷول ﻣﻦ اﻟﻔﺎﺻﻞ‬
RUNTIME_CLASS(CFormulaire), CSize(300, 0), pContext))
{
TRACE0("Failed to create first pane\n"); ‫ﻣﻮﺿﻊ اﻟﻔﺎﺻﻞ ﺑﻴﻦ اﻟﻠﻮﺣﻴﻦ‬
return FALSE;
}
if (!m_wndSplitter.CreateView(0, 1,//‫إﻧﺸﺎء اﻟﻠﻮح اﻟﺜﺎﻧﻲ ﻣﻦ اﻟﻔﺎﺻﻞ‬
RUNTIME_CLASS(CDemoView), CSize(0, 0), pContext))
{
TRACE0("Failed to create second pane\n");
return FALSE;
}
SetActiveView((CView*)m_wndSplitter.GetPane(0,1));// ‫ﺗﻨﺸﻴﻂ ال‬View
return TRUE;
}
‫آﻤﺎ ﻻ ﺗﻨﺴﻰ ﺗﺼﺮﻳﺢ هﺬﻳﻦ اﻟﻤﻠﻔﻴﻦ ﻓﻲ أﻋﻠﻰ اﻟﻔﺌﺔ‬
#include "Formulaire.h"
#include "DemoView.h"
‫ وﺿﺒﻄﻬﺎ ﻋﻠﻰ اﻟﻔﺎﺻﻞ‬InitInstance ‫وﺑﻌﺪ ذﻟﻚ ﻳﺠﺐ إﻋﺎدة ﺗﻬﻴﺌﺔ اﻟﻄﺮﻳﻘﺔ‬
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_DEMOTYPE,
RUNTIME_CLASS(CDemoDoc),
RUNTIME_CLASS(CSplitter), // custom MDI child frame
RUNTIME_CLASS(CDemoView));
AddDocTemplate(pDocTemplate);
‫ ﻓﻲ أﻋﻠﻰ اﻟﻔﺌﺔ اﻟﺘﻲ ﺗﺤﺘﻮي ﻋﻠﻰ هﺬﻩ اﻟﻄﺮﻳﻘﺔ وهﻲ‬CSplitter ‫دون أن ﺗﻨﺴﻰ ﺗﺼﺮﻳﺢ ﻣﻠﻒ اﻟﻔﺌﺔ‬
CDemoApp ‫اﻟﻔﺌﺔ‬
#include "Splitter.h"
CDemoView ‫آﻤﺎ ﻳﺠﺐ أﻳﻀﺎ إﺿﺎﻓﺔ هﺬا اﻟﺘﺼﺮﻳﺢ ﻓﻲ أﻋﻠﻰ اﻟﻔﺌﺔ‬
#include "DemoDoc.h"
‫ﺑﻌﺪ اﻟﺘﻔﺴﻴﺮ واﻟﺘﺸﻐﻴﻞ ﺳﺘﺤﺼﻞ ﻋﻠﻰ ﻣﺎ ﻳﻠﻲ ﻣﺴﺘﻨﺪ ﻳﺤﻤﻞ ﻧﻤﻮذﺟﻴﻦ ﻣﻔﺼﻮﻻ ﺑﻴﻨﻬﻤـﺎ ﺑﻔﺎﺻـﻞ ﻋﻤـﻮدي‬
.‫ﻗﺎﺑﻞ ﻟﻺزاﺣﺔ‬

:‫ اﻻﺗﺼﺎل ﺑﻴﻦ ﻣﻨﻈﺮﻳﻦ‬-.5


‫ﻟﻨﺄﺧﺬ اﻟﻤﺜﺎل اﻟﺴﺎﺑﻖ وﻧﻈﻴﻒ إﻟﻴﻪ هﺎﺗﻴﻦ اﻟﻌﻤﻠﻴﺘﻴﻦ‪:‬‬
‫‪ 9‬ﺑﺎﻟﻨﻘﺮ ﻋﻠﻰ اﻟﺰر اﻷول ﻓﻲ اﻟﻤﻨﻈﺮ ‪ Formulaire‬ﻧﻜﺘﺐ اﻟﺒﺴﻤﻠﺔ ﻓﻲ اﻟﻤﻨﻈﺮ اﻟﺜﺎﻧﻲ‬
‫‪ 9‬ﺑﺎﻟﻨﻘﺮ ﻋﻠﻰ اﻟﺰر اﻟﺜﺎﻧﻲ ﻧﻌﺮض ﻣﺮﺑﻊ ﺣﻮار ﺑﺴﻴﻂ ﻋﻠﻰ اﻟﺸﺎﺷﺔ‪.‬‬
‫‪ -.1 .5‬ﺗﺼﺮﻳﺢ ﺣﺪث ﺑﻮاﺳﻄﺔ ‪ClassWizard‬‬
‫ﻟﺮﺑﻂ ﺣﺪث اﻟﻨﻘﺮ ﺑﺎﻟﺰر أﻧﻘﺮ ﻋﻠﻰ اﻟﺸﺮﻳﺤﺔ “‪ ”RessourceView‬اﻓـﺘﺢ ﻋﻼﻣـﺔ اﻟﺠﻤـﻊ ﻓـﻲ اﻟﻌﻨﺼـﺮ "‪"Dialog‬‬
‫واﺧﺘﺮ اﻟﻨﺎﻓﺬة ‪ IDD_FORMVIEW‬واﻧﻘﺮ ﻋﻠﻴﻬﺎ ﻧﻘـﺮا ﻣﺰدوﺟـﺎ ﻹﻇﻬﺎرهـﺎ أﻧﻘـﺮ ﻋﻠـﻰ اﻟـﺰر اﻷول ﺑـﺰر اﻟﻤـﺎوس‬
‫اﻷﻳﻤﻦ واﺧﺘﺮ ‪ClassWizard‬‬

‫اﻧﻘﺮ “‪ ”Add Function‬ﻏﻴﺮ إن ﺷﺌﺖ اﺳﻢ اﻟﺤﺪث ﺑﺎﺳﻢ ﻣﻌﺒﺮ ﺛﻢ اﻧﻘﺮ “‪.”Edit Code‬‬

‫اﻟﺤﺪث ‪ OnButton1‬ﺳﻴﺘﻢ اﺳﺘﺪﻋﺎؤﻩ ﻓﻲ آﻞ ﻣﺮة ﻳﻨﻘﺮ ﻋﻠﻴﻪ ﺑﺎﻟﻤﺎوس‪.‬‬


‫هﺬﻩ هﻲ اﻟﺸﻴﻔﺮة اﻟﺘﻲ ﻳﻮﻟﺪهﺎ اﻟﻤﻌﺎﻟﺞ ﻋﻨﺪ إﺿﺎﻓﺔ اﻟﺤﺪث‬
‫)(‪void CFormulaire::OnButton1‬‬
‫{‬
‫‪// TODO: Add your control notification handler code here‬‬

‫}‬
‫‪ -.2 .5‬ﺗﻔﻌﻴﻞ اﻷﺣﺪاث‪:‬‬
‫واﻵن ﻟﻨﺮﺑﻂ اﻟﻜﻮد ﺑﺎﻟﺤﺪث ﺳﻴﺘﻢ إﺟﺮاء ﻣﺎ ﻳﻠﻲ ﻋﻨﺪ اﻟﻨﻘﺮ ﻋﻠﻰ اﻟﺰر‬
‫‪ 9‬اﺳﺘﺮﺟﺎع آﺎﺋﻦ اﻟﻤﺴﺘﻨﺪ اﻟﻤﺸﺘﺮك ﻣﻊ اﻟﻨﻤﻮذج‬
‫‪ 9‬إﻟﺤﺎق اﻟﻘﻴﻤﺔ ﺑﺎﻟﻤﺘﻐﻴﺮ اﻟﺬي ﺳﺘﻌﺮض ﻗﻴﻤﺘﻪ ﻋﻠﻰ اﻟﻤﻨﻈﺮ هﺬا اﻟﻤﺘﻐﻴﺮ ﻣﻦ ﻧﻮع ‪CString‬‬
‫‪ 9‬ﺗﺤﺪﻳﺚ اﻟﻘﻴﻤﺔ اﻟﺠﺪﻳﺪة ﺑﻮاﺳﻄﺔ اﻟﻄﺮﻳﻘﺔ ‪UpdatData‬‬
‫‪ 9‬اﺳﺘﺪﻋﺎء ﻃﺮﻳﻘﺔ اﻟﻌﺮض ‪ UpDateAllViews‬اﻟﺘﻲ ﺑﺪورهﺎ ﺗﺴﺘﺪﻋﻲ اﻟﻄﺮﻳﻘﺔ ‪OnDraw‬‬
/////////////////////////////////////////////////////////////////////////////
// CFormulaire message handlers

void CFormulaire::OnButton1()
{
CDemoDoc *pDoc = (CDemoDoc *)GetDocument();
pDoc->hello = "‫;"ﺑﺴﻢ اﷲ اﻟﺮﺣﻤﻦ اﻟﺮﺣﻴﻢ‬
UpdateData(TRUE);
pDoc->UpdateAllViews(this);
}
‫ ﻓﻲ أﻋﻠﻰ اﻟﻔﺌﺔ‬DemoDoc ‫ﻻ ﺗﻨﺲ ﺗﺼﺮﻳﺢ اﻟﻤﻠﻒ‬
#include "DemoDoc.h"

:‫ ﺑﻤﺎ ﻳﻠﻲ‬CDemoView ‫ اﻟﺘﺎﺑﻌﺔ ﻟﻠﻔﺌﺔ‬OnDraw ‫ﺑﻌﺪ ذﻟﻚ ﻳﺠﺐ أن ﺗﻘﻮم اﻟﻄﺮﻳﻘﺔ‬


.‫ اﻟﻤﻘﺼﻮد‬View ‫ اﺳﺘﺮﺟﺎع اﻟﻤﻨﻈﺮ‬9
TextOut ‫ ﻋﺮض اﻟﻘﻴﻤﺔ اﻟﺠﺪﻳﺪ ﻋﻠﻰ اﻟﺸﺎﺷﺔ ﺑﻮاﺳﻄﺔ اﻟﻄﺮﻳﻘﺔ‬9
void CDemoView::OnDraw(CDC* pDC)
{
CDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
pDC->TextOut(10,10,pDoc->hello);
}
‫ وﺗﻬﻴﺌﺘـﻪ ﻋﻠـﻰ ﺳﻠﺴﻠﺴـﺔ‬CString ‫ ﻣـﻦ ﻧـﻮع‬CDemoDoc ‫ ﻳﺠﺐ ﺗﺼﺮﻳﺤﻪ ﻋﺎﻣـﺎ ﻓـﻲ اﻟﻔﺌـﺔ‬hello ‫اﻟﻤﺘﻐﻴﺮ‬
:‫ آﻤﺎ ﻳﻠﻲ‬CDemoDoc ‫ اﻟﺘﺎﺑﻌﺔ ﻟﻠﻔﺌﺔ‬OnNewDocument ‫ﻓﺎرﻏﺔ ﻓﻲ اﻟﻄﺮﻳﻘﺔ‬
BOOL CDemoDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())

return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
hello = "";
return TRUE;
}
‫ ﺑـﺰر اﻟﻤـﺎوس‬CDemoDoc ‫ ﺛـﻢ اﻧﻘـﺮ ﻋﻠـﻰ اﻟﻔﺌـﺔ‬Class View ‫ اﻧﻘﺮ ﻋﻠـﻰ اﻟﺸـﺮﻳﺤﺔ‬hello ‫ﻟﺘﺼﺮﻳﺢ اﻟﻤﺘﻐﻴﺮ‬
:‫ ﺗﻈﻬﺮ ﻟﻚ اﻟﻨﺎﻓﺬة اﻟﺘﺎﻟﻴﺔ‬Add Member Variable ‫اﻷﻳﻤﻦ واﻧﻘﺮ‬

‫ وﺳـﻴﺘﻢ إدراج اﻟﻤﺘﻐﻴـﺮ وﻟﻠﺘﺤﻘـﻖ ﻣـﻦ ذﻟـﻚ ﺳـﺘﺠﺪﻩ ﺿـﻤﻦ ﻋﻘـﺪ‬Ok ‫ﺑﻌﺪ إدﺧﺎل اﻟﻤﻌﻄﻴﺎت اﻟﺼﺤﻴﺤﺔ اﻧﻘﺮ‬
.‫اﻟﺸﺠﺮة ﺿﻤﻦ اﻟﻔﺌﺔ اﻟﺘﺎﺑﻊ ﻟﻬﺎ‬
‫ﻧﻔﺬ اﻟﺒﺮﻧﺎﻣﺞ واﻧﻘﺮ ﻋﻠﻰ اﻟﺰر اﻷول ﺳﺘﻜﺘﺐ اﻟﺒﺴﻤﻠﺔ ﻓﻲ اﻟﻤﻨﻈﺮ اﻟﺜﺎﻧﻲ ﻣﻦ اﻟﻤﺴﺘﻨﺪ ‪:‬‬
: ‫ ﻋﺮض ﻣﺮﺑﻊ ﺣﻮار‬-.3 .5

void CFormulaire::OnButton2()
{
// TODO: Add your control notification handler code here
// TODO: Add your control notification handler code here
CDialogue *dial = new CDialogue ();
if (dial->DoModal() == IDOK) ‫ ﺗﻌﺮض ﻣﺮﺑﻎ اﻟﺤﻮار وﺗﻌﻴﺪ‬DoModal ‫اﻟﻄﺮﻳﻘﺔ‬
OK ‫ إن ﻧﻘﺮ اﻟﻤﺴﺘﺨﺪم ﻋﻠﻰ‬IDOK ‫اﻟﺜﺎﺑﺖ‬
AfxMessageBox ("‫;)"اﻟﺤﻤﺪ ﷲ‬
CANCEL ‫ إن ﻧﻘﺮ ﻋﻠﻰ‬IDCANCEL ‫أو‬

}
OK ‫إن ﻧﻘﺮ اﻟﻤﺴﺘﺨﺪم ﻋﻠﻰ‬
‫ﺳﻴﻌﺮض اﻟﺒﺮﻧﺎﻣﺞ ﻣﺮﺑﻊ رﺳﺎﻟﺔ‬

‫ ﺗﻈﻬﺮ اﻟﺮﺳﺎﻟﺔ اﻟﺘﺎﻟﻴﺔ‬Ok ‫اﻗﺮ ﻋﻠﻰ اﻟﺰر‬


‫‪ -.6‬إﻧﺸﺎء اﻟﻘﻮاﺋﻢ ‪: Menu‬‬
‫‪ -.1 .6‬إﺿﺎﻓﺔ ﻗﺎﺋﻤﺔ إﻟﻰ ﺷﺮﻳﻂ اﻟﻘﻮاﺋﻢ‪:‬‬
‫ﺣﺪد اﻟﺸﺮﻳﺤﺔ » ‪ « RessourceView‬اﻧﻘﺮ ﻋﻼﻣﺔ اﻟﺠﻤﻊ ﻓﻲ اﻟﻌﻨﺼﺮ » ‪ « Menu‬واﺧﺘﺮ اﻟﺸﺮﻳﻂ اﻟـﺬي ﺗﺮﻳـﺪ‬
‫إﺿﺎﻓﺔ اﻷﻣﺮ إﻟﻴﻪ‬

‫وﻹﺿﺎﻓﺔ ﻗﺎﺋﻤﺔ ﺟﺪﻳﺪ اﺳﺤﺐ اﻟﻤﺴـﺘﻄﻴﻞ اﻟﻔـﺎرغ إﻟـﻰ اﻟﻤﻜـﺎن اﻟﻤﺤـﺪد واآﺘـﺐ اﺳـﻢ اﻟﻘﺎﺋﻤـﺔ اﻟﺤـﺮف &‬
‫ﻳﻨﺸﺊ اﺧﺘﺼﺎر ﻓﻲ ﻟﻮﺣﺔ اﻟﻤﻔﺎﺗﻴﺢ وذﻟﻚ ﺑﺎﻟﻀﻐﻂ ﻋﻠﻰ ‪ Alt‬واﻟﺤﺮف اﻟﺬي ﺑﻌﺪ &‬
‫‪ -.2 .6‬إﺿﺎﻓﺔ أﻣﺮ إﻟﻰ اﻟﻘﺎﺋﻤﺔ‪:‬‬
‫اﻧﻘﺮ ﻓﻲ اﻟﻤﻨﻄﻘﺔ اﻟﻔﺎرﻏﺔ ﺗﺤﺖ اﻟﻘﺎﺋﻤﺔ ‪ Demo‬وأدرج أﻣﺮا ﺟﺪﻳﺪا ﺑﺎﻟﺨﺼﺎﺋﺺ اﻟﺘﺎﻟﻴﺔ‪:‬‬

‫‪ -.3 .6‬رﺑﻂ اﻷﻣﺮ ﺑﺮﺳﺎﻟﺔ )ﺣﺪث( ﺟﺪﻳﺪ ﺑﻮاﺳﻄﺔ ‪ClassWizard‬‬


‫ﻟﺘﺸﻐﻴﻞ ‪ ClassWizard‬أﻧﻘﺮ ﻋﻠﻰ اﻷﻣـﺮ ﺑـﺰر اﻟﻤـﺎوس اﻷﻳﻤـﻦ واﺧﺘـﺮ ‪ ClassWizard‬ﺣـﺪد ﻣﻌـﺮف ‪ ID‬اﻷﻣـﺮ‬
‫وﻧﻮع اﻟﺮﺳﺎﻟﺔ ﺛﻢ اﻧﻘﺮ ‪ Add Function‬ﺛﻢ اآﺘﺐ اﺳـﻢ اﻟﻄﺮﻳﻘـﺔ اﻟﺘـﻲ ﺳـﺘُﺘﺪﻋﻰ ﻓـﻲ آـﻞ ﻣـﺮة ﻳـﺘﻢ ﻓﻴﻬـﺎ‬
‫ﺗﺤﺪﻳﺪ اﻷﻣﺮ اﻟﺠﺪﻳﺪ‬
:‫ واآﺘﺐ ﻣﺎ ﻳﻠﻲ‬Edit Code ‫ﺑﻌﺪ آﺘﺎﺑﺔ اﺳﻢ اﻟﺮﺳﺎﻟﺔ اﻧﻘﺮ ﻋﻠﻰ‬
void CDemoView::OnElementDemo1()
{
// TODO: Add your command handler code here
AfxMessageBox ("Démonstration n°1") ;
}
: ‫ﻧﻒ< اﻟﺒﺮﻧﺎﻣﺞ واﻧﻘﺮ ﻋﻠﻰ اﻷﻣﺮ‬
‫‪ -.4 .6‬ﻹﺿﺎﻓﺔ زر إﻟﻰ ﺷﺮﻳﻂ اﻷدوات‪:‬‬
‫ﺣﺪد اﻟﺸﺮﻳﺤﺔ » ‪ « RessourceView‬واﻧﻘﺮ ﻋﻼﻣﺔ اﻟﺠﻤﻊ ﻓﻲ اﻟﻌﻨﺼﺮ » ‪ « Toolbar‬ﺛـﻢ اﻧﻘـﺮ ﻧﻘـﺮا ﻣﺰدوﺟـﺎ‬
‫ﻋﻠﻰ ‪ IDR_MAINFRAME‬ﻳﻔﺘﺢ ﻣﺤﺮر اﻟﻤﻮارد‪:‬‬

‫ﻓﻲ ﻣﺜﺎﻟﻨﺎ ﻩ<ا أﺷﺮآﻨﺎ اﻟﺰر ﻣﻊ اﻷﻣﺮ ‪ Demo1‬ﻟﻠﻘﺎﺋﻤﺔ ‪Demo‬‬


‫‪ -.5 .6‬إﺿﺎﻓﺔ اﻟﺘﻠﻤﻴﺤﺎت‪:‬‬
‫ﻳﻤﻜﻨﻚ إﺿﺎﻓﺔ ﺗﻠﻤﻴﺢ ﻷزرار ﺷﺮﻳﻂ اﻷدوات اﻟﺬي ﻳﻌﺮض ﻋﻨﺪﻣﺎ ﻧﺒﻘﻲ ﻣﺆﺷﺮ اﻟﻔﺄرة ﻋﻠﻰ اﻟﺰر ﺑﻌـﺾ اﻟﺜـﻮاﻧﻲ‬
‫ﻟﻔﻌﻞ ذﻟﻚ ﺣﺪد اﻟﺸﺮﻳﺤﺔ » ‪ « RessourceView‬واﻓﺘﺢ اﻟﻌﻨﺼﺮ ‪ String Table‬واﻧﻘﺮ ﻣﺮﺗﻴﻦ ﻋﻠﻰ ﻣﻌـﺮف ‪ID‬‬
‫اﻟﺰر ﺗﻌﺮض اﻟﻨﺎﻓﺬة اﻟﺘﺎﻟﻴﺔ‪:‬‬

‫واﻟﻨﺘﻴﺠﺔ‪:‬‬
‫وإﻟﻰ اﻟﻠﻘﺎء ﻣﻊ دروس أﺧﺮى ﻣﺘﻘﺪﻣﺔ وهﻲ‪:‬‬
‫‪ 9‬ﺗﻌﺪد اﻟﻔﻮاﺻﻞ‬
‫‪ 9‬إﻧﺸﺎء ﺻﻔﺤﺎت اﻟﺨﺼﺎﺋﺺ ذات اﻟﺸﺮاﺋﺢ‬
‫‪ 9‬ﻣﺮﺑﻌﺎت اﻟﺨﻴﺎر‬
‫‪ 9‬أزرار اﻟﺨﻴﺎر )رادﻳﻮ(‬
‫‪ 9‬ﻣﺮﺑﻊ اﻟﺴﺮد ‪ListBox‬‬
‫‪ 9‬ﻣﺮﺑﻊ اﻟﻜﺘﺎﺑﺔ واﻟﺴﺮد‬
‫‪ 9‬ﻣﺮﺑﻊ اﻟﻨﺺ‬
‫أرﺟﻮ ﻣﻨﻜﻢ اﻟﺪﻋﺎء واﻟﺴﻼم ﻋﻠﻴﻜﻢ‬
‫اﻟﻤﺸﺮوع ﻣﺮﻓﻖ ﻣﻊ اﻟﻤﻠﻒ‬

You might also like