منتخب بازارچه

آموزش ويژوال سي -- كاربردي

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
با سلام.
بعد از بحثهاي مفصل و كاملي كه دوستان به شكل تئوري برگزار كردند ، ، آماده مي شويم تا همان بحثها را در عمل (كد نويسي ) بكار بريم.
مفاهيم پايه ارتباط با ويندوز - مسيج ها و ديگر بحث ها

پس لازم است كه كم كم با محيط كار ويژوال سي آشنا شويم.

بسم الله الرحمن الرحيم.
ويژوال سي را باز كنيد و از منوي فايل ، گزينه new را برگزينيد ، پنجره new طبق شكل زير آشكار مي شود:




اين پنجره 4 tab دارد كه با فلشهاي سبز بالاي عكس من نشان داده ام.
به محض ورود شما هدايت مي شويد به tab دوم ، يعني Projects .
در tab پروجكتس ، شما مي توانيد انواع پروژه دلخواه خود را انتخاب كنيد و بسازيد.
در شكل بالا با رنگ قرمز ، شماره 3 فلش ها را نگاه كنيد. دو نوع پروژه win32 و mfc مي بينيد. بحث اصلي ما در پستهاي بعدي روي اين دو نوع پروژه است.
يك نوع ديگر پروژه به نام console هم با شماره 4 مشخص شده كه محيط كنسولي به شما مي دهد و بحثي ندارد چون با نوع dos ئي آنچنان تفاوتي ندارد .

در فلش هاي آبي ، كه با شماره 1 و 2 مشخص شده ،،
در اولي نام پروژه خود را مي دهيد .
و با كليك دكمه اي كه با فلش 2 مشخص شده ، محل ذخيره پروژه خود را مشخص مي كنيد.
بالاي دكمه ok هم نوع platform به طور پيش فرض win32 است كه بگذاريد همان طور تيك خورده بماند.

= = = = = = = = = = == == = == = == =
پنجره new ، در حقيقت ، شروع انتخاب نوع پروژه و ورود به محيط كار است.
من ديگر تصويري از اين پنجره در تاپيك قرار نمي دهم. چون با عكس زياد تاپيك سنگين و مشكل ساز ميشه .
بعدا به طور خلاصه مي گم كه:
از پنجره new يك پروژه mfc باز كنيد يا يك پروژه win32 (همان ها كه با فلش قرمز 3 نشان داده شده) .
با بقيه انواع پروژه فعلا كاري نداريم.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
پروژه win32 بر api بنا شده و پروژه mfc بر mfc .

msdn:The Microsoft Foundation Class Library (MFC) encapsulates, or "wraps," much of (but not all of) the Win32 API​

راجع به ارتباط و فرق اين دو و كلا يك مقدار شرح قضيه ، دوستان اگر ميشه توضيح بدهند.
.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
از پنجره new نوع پروژه را win32 انتخاب كنيد. نامي به پروژه بدهيد و محل ذخيره را تعيين كنيد و دكمه ok را بزنيد. به شكل زير مي رسيم.




اولي كه يك پروژه خالي ايجاد مي كند. يعني پوشه هايي بدون فايل.
دومي قالب اوليه كدها را در فايلها ايجاد مي كند ولي با اجرا چيزي نمايش داده نمي شود . البته error هم نمي دهد.
سومي بعد اجرا يك پنجره ايجاد مي كند كه روي آن نوشته شده hello .
= = = = =
شما نوع سوم را انتخاب كنيد.
بعد انتخاب شما پنجره ديگري مي آيد كه مي گويد چه اجزايي اضافه مي شود كه بعدا توضيح مي دهيم. آن را هم ok كنيد تا وارد محيط برنامه بشويد.

بعد از منوي build ، گزينه build yourname.exe فايل اجرايي را مي سازد(يا دكمه f7 ) و گزينه execute yourname.exe باعث اجراي برنامه مي شود.( يا كنترل+ f5 ) .




و بعد اجرا داريم:




حال به محل ذخيره پروژه رفته و فايل yourname.plg را باز كنيد.
در قسمتي از متن آن داريم:

کد:
kernel32.lib user32.lib gdi32.lib winspool.lib
 comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib
 uuid.lib odbc32.lib odbccp32.lib /nologo 
/subsystem:windows /incremental:yes /pdb:"Debug/test2.pdb"
 /debug 
/machine:I386 /out:"Debug/test2.exe" /pdbtype:sept
نام پروژه من test2 بود.
هدف من از اين پست اين بود كه نشان دهم چه فايلهايي موقع لينك و كامپايل در پروژه هاي win32 مورد استفاده قرار مي گيرد.تحقيق كنيد ببينيد محل اين فايلها كجاست. بايد در پروژه هاي mfc هم قضيه بررسي شود.

.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
اين بار در پنجره new نوع پروژه را از نوع mfc appwizard (exe) بر گزينيد.




3 حالت در بالا نشان داده شده كه نتيجه را بعد ساخت با نامهاي mfc1 & mfc2 & mfc3 مي بينيد.
روش ساخت هم دقيقا مثل پست قبل است.




در نوع ديالوگي يعني نوع سوم در step 2 تيك زير را برداريد. چون نيازي به آن فعلا نيست.




در ساخت پروژه ها دو روش هست . در شكل زير مي بينيد. يكي روش شريكي shared و ديگري مستقل. من با هر دو روش برنامه را ساختم. در يكي حدود 100 كيلو بود حجم فايل اگزه و در ديگري يك مميز 2 مگا.
معلومه كه آن كه كوچك است چيزهايي را با خود برنداشته( همان shared ). و اين فايل كوچك جايي كه ويژوال سي نصب نباشد ، اجرا نخواهد شد.




خوب. اين بود طرز ساخت پروژه.
در همه step ها دكمه finish وجود دارد تا كار را همان جا خاتمه دهيد. در step آخر اطلاعاتي راجع به كلاسهاي برنامه شما و فايلهايي كه ساخته مي شود مي دهد. بعد زدن دكمه finish قبل ورود به محيط كاري ، يك پنجره مي آيد كه مي گويد چه چيزهايي در پروژه شما اضافه شده كه با زدن ok از آن رد مي شويم.
.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
كمي با محيط كار بگذاريد آشنا شويم.
اولا ما هميشه در يك workspce كار مي كنيم كه يعني محيط كاري. در منوي فايل هم 3 گزينه open workspace و close آن و save آن را داريم. كه اينها ديگه ور رفتنش با خودتون. يك recent workspace هم داره كه يعني محيط هاي كاري قبلي كه ما روزهاي قبل كار كرديم.
در هر workspace ميشه چند پروژه اضافه كرد. و باهاشون كار كرد.

اما نكته كاربردي حرفهاي بالا اينه كه وقتي با يك پروژه كار كرديد و فردا كه خواستيد بازش كنيد ، با كليك روي فايل saalek.dsw اين كار را بكنيد. البته با كليك روي saalek.dps هم باز ميشه ، ولي مي پرسه كه اين پروژه يك محيط كاري داره ، شما مي خواهيد كه آن محيط كاري باز بشود. كه بايد بگيد بله. پس بهتره از اول همون محيط كاري كه پسوندش dsw است را بزنيد. اگر غلط گفتم اين را دوستان اصلاح كنند لطفا.

حالا من يك پروژه mfc از نوع ديالوگي:




باز مي كنم.
و به يكي از پنجره هاي محيط ويژوال سي مي پردازيم.




فعلا نمي دونم اسم اين پنجره چيه. بعدا كه فهميدم اسمشو اينجا مي نويسم.
مي بينيم كه 3 tab داره و از اسمهايش معلومه كه چيه. يكي براي نمايش فايلهاي پروژه . يكي براي نمايش كلاسهاي پروژه و يكي هم براي نمايش ريسورس ها.
ريسورس مثلا آيكونها.
خوب برويد يك پروژه mfc بسازيد و بازي كنيد با آنها. البته win32 هم شبيه همينه ولي من براي اين كه نتيجه كار من و شما يكي باشه گفتم mfc .

حالا يكسري چيزها هست كه در تمرين خود انجام بدهيد .
يكي اينكه روي اسم يكي از فايلها دابل كليك كنيد تا فايل باز بشه. البته اول بايد پوشه ها را باز كنيد تا فايلها نمايان بشوند كه با كليك علامت بعلاوه كه در شكل بالا با فلش آبي نشان دادم انجام ميشه. معلومه كه بايد در tab مربوط به خودش يعني file view باشيد.
در file view در اين پروژه mfc ديالوگي من ، 3 پوشه سورس فايل ، هدر فايل ، و ريسورس فايل هست.
براي هر كلاس گويا دو فايل داريم . يكي سورس و يكي هدر. منظورم از سورس ، فايلي با پسوند cpp است و هدر هم كه پسوندش h است.
معرفي كلاس در هدر است گويا و تعريف كلاس در cpp .
براي اين كه به صحت و سقم اين گفته پي ببريد ، به tab كلاس برويد و روي يك كلاس كليك راست كنيد و گزينه هاي go to definition و go to declaration را بزنيد.




در جاهايي مي بينيم كه اين قضيه درست است و در جاهايي نه.
خودتان برويد ببينيد كدام كلاسها ، ديكلر و دفينيش آنها در دو فايل cpp و h است و كدام ها نيست.
حالا اين نظمي است كه ويژوال سي ايجاد كرده و دستش درد نكنه . بعضي جاها صلاح نبوده و در يك فايل همه را گذاشته(ديكلر و دفينيش را ) .
فكر كنم بشه همه كدها را در يك فايل جمع كرد و مشكلي هم پيش نمي آيد ولي خيلي در هم و بر هم ميشه.

موضوع بعدي: چون اين پروژه من ديالوگي است در tab مربوط به resource view در قسمت ديالوگ ، من دو ديالوگ دارم . يكي about كه بيشتر پروژه ها دارند. و ديگري ديالوگ اصلي كه اصلا پروژه براي نمايش آن است.



روي آن دابل كليك كنيد تا محيط كار بر روي فرم باز بشه.




مي توانيد از جعبه ابزار ، يك ابزار را روي فرم بگذاريد. بهتره بگيم رسم كنيد.
البته در وي بي مي گفتند جعبه ابزار يا toolbox ، اينجا بالاش نوشته controls . پس ما هم من بعد مي گوييم controls .
. قرار دادن كد براش هم ساده است. بعد قرار دادن روي فرم ، روي آن كليك راست كنيد و classwizard را انتخاب كنيد.



در پنجره كلاس-ويزارد از قسمت object id ، ابزار را انتخاب كنيد و از قسمت messages رويداد مورد نظر مثل كليك را .




بعد از دكمه هاي سمت راست add function را بزنيد. كه يك اسم مي خواهد بدهيد و بعد تابع شما در پنجره پايين پاييني يعني در member functions اضافه ميشه. كه با انتخاب آن و زدن دكمه edit code ،،، پنجره classwizard بسته ميشه و مي رويد داخل فايل، كه كد خود را در جاي مناسب بنويسيد. مثلا مي نويسيم.

کد:
 MessageBox(" hello world");
البته يادمان هست كه سي به حروف بزرگ و كوچك حساس است. در كلمه MessageBox دو حرف بزرگ داريم.
من يك دكمه روي فرم قرار دادم و با كليك روي آن اين كد اجرا ميشه كه باعث ميشه يك مسيج باكس بياد كه روي آن نوشته hello world .
.
مجموعا ميشه:

کد:
void CSaalekDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
     	
	MessageBox(" hello world");	
}
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
طرز ساخت يك پروژه exe از نوع mfc را در بالا گفتيم . ولي باز از msdn تكرار مي كنم كه نكته اي جا نيافتاده باشه.


Create an MFC EXE Program with AppWizard

ايجاد يك برنامه exe بوسيله app wizard


When you first create an MFC executable program, you use the MFC AppWizard (EXE version) to lead you through a series of dialog boxes in which you choose options for the architecture, features, and functions of your project.
The series is a branching path: you can move forward and backward through the steps and make changes to the options you have selected. Help is available for every option in the MFC AppWizard: right-click on the control for more information about each option.​


براي ساختن اولين برنامه mfc قابل اجراي خود ، شما بايستي از app wizard استفاده كنيد . كه نوع mfc exe version را انتخاب مي كنيد. بعد وارد يك سري پنجره هاي ديالوگي مي شويد كه انتخابهايي دارد براي معماري و feature و توابع برنامه شما.
اين پنجره ها حالت درختي و شاخه اي دارد . همچنين مي توانيد بين صفحه ها به سمت عقب و جلو برويد(بين step ها) و تغييرات لازم را بدهيد. Help هم براي هر قسمت موجود است. (سالك: help ويژوال سي همان msdn است كه شامل 3 cd است كه بايد نصب كنيد. من از ورژن 2000 آن استفاده مي كنم تا مناسب باشد. ولي ورژن 2003 و 2005 هم آمده كه همراه دات نت هاست.)
الان امتحان كردم، با راست كليك روي انتخابها در step ها يك پنجره كوچك مي آيد كه روي آن نوشته what is this? كه وقتي روي ان كليك مي كنيد اطلاعاتي به نمايش درمي آيد. امتحان كنيد.


To create an MFC EXE program using AppWizard

1. On the File menu, click New and then click the Projects tab.
2. Specify the Project Name, Location, Workspace, Dependency, and Platforms options and then double-click the MFC AppWizard (exe) icon.
3. Complete the steps of the MFC AppWizard by choosing the appropriate options for your program. Click here for a step-by-step explanation of the MFC AppWizard.
4. Prepare your MFC program for use. Click here for more information.


اول: در منوي فايل روي new كليك كنيد و به tab پروجكتس برويد.
دوم: نام پروژه و فضاي ذخيره و Workspace, Dependency و پلت فرم را مشخص كنيد و رويMFC AppWizard (exe) دابل كليك كنيد. (ما روي آن كليك كرديم و ok را زديم كه فرقي نمي كند.)
س: قضيه Dependency اينه كه ما گاهي يك پروژه را داريم كار مي كنيم و مي خواهيم در همان فضاي كاري workspace كه هستيم ، با new يك پروژه ديگر باز كنيم. كه اينجا وابستگي به پروژه قبلي مطرح ميشه . من دقيقا نمي دونم چيه. بعدا اگر فهميدم ميگم.
در مورد پلت فرم هم كه گفتيم بگذاريد win32 بماند. شايد win16 حالت ديگرش باشه كه دوستان صاحب نظرند خواهند گفت.
سوم : گفته آپشن را در step هاي مختلف تكميل كنيد كه لينك داده كه در پايين نقل مي كنم.
چهارم: اين هم لينك است كه در پايين مي آورم.



The MFC AppWizard series is a branching path of either 4 or 6 steps depending on the architecture you select for your program. You can move forward and backward through the steps and make changes to the options you have selected.
Help is available for every option in each step: right-click on the control for more information about each option.


ابزار mfc app wizard شامل 4 تا 6 step است وابسته به آرشيتكتي كه انتخاب مي كنيد. شما مي توانيد رو به عقب يا جلو حركت كنيد تا تنظيمات دلخواه خود را انجام دهيد. Help با راست كليك در دسترس است.

To complete Step 1
پله اول:


1. Choose one of three architectures for your program: Single Document (SDI), Multiple Document (MDI), or Dialog Based.
2. Decide if you want your application to support MFC's document/view architecture. An application without document/view architecture would not have MFC support to open a document from a disk file and the window area is derived from CWnd. See Alternatives to the Document/View Architecture.
If you choose not to use document/view architecture, other options in Steps 2-5 will not be available.
3. Select a language for the resource text and then click Next.
4. If you selected a dialog-based architecture, click here for Step 2.


اول: 3 نوع معماري(آرشيتكت) موجود است. Mdi و sdi و ديالوگ.
يا Single Document و Multiple Document و Dialog Based. .
دوم: آيا ساپورت MFC's document/view architecture را مي خواهيد؟
اگر نخواهيد اين ساپورت را نمي توانيد داكيومنت را از روي ديسك باز كنيد و نماي پنجره شما با cWnd ايجاد مي شود.
س: من رفتم با و بدون ساپورت ساختم. كلا همه معماري فرق مي كند. حالا وارد بحثش نمي شويم تا كلاسهاي mfc را ياد بگيريم.
در ادامه مطلب گفته كه اگر اين ساپورت را نخواهيم در step هاي بعدي (2 تا 5 ) انتخابهاي ديگر فعال نيست. س: من رفتم امتحان كردم. خيلي از انتخابها غيرفعال مي شود.
سوم: انتخاب زبان براي ريسورس هاست.
چهارم : براي نوع ديالوگي باز لينك داده كه بعدا مي رويم آن لينك.



To complete Step 2 for an SDI or MDI type program

بقيه در پست بعدي.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها

To complete Step 2 for an SDI or MDI type program

1. Choose one of four database support options for your program: None, Header file support, Database View (with file support) or Database View (without file support).
2. If you selected database view support, click Data Source and choose either an external ODBC database, DAO database or OLE DB database and the appropriate data source and Database Table options.
For more information, see Data Source (ODBC), DAO External: Working with External Data Sources, Using the OLE DB Consumer Templates
3. Click Next.


تكميل step 2 در نوع mdi و sdi :

اول: 4 نوع ساپورت ديتا بيس داريم. None و هدر فايل ساپورت و ديتابيس view ساپورت با فايل ساپورت و ديتابيس view ساپورت بدون فايل ساپورت.

دوم: اگر نوع ديتابيس view ساپورت را انتخاب كرديد ، ديتاسورس را كليك كنيد.
س: با كليك روي اين دكمه ، پنجره database option باز ميشه كه 3 نوع انتخاب داره.
ODBC
DAO
OLE DB

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

سوم: next رابزنيد.


To complete Step 3 for an SDI or MDI type program

Choose the compound document support you would like to include in your program:
Container
An OLE 2.0-style document container.
Mini-server
An OLE server that cannot run as a standalone program.
Full-server
An OLE server that can also run as a standalone program.
Active Document Servers
Active Document Containers
Also, select options to enable the standard ActiveX resources and to add extra Automation commands to the application's menu bar.


تكميل step 3 در نوع mdi و sdi :

انتخاب نوع كامپاند داكيومنت ساپورت كه به برنامه شما اضافه شود. به جز none 4 انتخاب داريم:
Container
Mini server
Full server
Both container & server

شرح 3 تاي اولي:
OLE 2.0-style document container
OLE server that cannot run as a standalone program
OLE server that can also run as a standalone program

در ادامه انتخابهايي براي فعال كردن standard ActiveX resources و افزودن دستوراتي در منو بار براي Automation يا خودكاري سازي داريم.
.



To complete Step 4 for an SDI or MDI type program

1. Choose which basic user-interface features you want your program to have and the type of toolbars to use: IE4.0 ReBars or MFC (command) toolbars. See Windows Sockets in MFC and MAPI Support in MFC for more information.
2. If you want to modify the filenames and extensions that your program uses or want to adjust the user interface window frame styles for your program, click Advanced.
3. Click Next.​


تكميل step 4 در نوع mdi و sdi :
اول: در اين گام تصميم مي گيريم كه شماي اينترفيس كاربر برنامه ما چه شكلي داشته باشد.
مثل تولبارهاي مورد نياز. مثلا تولبار ie 4.0 يا تولبار mfc .
همچنين پشتياني از mapi و سوكت.
دوم: اگر مي خواهيد نام فايل و پسوند فايل را تغيير دهيد يا استيل پنجره برنامه را تغيير دهيد دكمه advanced را بزنيد.
سوم: next را بزنيد.


To complete Step 5 for an SDI or MDI type program

1. Choose the project style: Explorer, which gives you a tree view on the left and a list view on the right or MFC Standard, which gives you one area for a file view.
2. Choose whether or not you would like AppWizard to generate comments in the source file that will guide you in writing your program.
3. Choose whether you would like to use the MFC library as a shared or statically linked DLL.
Feature Only in Professional and Enterprise Editions Static linking to MFC is supported only in Visual C++ Professional and Enterprise Editions. For more information, see Visual C++ Editions.


تكميل step 5 در نوع mdi و sdi :

اول: نوع استيل پروژه را تعيين كنيد. كه explorer و mfc standard دارد.
اولي يك نماي درختي در سمت چپ و يك ليست view سمت راست مي دهد.
دومي يك نما براي ديدن فايل مي دهد. س: من رفتم امتحان كردم . فرق واضحي نديدم. شما اگه ديديد بگيد.
دوم: كامنت آيا اضافه شود يا نه. س: اولش باشه بهتره ولي وقتي حرفه اي شديد ديگه نيازي به اين راهنمايي ها نداريد.
سوم: آيا كتابخانه mfc شريكي باشه يا ثابت. س: كه قبلا فرقش را گفتم. گفتم كه در نوع شريكي لوازم برنامه برداشته نميشه و جايي كه ويژوال سي نصب نباشه اجرا نمي شه.
در اينجا گفته كه در اديشن اينترپرايز و حرفه اي فقط اين استاتيكالي(مخالف شريكي) موجود است كه من فكر مي كنم وي سي ما همه اينترپرايز است.
بقيه در پست بعد.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها

To complete Step 6 for an SDI or MDI type program


1. If you want to change the default class name, base class, header or implementation file names provided by AppWizard, enter the new names. To change the Base class, select your program's view class (see Derived View Classes).
2. Click Finish and then click here to prepare your MFC program for use.



تكميل step 6 در نوع mdi و sdi :

اول: اگر مي خواهيد نام كلاس و base كلاس و نام header يا فايل cpp را عوض كنيد ، در اينجا نام را تغيير مي دهيد.براي تغيير نام base كلاس ، view كلاس برنامه خود را انتخاب كنيد.

دوم: دكمه finish را بزنيد.



To complete Step 2 for a dialog-based program


1. Choose which basic user-interface features you want your program to have and what WOSA support to include. See Windows Sockets in MFC for more information.
2. Click Next.



براي تكميل step 2 در نوع ديالوگي:

اول: يكي نوع شماي يوزر ايترفيس شما و ديگري انتخاب WOSA ساپورت براي كار با سوكت.
دوم : next را بزنيد.



To complete Step 3 for a dialog-based program


1. Choose Yes, if you would like comments about where you need to add your own code into the source file.
2. Choose whether you would like to use the MFC library as a shared or statically linked DLL.
Feature Only in Professional and Enterprise Editions Static linking to MFC is supported only in Visual C++ Professional and Enterprise Editions. For more information, see Visual C++ Editions.




براي تكميل step 3 در نوع ديالوگي:

اول: انتخاب اينكه آيا كامنت براي راهنمايي شما براي اينكه كدهاي خود را كجا بنويسيد گذاشته شود يا خير.

دوم: قضيه sahared و استاتيك كه قبلا گفتيم.




To complete Step 4 for a dialog-based program


1. If you want to change the default class name, header or implementation file names provided by AppWizard, enter the new names. To change the Header or Implementation file name, select your program's dialog class.
2. Click Finish and then click here to prepare your MFC program for use.

باز تكراري است . همان تغيير نام فايل و كلاس.
تمام شد.
درود.
.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
بهتره آموزش كاربرد را از بحث علمي جدا كنيم.
در ادامه اين تاپيك با سرعت بيشتري روي جنبه كاربردي تاكيد مي كنيم.
شايد هم يك تاپيك باز بشه براي معرفي كلاسهاي

mfc

MFC

.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
با سلام.
من ديروز تمام وقت خود را روي ساختن برنامه مركزي شطرنج باز اختصاص دادم.
مسابقات شطرنج
و متوجه چيزهاي جالبي شدم كه عرض مي كنم.
من يك لحظه خود را جاي طراح ويژوال سي احساس كردم.
من كدهايي نوشتم كه اسكلت برنامه را تشكيل مي داد و بايستي اين كدهاي من پذيراي كدهاي شركت كننده ها در مسابقه مي بود.

دو چيز مهم بود:
اول اينكه استفاده كننده از برنامه من بايد كدهايش را كجا وارد مي كرد
و دوم اينكه با ساير قسمتهاي برنامه چطور ارتباط برقرار مي كرد.

و اين قضيه دقيقا در ويژوال سي هم مطرح است.

طراح ويژوال سي ، آمده براي راهنمايي ما ، كامنت هايي وسطهاي برنامه گذاشته كه محل درج را نشان بدهد.
و شايد بخاطر كمك بيشتر آمده class wizard را هم محيا كرده براي همين كار .
در پستهاي قبلي با استفاده از كلاس ويزارد آمديم براي يك دكمه ، محل كدش را پيدا كرديم.
و همچنين مواقعي هست كه چند جا بايد كد درج بشود كه كلاس ويزارد اين كار را براي ما مي كند.

اما اين كدهاي خود ويژوال سي چيه را در اين تاپيك نمي خواهيم واردش بشويم و در تاپيك ((ويژوال سي – مفاهيم )) بحث مي كنيم.
منظور همان كدهايي است كه در شروع ساخت پروژه app wizard مي سازد.

نكته ديگر در آن برنامه شطرنج ، روش ارتباط با ديگر قسمتها بود.
من ابتدا با ارسال ورودي و دريافت return از تابعي كه بازيكن نوشته بود كار كردم.
ولي بعدش كل برنامه را تغيير دادم. و ورودي و خروجي بازيكن را مقاديري گلوبال تعيين كردم.
علتش اين بود كه ارسال مقادير به تابع بازيكن برايم مشكل بود و كدها حجمش خيلي بيشتر مي شد.
و چيزي كه الان در تاپيك ((مسابقات شطرنج)) است ، همان حالت گلوبال است. و حدود 10 تا 20 خط را با اين تغيير توانستم پاك كنم.

پس در ويژوال سي هم اول محل نشستن كدهاي ما مهم است و بعد طريقه ارتباط برقرار كردن برنامه ما با ديگر قسمتهاي برنامه.
كه ايجاد مسيج ها براي همين ارتباط است.

= == = = = = = == = = = = = = =

از ديگر نكات يك برنامه خوب ، تقسيم بندي به قطعاتي است كه كه هر يك كار مشخصي انجام مي دهد.
در آن برنامه شطرنج من تابع هاي ((نمايش)) و ((مخزن)) را داشتم . و 4 تابع ديگر كه دو تا بازيكن سفيد و سياه بود و دو تابع ((چك كننده حركات سفيد )) و (( چك كننده حركات سياه)) .
من طوري طراحي كردم اين تابع ها را كه از هم مستقل عمل كنند و بعدا بشه راحت تغييرشان داد بي آنكه از شركت كنندگان در مسابقه بخواهيم كد خود را عوض كنند.

در ويژوال سي هم كلاس ((داكيومنت )) و كلاس (( view )) را داريم.
من هنوز به وظيفه آنها مسلط نيستم ولي مثلا يكي براي ذخيره در ديسك است و يكي براي نمايش.
شما وقتي نمي خواهيد چيزي را ذخيره كنيد در ديسك با كلاس داكيومنت كاري نداريد و بيشتر با كلاس view كار مي كنيد كه براي نمايش است.

در برنامه شطرنج من ، تابع (( مخزن)) در حقيقت يك كلاس است . چون يك آرايه را نگهداري مي كند و تابع هاي مستقلي را با دستور switch ، وابسته به ورودي تابع ، صدا مي زند. ولي من نخواستم كلاس تعريف كنم . چون گفتم شايد كسي كلاس بلد نباشد و فكر كند چيز بزرگي است.
در ويژوال سي هم كلاسهاي زيادي وجود دارد كه من در msdn ليست بزرگي از آنها را شامل تابع هاي آنها و ديگر متعلقاتي كه يك كلاس دارد را دارم.
اگر ما بدانيم يك كلاس چه امكاناتي براي ما فراهم مي آورد ، ديگه ترسي ندارد و انگار خودمان آن را نوشته ايم.

باز در برنامه شطرنج خود من مي توانم قسمت نمايش را با ويژوال بيسيك يا ويژوال سي بسازم و هيچ ضربه اي به ديگر قسمتهاي برنامه نمي زند.
و اين براي من خيلي مهم بود كه من فردا به بازيكن ها نگويم كه بايد كد خود را عوض كنيد.

حالا با اين بحث ديد بهتري نسبت به كلاسهايي كه هر يك در ويژوال سي كاري را براي ما انجام مي دهد پيدا كرديم.
در ويژوال سي هر كار ، مثلا نمايش را ، به يك كلاس سپرده اند. و هر كلاس در يك فايل هدر معرفي و در فايل cpp همطراز خود تعريف ميشه.
بعدا با شناخت بيشتر اين كلاسها ، به طرز استفاده آنها بيشتر مسلط مي شويم.

يكسري ابزار هم داريم كه باز كلاس است و ما مدام از آنها استفاده مي كنيم.
در آن عكس بزرگي كه من از توابع mfc گذاشته ام ، يك نوع طبقه بندي نموداري اين كلاسها را مي بينيد.
= == = = = == = == = = = == =
من سعي مي كنم بعد هر برنامه كه در پستهاي بعدي كار كرديم،
به نكات زير بپردازم.

اول قبل شروع كار ما ، چه كدهايي app wizard به ما داده بود و بعد ساختن برنامه امان چه كدهايي لابلاي اين كدها اضافه شد.

دوم: برنامه ما با چه مسيج هايي با ديگر قسمتهاي برنامه ارتباط برقرار مي كند.

سوم : از چه كلاسهايي استفاده كرديم و آن كلاس چه اعضايي دارد و كمي آن اعضا را معرفي كنيم.
.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
خوب. ديگه برنامه شطرنج پست قبل را مي گذريم و وارد محيط ويژوال سي مي شويم تا ببينيم اوضاع از چه قراره.

من در اين پست مي خواهم برنامه اي كه در پست 5 ساختيم را كمي موشكافانه تر تجزيه تحليل كنيم. پس آن برنامه پست 5 را با دقت باز نگاه كنيد. من هم الان اون پست را دارم نگاه مي كنم و هر چي آنجا گفته شده را ديگه تكرار نمي كنم.

= == = = = = = =
خلاصه آن پست:
ابتدا يك پروژه ديالوگي ساختيم. كه از منوي فايل new را زديم و در tab پروجكت نوع mfc exe را انتخاب كرديم و در step 1 ، سومي يعني ديالوگي را انتخاب مي كنيم و همان جا هم ميشه finish را زد چون فعلا كه نمي خواهيم برنامه خاصي بسازيم.

بعد از وارد پنجره ديالوگ شديم و از قسمت controls يك دكمه روي فرم گذاشتيم .
بعدي روي دكمه كليك راست كرديم و از منوي كليك راست ، class wizard را انتخاب كرديم و با اين وسيله كدي براي كليك دكمه محيا كرديم كه در پست 5 مشروح تر توضيح داديم.
= = = = = = = = = =
حالا من مي خواهم در اين پست بگويم كه كلاس ويزارد چه كارهايي براي ما كرده و خدمات خوب آن را بگوييم.
آنهايي كه وي بي كار كرده اند ، مي دانند كه وقتي يك دكمه روي فرم گذاشتند ، وقتي روي آن دابل كليك كنند ، پنجره كد باز ميشه و دو خط كد نوشته شده دو طرف قسمتي كه ما بايد كد بنويسيم باز ميشه و ما كدمان را اونجا مي نويسيم و بعد اجرا به محض اينكه كاربر روي دكمه كليك كنه ، آن كد ما اجرا ميشه.

ولي در وي سي ، چند جاي كدها تغييراتي مي كنه كه چون وقت گير بوده كه دستي انجام بدهيم ، كلاس ويزارد اختراع شده احتمالا تا اتوماتيك اين چند تغيير را انجام بدهد.

خوب. براي شروع دو بار ويژوال سي را باز كنيد و در هر دو يك پروژه ديالوگي بسازيد.
يعني ويژوال سي را باز كنيد و يك پروژه بسازيد و بهش دست نزنيد و برويد دوباره ويژوال سي را باز كنيد و دوباره همان نوع پروژه را بسازيد.
اولي را دست نزنيد تا بعد كار روي دومي با اولي مقايسه كنيد.
مثل آزمايشگاه شيمي كه يك لوله آزمايش بلانك هميشه براي مقايسه داشتيم.

من اسم اولي را 1 گذاشتم و اسم دومي را 2 . كه در همون پنجره new كه نوع پروژه را انتخاب مي كرديد يادتونه كه اسم پروژه هم مي داديد.

حالا در دومي روي فرم دكمه را اضافه كنيد و با كلاس ويزارد كد آن را در فايل مربوطه اضافه كنيد تا برويم سراغ مقايسه و بحث خود.
بقيه در پست بعد.
.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
خوب . من الان ويژوال سي را باز كردم و يك پروژه ديالوگي با نام 1 ساختم و بعد دوباره ويژوال سي را باز كردم و با نام 2 باز يك پروژه ديالوگي ساختم.
پس الان دو تا ويژوال سي بازه.
روي دومي مي خواهم تغييرات پست 5 را انجام دادم.
حالا به فايلهاي حاوي كد برنامه توجه مي كنيم.

در پروژه اولي فايلي دارم به اسم 1.cpp و مسلمه كه در دومي فايلي دارم به نام 2.cpp .
دو فايل هيچ فرقي ندارند. كه نشان مي دهد كلاس ويزارد كدي به اين فايل اضافه نكرده.

پس اين فايل تغييري نكرده بود.
ولي در فايل 2Dlg.cpp تغييراتي داريم.

کد:
BEGIN_MESSAGE_MAP(CMy2Dlg, CDialog)
	//{{AFX_MSG_MAP(CMy2Dlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	[color=red]ON_BN_CLICKED(IDC_BUTTON1, OnButton1)[/color]
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
خطي كه با رنگ قرمز نشان داده شده در پروژه 2 اضافه شده.

يك تغيير ديگر هم در اين فايل داريم كه همان كدي است كه در انتهاي فايل ما اضافه كرديم.

کد:
void CMy2Dlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
MessageBox("saalek");	
}
== = = = = =
حالا برويم سراغ فايلهاي هدر يعني با پسوند h كه در پوشه جدايي است.
اولي يعني 1.h و 2.h فرقي ندارند.
ولي در 2Dlg.h داريم:

کد:
class CMy2Dlg : public CDialog
{
// Construction
public:
	CMy2Dlg(CWnd* pParent = NULL);	// standard constructor

// Dialog Data
	//{{AFX_DATA(CMy2Dlg)
	enum { IDD = IDD_MY2_DIALOG };
		// NOTE: the ClassWizard will add data members here
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CMy2Dlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	HICON m_hIcon;

	// Generated message map functions
	//{{AFX_MSG(CMy2Dlg)
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	[color=red]afx_msg void OnButton1();[/color]
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};
باز خط قرمز در پروژه 2 اضافه شده.
من كد بيشتري را اينجا گذاشتم تا بگويم كه ما در كجا هستيم.
در اعضاي protected كلاس CMy2Dlg هستيم. كه از كلاس Cdialog مشتق شده.
توارث را هنوز در تاپيك كلاس نگفته ايم. ولي اينجا فعلا فرض كنيد كه ما داريم از خود كلاس سي ديالوگ استفاده مي كنيم و كلاسي از آن مشتق نكرده ايم.
لازمه بعدا معرفي كنيم كلاس ديالوگ را. ولي فعلا بر معماري برنامه خود تمركز مي كنيم.

در فايل StdAfx.h هم تغييري نداشتيم.
يك فايل به نام basetsd.h هم در پروژه 2 داريم كه بعد بيلد و اجرا ، ايجاد ميشه. كه باهاش فعلا كاري نداريم.

= == = = = = = = = = = = == =
جمع بندي:
تابعي داريم كه عضو كلاس ديالوگ ماست ، به نام OnButton1
در 2Dlg.h ديكلر (معرفي ) شده
و در 2Dlg.cpp تعريف شده كه ما كد خود را درونش نوشته ايم.

اين دو تغيير .

= = == =
و تغيير سوم در قسمت مسيج مپ در فايل 2Dlg.cpp .

و من حالا مي خواهم از خودم يك نتيجه گيري كنم. و اين نتيجه گيري را با توجه به مشاهدات خود در اين مقايسه ها و ديدن اين 3 تغيير مي كنم. شايد درست نباشه. بعدا معلوم ميشه.

كلاسهاي mfc مثل مصالح ساختماني ئي هستند كه ما باهاشون برنامه خود را مي سازيم مثل كلاس سي ديالوگ كه اينجا استفاده شده. ولي كنترل برنامه با مسيج مپ به اين ساختمانهايي كه ما ساختيم مثل جريان برق وارد ميشه.
دوستان اگر غلط گفتم اصلاح كنند يا اگر شرح بهتري دارند بفرماييند.

در برنامه نويسي سي به شكل داسي ، ما سه كار مي كرديم.

ما كلاس را بيرون main تعريف مي كرديم.
و بعد تعريف كلاس ، تابع هاي كلاس را تعريف مي كرديم.
و بعد وارد main مي شديم و تابع ها را صدا مي كرديم.

دو قسمت اول و دوم در وي سي در دو فايل با اسم يكسان و با پسوند متفاوت(در اينجا 2Dlg.cpp و 2Dlg.h ) انجام شده.
در تاپيك كلاس در سي ، هم گفتيم كه بهتره تعريف كلاس در يك هدر فايل باشه كه بهش كلاس هدر فايل مي گويند.
اما قسمت سوم كار يعني صدا كردن توابع در main را در اينجا نداريم. بلكه مسيج مپ است كه انگار اين كار را انجام مي دهد.
بعدا باز هم در اين مورد بحث مي كنيم.
.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
در همين پروژه خود ،
نگاهي داريم به وضعيت include ها.
و توضيحاتي كه بالاي هر فايل نوشته شده.


2.cpp
کد:
// 2.cpp : Defines the class behaviors for the application.
//

#include "stdafx.h"
#include "2.h"
#include "2Dlg.h"

2Dlg.cpp
کد:
// 2Dlg.cpp : implementation file
//

#include "stdafx.h"
#include "2.h"
#include "2Dlg.h"

StdAfx.cpp
کد:
// stdafx.cpp : source file that includes just the standard includes
//	2.pch will be the pre-compiled header
//	stdafx.obj will contain the pre-compiled type information

#include "stdafx.h"
مي بينيم كه در دو فايل اول 3 هدر اينكلود شده. و در سومي فقط يكي.

= = == = = == == =
وضعيت اينكلود در فايهاي هدر:



2.h
کد:
// 2.h : main header file for the 2 application
//

#include "resource.h"

2Dlg.h
کد:
// 2Dlg.h : header file
//

// نداريم

StdAfx.h
کد:
// stdafx.h : include file for standard system include files,
//  or project specific include files that are used frequently, but
//      are changed infrequently
//

#include <afxwin.h>         // MFC core and standard components
#include <afxext.h>         // MFC extensions
#include <afxdisp.h>        // MFC Automation classes
#include <afxdtctl.h>		// MFC support for Internet Explorer 4 Common Controls

#include <afxcmn.h>			// MFC support for Windows Common Controls
و كل محتويات فايل Resource.h

کد:
//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by 2.rc
//
#define IDM_ABOUTBOX                    0x0010
#define IDD_ABOUTBOX                    100
#define IDS_ABOUTBOX                    101
#define IDD_MY2_DIALOG                  102
#define IDR_MAINFRAME                   128
#define IDC_BUTTON1                     1000

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        129
#define _APS_NEXT_COMMAND_VALUE         32771
#define _APS_NEXT_CONTROL_VALUE         1001
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها

msdn:

Where is WinMain in the Starter Code?

The WinMain function is supplied by the class library and is called when the application starts up. Class CWinApp encapsulates the initialization, running, and termination of an application for Windows.

سئوال:
در شروع برنامه چرا winmain نداريم؟
س: البته منظور برنامه هاي mfc است. Win32 ها دارند.
جواب: تابع winmain بوسيله كلاسهاي كتابخانه اي تامين مي شود و موقع شروع اجراي برنامه فراخواني مي شود. كلاس CwinApp شامل اينيتيالايز و اجرا كننده و خاتمه دهنده برنامه ها در ويندوز است.
.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها

Msdn:
DECLARE_MESSAGE_MAP

Declares that a message map will be used in a class to map messages to functions (must be used in the class declaration).

BEGIN_MESSAGE_MAP

Begins the definition of a message map (must be used in the class implementation).

END_MESSAGE_MAP

Ends the definition of a message map (must be used in the class implementation).

منظور من از اين پست ، نشان دادن جايگاه مسيج مپ بود. كه با رنگ آبي مشخص كرده ام.

توضيح اينكه مسيج مپ ماكرو است.
.
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
سلام خوب هستيد ممنون سالك جان اميدوارم اين تاپيك ادامه پيدا كنه
به اميد ديدار
 

saalek110

Registered User
تاریخ عضویت
10 آپریل 2007
نوشته‌ها
212
لایک‌ها
1
سلام سعید جان.
حتما همین طور خواهد شد.
موفق باشید. درود.
 
بالا