# Native Code > برنامه نویسی با C > برنامه نویسی با MFC و ++Visual C >  چگونگی نوشتن برنامه های MFC

## bsng110

به نام یگانه هستی بخش جهان
سلام بر دوستان و بزرگواران ارجمند
آقا یک سوال داشتم. بنده کمی تا حدی(غبار آلود) برنامه نویسی بلدم اما حالا می خوام با OpenGL کار کنم. ظاهراً از آن فقط در پروژه های MFC می توان استفاده کرد. از دوستان تقاضا مندم که چنانچه راه دیگری برای نوشتن برنامه های OpenGL وجود دارد، به بنده معرفی کنند و کمی نیز توضیح دهند اما چنانچه راه دیگری وجود ندارد، خواهشاً طریقه برنامه نویسی پروژه های MFC را یاد بدهند. بنده مشاهده کردم که به هنگام ساخت یک پروژه با نام X ، یک فایل Mainfrm.cpp (به همراه فایلی با همین نام و پسوند h.)، یک فایل با نام X.cpp (و h. آن)، یک فایل با نام XDoc.cpp(و h. آن)، یک فایل با نام XView.cpp(و h. آن) و یک فایل هم با نام stdafx.cpp (و h. آن) تولید می شود. از قبل نیز این فایل ها با کد هایی پر شده اند. یک کار مسخره ای که در این پروژه ها دیدم ظاهرا این طور است که در یک قسمت (کجا هنوز نمی دانم) یک کدی می نویسند و این کد را در یک حلقه بینهایت می گذارند و تا زمانی که کاربر پنجره برنامه MFC را نبسته است، این کد دائماً اجرا می شود(به نظر من خیلی این کار مسخره است، می توانستند مثل برنامه های معمولی یک کاری بکنند که هنگامی که برنامه اجرا می شود، منتظر یک رویداد باشد و چنانچه رویدادی رخ داد به آن پاسخ دهد نه اینکه دائم یک قطعه کد را اجرا کند تا بالاخره رویدادی رخ دهد). خلاصه شاید همه این حرف هایی که گفتم اشتباه باشد و این به دلیل نداشتن تجربه است. اما نکته دیگری که نمی دانم این است که کجا و در کدام یک از توابع باید چه کدی بنویسیم. در حقیقت قصد بنده ایجاد یک پرژوه است که در آن با استفاده از OpenGL چند پیکسل را روشن و خاموش کرده و اطلاعات آنها را بدست آورده و چند تابع ساده از OpenGL را اجرا کنم. جالب است که حتی برای نوشتن برنامه های OpenGL نیز راه های مختلفی دیدم که با کمک دوستان در قسمت های دیگر مشاهده کردم. مثلاً یک دیوانه ای جهت استفاده از OpenGL2 نشتسه بود و بسیاری از توابع فایل های سرآمد Windows.h و ... را پیاده سازی کرده بود تا بعد بتواند در آن از OpenGL2 استفاده کند که بنده فعلاً توانایی و فرصت چنین کاری را نداشته و می خواهم ظرف یکی دو روز برنامه ام را بنویسم. حتی دیدم در #C نیز از OpenGL استفاده کرده اند و توابع گرافیکی آن را به کار برده اند(جالب است که در آنجا نیز یک تابع اصلی وجود داشت که به تعداد خدا بار اجرا می شد و تا زمانی که ما برنامه را بندیم، متوقف نمی شد) اما فعلا نمی خواهم از #C استفاده کنم و به دلایلی نیاز به نوشتن برنامه CPP دارم. نکته آخر اینکه در مورد ردیابی یا Debug یا همان Trace این برنامه ها نیز یک توضیح مختصر بدهید ممنون می شوم. در هنگام ردیابی این برنامه ها مشاهده کردم که هر خطی از برنامه که اجرا می شود، نمی توان پنجره برنامه را مشاهده کرد و دید که چه چیزی ترسیم شده است. خوب دیگر ردیابی برنامه به چه دردی می خورد. یعنی فقط مشاهده چند عدد درون متغییر ها کافیست. بابا حرفه ای؟! ما که تا نبینیم کجا چی رسم می شه نمی توانیم کد خود را اصلاح کنیم.
در پایان از دوستانی که کمکم خواهند کرد، پیشاپیش تشکر می کنم و از این که وقت گذاشتید و این متن را خواندید نیز سپاسگزارم.
در پناه حق
یا علی

----------


## lord_akinak

> می خوام با OpenGL کار کنم. ظاهراً از آن فقط در پروژه های MFC می توان استفاده کرد


این طور نیست.. OpenGL و DirectX فقط به HDC و HWND نیاز دارن، حالا با هر چی که تولید شده باشن ( Win32 , MFC و هر چیز دیگه ... )



> به نظر من خیلی این کار مسخره است، می توانستند مثل برنامه های معمولی یک کاری بکنند که هنگامی که برنامه اجرا می شود، منتظر یک رویداد باشد و چنانچه رویدادی رخ داد به آن پاسخ دهد نه اینکه دائم یک قطعه کد را اجرا کند تا بالاخره رویدادی رخ دهد


باز هم این طور نیست ! اون حلقه Event های ویندوز هست و وقتی OpenGL یا DirectX رو به پنجره وصل کردید ، باید از داخل همین حلقه Render رو انجام بدید ...




> یک دیوانه ای جهت استفاده از OpenGL2 نشتسه بود و بسیاری از توابع فایل های سرآمد Windows.h و ... را پیاده سازی کرده بود تا بعد بتواند در آن از OpenGL2 استفاده کند


وقتی حالیت نیست ، نظر نده ..
.



> در مورد ردیابی یا Debug یا همان Trace این برنامه ها نیز یک توضیح مختصر بدهید ممنون می شوم


Debug برای DirectX هست ولی OpenGL رو مطمئن نیستم ، شاید اگه SDK رو کامل دانلود کنی داشته باشه! ولی assert در بیشتر مواقع جواب میده ...

اگه همیشه این طوری پست بدی آدم از کمک کردن بهت سرد میشه .. بهتره انقدر به خودت ننازی بابایی...

----------


## Inprise

کاربر lord_akinak : قبلا سه تا از پست هات به دلیل بی ادبی پاک شدن و یک تذکر هم گرفتی اما توجه نکردی . متاسفانه به دلیل توهین به سایر کاربران و فعالیت غیر فنی مداوم از سایت برنامه نویس اخراج میشی . مطلبت رو عمدا ویرایش نکردم که نمونه ای باشه برای ارجاعات آینده .

----------


## Nima_NF

> به نظر من خیلی این کار مسخره است، می توانستند مثل برنامه های معمولی یک کاری بکنند که هنگامی که برنامه اجرا می شود، منتظر یک رویداد باشد و چنانچه رویدادی رخ داد به آن پاسخ دهد نه اینکه دائم یک قطعه کد را اجرا کند تا بالاخره رویدادی رخ دهد).


برنامه نویسی با C++‎/C در سیستم عامل ها از نوع سطح پایین می باشد ، و  شما بر روی تمامی پیام های ارسال شده به برنامه کنترل دارید.
یعنی آن قسمتی که داخل حلقه بی نهایت است دقیقا همان کاری ای است که سیستم عامل انجام می دهد و از دید کاربر و سایر زبان های برنامه نویسی دیگر پنهان است(و این یعنی قدرت کنترل بیشتر ). وقتی شما فقط موس خود را بر روی پنجره برنامه حرکت می دهید بیش از 1000 پیام شامل حرکت موس ، شکل cursor ، تغییرات نمایشی و update قسمت های مختلف تصویر و... ارسال می شود که همه باید دریافت و پردازش شوند.
ضمنا بر خلاف تفکر اشتباه شما در این مورد این حلقه مدام در حال چک کردن نیست ، بلکه دستوری مثل GetMessage  پس از اینکه اجرا شد فقط زمانی که پیامی به قسمت صف پیام ها ارسال شود مقدار را بر می گرداند و حلقه دور بعد خود را انجام می دهد نه تکرار مداوم.




> ظاهراً از آن فقط در پروژه های MFC می توان استفاده کرد. از دوستان تقاضا مندم که چنانچه راه دیگری برای نوشتن برنامه های OpenGL وجود دارد، به بنده معرفی کنند


نه این طوز نیست ؛ شما در اکثر زبان های برنامه نویس می توانید از openGL استفاده کنید (دات نت یا غیر دات نت ،در ویندوز یا سایر سیستم عامل ها) ولی از انجایی که برنامه نویسی گرافیک سه بعدی به performance بالایی نیاز دارد ، اکثریت از ++C/C استفاده می کنند والبته بر خلاف تفکر شما کمتر از MFC در این مورد استفاده می شود و بیشتر از win32 یا همان دسترسی مستقیم به API ها استفاده می کنند (چون اکثر کار ها با همان API های openGL انجام می شود و کمترین با win32).
شما می توانید علاوه بر استفاده از Win32  و MFC ( که فقط محدود به ویندوز است) از موارد ذکر شده در این صفحه نیز استفاده کنید:  کتاب ها
مثل Qt که نمونه آن نرم افزار های google earth و Mudbox3D هست و یا همین طور استفاده از Wxwidgets به جای qt

----------


## bsng110

به نام عزیزترین و بخشنده ترین خالق تمام دنیا
سلام

 نظر شما برای بنده محترم است. به حساب کم تجربگی شما می گذارم. خدا همه گناهان ما را ببخشاید.

با تشکر از کاربر دوست داشتنی Inprise ولی بگم من از این بید ها نیستم که با این باد ها بلرزم. قصد یاد گیری دارم. از در بیرونم کنند از پنجره می آم تو... . به هر حال ممنون.

اما در مورد Nima_NF:
من که گفتم می دونم با خیلی روش ها می شه برنامه نوشت و مثلاً در دات نت نیز دیدم برنامه ای که نوشته بودند اما نمی دانم چگونه؟ روند کار چیست؟ آن لینکی که شما معرفی کرده بودید را قبلاً در جستجوی سایت مشاهده کرده و خوانده ام. بیشتر به معرفی کتاب پرداخته است و لینکی ندارد. جسارتاً در کتابخانه ها نیز کتاب بسیار است(البته اشتباه برداشت نکنید منظور چیز دیگری است). مثلاً یک کتاب ساده در مورد OpenGL کمتر از 6-7 هزار تومان نیست و بنده برای یک پروژه ساده که فقط دو تابع می خواهم بی انصافی است که چنین هزینه سنگینی داشته باشم.  بنده فقط گفتم اگر کسی قبلاً چنین کاری انجام داده است، به بنده بگوید از کدام پروژه، کدام تابع شروع کنم، چه بنویسم و ... . اصلاً بهتر است با وجود اینکه مسئله را کاملاً شرح دادم ولی بیشتر توضیح دهم. بنده می خواهم در یک تابعی (نمی دانم کدام تابع) چند تابع ساده که هم اکنون نوشته ام و با BC++‎ 5.0 کامپایل شده و اجرا می شوند و خروجی نیز دارند، را اجرا کنم. فقط می خواهم از توابع OpenGL و در VS  2005 استفاده کنم. در توابعی هم که نوشته ام فقط به همان دو تابعی که گفتم نیاز دارم. اگر آن دو تابع که گفتم، یعنی روشن کردن یک پیکسل با مقدار RGB که می خواهیم، و گرفتن رنگ یک پیکسل مشخص را نیز برای بنده معرفی کنید که خیلی ممنون می شوم. اگر می دانید که در win32 می توان چنین کاری کرد، بهتر است در همین پایگاه به بنده کمک کنید اما چنانچه در آن مورد چیزی نمی دانید، اشکالی ندارد، گفتم که فقط می خواهم همین کار ساده را انجام دهم(فراخوانی چند تابع ساده و مشاهده نتیجه آنها و نیازی هم به گوش دادن به پیغام های سیستم ندارم این را گفتم که بدانید برنامه خیلی ساده است) بنابراین اگر mfc بلدید، mfc بگویید. 
پیشاپیش از دوستانی که قصد کمک دارند، سپاسگزارم
در پناه حق
خدا نگهدارتان

----------


## sasan_vm

سلام

شاید دیدن مثال همرا با source در یادگیری کمکتان کند.
http://www.codesampler.com/

----------


## Nima_NF

بر خلاف تفکر شما ، راه اندازی یک پنجره برای اینکه با openGl یا direcX فقط داخلش بنویسید "سلام"  خودش نیاز به نوشتن حداقل 100 خط کد دارد :قسمتی برای دریافت پیام ها ، مقدار دهی اولیه (initialization ) و  ... و مثل استفاده از سایر کتابخانه ها نیست که هدر را include کنید و بعد همه چیز به همان راحتی باشد.

به هر حال اگر این کار را می خواستید با توابع گرافیکی خود ویندوز یعنی GDI انجام دهید به راحتی بود ، یعنی همان دو خط.




> ). مثلاً یک کتاب ساده در مورد OpenGL کمتر از 6-7 هزار تومان نیست و بنده برای یک پروژه ساده که فقط دو تابع می خواهم بی انصافی است که چنین هزینه سنگینی داشته باشم.


اگر کار شما به همین سادگی هست ، نیاز به خرید کتاب نیست، اینترنت برای همین منظور استفاده می شود، سایت زیر بهترین مرجع برای openGL هست و شما آموزش های مد نظر خود را در آن می توانید پیدا و استفاده کنید (دستوراتی مثل glReadPixels و glDrawPixels را نیز بررسی کنید.) ، مثال های بسیار ساده نیز وجود دارد:
http://nehe.gamedev.net

----------


## bsng110

به نام خدا
سلام و خسته نباشید
دستتون درد نکنه. در حال مشاهده لینک هایی که دادید، هستم. چنانچه با مشکلی بر خوردم از شما کمک خواهم گرفت. اما یک سوال GDI چیست و چگونه می توان از آن استفاده کرد. اگر کار کردن با آن این قدر آسان است که شما می گویید، می توانید یک راهنمایی بکنید تا حداقل آن را نیز یاد بگیرم.
خیلی ممنون و متشکر بابت پیگیری های مستمر شما و دیگر دوستان
در پناه حق
یا علی

----------


## Nima_NF

پس این طور که معلوم است ، کلا سوال از پایه اشتباه بود ؟!

آیا می دانید که چه وقت و چه افرادی از OpenGL و یا directX استفاده می کنند ؟
جواب) هرگاه کار گرافیکی 2 بعدی یا 3 بعدی شما (بیشتر 3D)، نیاز به استفاده از شتاب دهنده های کارت گرافیک داشته باشند که نتیجه آن پردازش سریع و کیفیت بالا است ، چون از  GPU یا همان واحد پردازنده گرافیکی به جای CPU اصلی کامپیوتر برای پردازش های گرافیکی استفاده می کند.

برای کار های ساده کسی از آن ها استفاده نمی کند، GDI (برای win32, MFC و ...) و یا +GDI (برای دات نت و همان قبلی ها) برای کار شما استفاده می شوند یعنی همان توابعی که شامل رسم text ، اشکال مختلف ، .. در تمام زبان ها در ویندوز وجود دارد. 

در win32 و MFC:

// for GDI:
Windows.h

SetPixel(hdc, X, Y , Color);
myColor =  GetPixel(hdc, X, Y );
-----------------------------------
// for GDI+:
gdiplus.dll
همان توابع ولی استفاده آن کمی فرق دارد
برای جزییات بیشتر در مورد GDI توابع فوق به MSDN در سایت مایکروسافت رجوع کنید.

----------

