ورود

View Full Version : سوال: یه سوال راجع به ترکیب win32 , MFC



Irejx64
یک شنبه 15 فروردین 1389, 16:09 عصر
با سلام خدمت همه.
از خدمت همه اساتید عذرخواهی میکنم شاید سوالم تکراری باشه ولی یه نقطه مبهمی تو ذهنم هست راجع به MFC .
توتعریف MFC تو اکثر منابع آموزشی گفته شده که یه سری کلاس بنیادی میکروسافت درست کرده که بر اساس API هستن و در حقیقت پیچیدگی win32 رو با کمی(؟) محدودیت پوشش میده.توی تعریف ّتابع main در برنامه های win32 از WINAPI استفاده میشه ولی تو MFC موضوع فرق میکنه.من فکر میکنم که MFC کلا با WIN32 تفاوت داره (منظورم در استفاده از API).آیا میشه توی برنامه ای که به روش MFC نوشته شده از توابع API به طور مستقیم استفاده کرد؟با تشکر

Nima_NF
یک شنبه 15 فروردین 1389, 17:31 عصر
اگر می بینید که تفاوت ظاهری دارند، به خاطر این هست که مایکروسافت برای اینکه کدنویس کمتر و راحت تر شود اکثر قابلیت های win32 را در قالب کلاس ها و یکسری define و macro تعریف کرده است. مثلا شما یک کلمه ON_COMMAND فراخوانی می کنید، از نظر شما یک کد عجیب هست، اما واقعا این طور نیست، یک ماکرو ساده در C++‎‎ هست که API پیام مورد نظر را فراخوانی می کند.

مثلا شما هم در MFC قسمت main دارید، فقط نمی بینید، چون در توابع و ماکرو های سرفایل های کتابخانه MFC قرار دارد.

شما در MFC همان پیام ها را دارید، فقط برای راحتی کار با wizard یک متد داخل کلاس تعریف می کنید. دقیقا همان هست.

پس شما هر جایی که خواستید API های ویندوز را لابلای کدهای MFC فراخوانی کنید، برای اطمینان از اینکه اشتباها نام مشابه آن در MFC را فراخوانی نکند، بهتر هست :: را قبل از تابع API قرار دهید.

دقت کنید "MFC محدودیت دارد" به این معنی نیست که شما کاملا محدود می شوید، این جمله ای هست که کاربران تازه کار بیشتر از آن اشتباه برداشت می کنند و تفسیر غلط می کنند. در MFC برخی قابلیت های win32 پیاده سازی نشده است، به نوعی کلاس برای آن تعریف نشده یا جز MFC نیست، اما شما محدود نیستید، می توانید آن قابلیت در همان پروژه MFC ، یا در یک dll جداگانه تعریف کنید و برنامه شما همچنان همان کیفیت را داشته باشد. چون هر دو از win32 API استفاده می کنند. (البته جز موارد خاص دیگر که بحث در سطح application نیست، مانند درایور نویسی)

mehdi.mousavi
یک شنبه 15 فروردین 1389, 17:37 عصر
توی تعریف ّتابع main در برنامه های win32 از WINAPI استفاده میشه ولی تو MFC موضوع فرق میکنه.

سلام.
من خوندن این مقاله در دو بخش رو برای آشنایی با ساز و کار MFC بهتون توصیه می کنم:

قسمت اول (http://www.codeproject.com/KB/cpp/mfc_architecture.aspx)
قسمت دوم (http://www.codeproject.com/KB/cpp/mfc_architecture2.aspx)

موفق باشید.

Irejx64
دوشنبه 16 فروردین 1389, 17:11 عصر
جناب نیما از راهنماییتون ممنونم.
آقای موسوی مقالتون خیلی جالب و مفید از شما هم ممنونم.
من وقتی که شروع کردم به یادگیری WIN32 فکر می کردم یه قول بی شاخ و دمه
ولی با وجود این راهنمایی ها کم کم دارم راهمو پیدا میکنم من واقعا فکر نمی کردم برنامه نویس های باسوادی مثل شما و جناب نیما و بقیه اساتید که زبونشون پارسیه وجود داشته باشن و ازاین موضوع خیلی احساس افتخار میکنم.

پس با این تفاسیر اگه اشتباه نکنم کد MFC در نهایت به همون WIN32 استاندارد ویندوز تبدیل میشه وبرای اجرای یک اپلیکیشن ، ویندوز فقط کد های WIN32 وتوابع API رو میشناسه.
این موضوع رو خیلی خوب متوجه شدم ولی سوال من اینه که میتونیم در یک پروژه WIN32 فرضا در یک پنجره دارای ScrollBar ، پیمایش میله یا کارهای پیش پا افتاده ای که رو سرعت برنامه و کارایی اون تاثیر ندارن روباکلاس های MFC انجام بدیم که وقت و کد کمتری میبرن ومیکروسافت زحمتش روکشیده و بقیه کد ها رو با استفاده از API انجام بدیم.البته میدونم که MFC یک مجموعه استاندارده و برای همه (به قول اساتید : اکثر) کارها کلاس هایی رو پیش بینی کرده ولی برای توسعه نرم افزار شاید احتیاج به نوشتن کلاس های جدیدی باشه ببخشید اینقد طولانی شد منظورم اینه که آقا جان میشه چارچوب برنامه رو توی یک پروژه WIN32 نوشت و هم از کلاس های MFC و هم از کلاس های خودمون استفاده کنیم؟
پیشاپیش ممنونم از راهنماییتون

mehdi.mousavi
دوشنبه 16 فروردین 1389, 18:52 عصر
پس با این تفاسیر اگه اشتباه نکنم کد MFC در نهایت به همون WIN32 استاندارد ویندوز تبدیل میشه وبرای اجرای یک اپلیکیشن ، ویندوز فقط کد های WIN32 وتوابع API رو میشناسه. این موضوع رو خیلی خوب متوجه شدم ولی سوال من اینه که میتونیم در یک پروژه WIN32 فرضا در یک پنجره دارای ScrollBar ، پیمایش میله یا کارهای پیش پا افتاده ای که رو سرعت برنامه و کارایی اون تاثیر ندارن روباکلاس های MFC انجام بدیم که وقت و کد کمتری میبرن ومیکروسافت زحمتش روکشیده و بقیه کد ها رو با استفاده از API انجام بدیم.البته میدونم که MFC یک مجموعه استاندارده و برای همه (به قول اساتید : اکثر) کارها کلاس هایی رو پیش بینی کرده ولی برای توسعه نرم افزار شاید احتیاج به نوشتن کلاس های جدیدی باشه ببخشید اینقد طولانی شد منظورم اینه که آقا جان میشه چارچوب برنامه رو توی یک پروژه WIN32 نوشت و هم از کلاس های MFC و هم از کلاس های خودمون استفاده کنیم؟
پیشاپیش ممنونم از راهنماییتون

سلام. شما لطف دارید...

در مورد سوالی که پرسیدید، بله. کلیه کدها، در نهایت منجر به فراخوانی یک یا چند Win32 API میشه که این خودش به نوبه خودش باعث ارسال یک یا چند Control Code به درایورها در سطح Kernel Mode میشه.

فرضا هنگامیکه من SetWindowText رو فراخوانی میکینم، درخواستم به HAL میرسه و اونجا در نهایت Control Code ای به درایورهای Kernel Mode ارسال میشه تا بتونیم Text مورد نظر رو روی صفحه مانیتور ببینیم.

از اونجاییکه ویندوز با MFC Library عرضه میشه، استفاده از این Framework فوق العاده عموما باید اولین انتخاب برنامه نویس باشه. (بین Win32 و MFC منظورمه). در واقع شما پروژه رو بر این Framework بنا کنید و هر وقت مایل بودید، کاستیهایی که باهاش مواجه شدید رو با استفاده از Win32 پوشش بدید. نه اینکه پروژه رو روی Win32 بنا کنید و از Wrapper های موجود استفاده کنید. چراکه اینطوری، ساختار MFC رو بهم خواهید زد. (اگر چه بازهم این کار میسر هستش، اما هرگز چنین چیزی رو توصیه نمیکنم).

برای برخی امور، MFC در حال حاضر Wrapper ای نداره و شما باید خودتون آستینها رو بالا بزنید و Wrapper مورد نظر رو بنویسید. حالا این Wrapper میتونه داخل همون Module فعلی باشه، یا نه، میتونه Module جدایی باشه که توسط Interface های شناخته شده ای در دسترس قرار بگیره...

در نهایت، MFC رو خیلی خوب یاد بگیرید تا "شهروند خوبی" تو "شهر MFC" باشید. این مساله واقعا حائز اهمیت هستش و نباید هرگز نادیده گرفته بشه.

موفق باشید.

Irejx64
سه شنبه 17 فروردین 1389, 15:51 عصر
آقای موسوی واقعا منونم از راهنماییتون .