خوراک پی سی کدنویس

ورود کاربران

آمار سایت

اعضا : 431
محتوا : 74
پیوندها : 6
بازدیدهای محتوا : 245392

حاضرین در سایت

 255 مهمان حاضر

برای نمایش بهتر سایت، از مرورگر استاندارد فایرفاکس استفاده کنید! مرورگر اینترنت اکسپلورر متعلق به دهه گذشته است!

firefox icon

Valid XHTML 1.0 Transitional Valid CSS!

تفاوت برنامه نویسی MFC و WIN32 در ویژوال سی

3 امتیاز
در محیط ++Visual C پروژه های متنوعی می توانید ایجاد کرد که دو نوع آنها استفاده بیشتری دارد. یکی پروژه های MFC و دیگری Win32.
این دو نوع پروژه چه تفاوتی دارند و به چه کارمان می‌آیند؟
تفاوت آنها با پروژه‌ی کنسول ساده چیست؟
با ما همراه باشید...

پروژه های Win32

از اسم win32 پیداست که منظور پروژه هاییست که برای ویندوز 32 بیتی نوشته می شود (البته اگر شما برنامه 64 بیتی هم بخواهید بنویسید باز همین نوع پروژه را می توانید استفاده کنید). ویندوز یک سری کتابخانه های پویا یا همان dll دارد که در این کتابخانه ها توابع متعددی برای کار با پنجره ها در محیط ویندوز وجود دارد. این توابع که به عنوان API (مخفف Application Programming Interface) مشهور هستند نوشته شده اند که کار میکروسافت و سیستم عامل ویندوزش راه بیفتد. لیکن مایکروسافت زحمت کشیده و بخش عظیمی از این API را در اختیار برنامه نویسان هم قرار داده که کار آنها هم لنگ نماند. مثلا تابع MessageBox که یک پیام را نمایش می دهد، یا تابع CreateWindowEx که یک پنجره ایجاد می کند، یا تابع ShellExecute که یک برنامه را اجرا می کند و یا تابع GetCommState که وضعیت پورت Com (ارتباط سریال) را مشخص می کند و توابعی از این دست، همگی در فایلهایی مثل user32.dll و kernel32.dll و ... تعریف شده اند.
به کمک این توابع شما می توانید پنجره بسازید، دکمه تعریف کنید، منو بسازید، نوار ابزار ایجاد کنید و هر آنچه در یک برنامه تحت ویندوز نوعی می بینید، ایجاد کنید. لیکن تمام کارها در قالب کدنویسی صورت می گیرد.

با تعریف پروژه win32 به طور پیش فرض فایل سرآیه‌ی windows.h به پروژه شما اضافه شده، فایلهای lib لازم (مثل user32.lib و kernel32.lib) هم در تنظیمات پروژه اضافه شده و تقریبا تمام توابع لازم برای کار با پنجره ها در اختیار شما قرار می گیرد. اگر این کارها را به صورت دستی در یک پروژه کنسول ساده انجام دهید نیازی به تعریف پروژه win32 ندارید!

پروژه های Microsoft Foundation ClassesMFC

MFC مخفف Microsoft Foundation Classes یعنی کلاسهای پایه ای میکروسافت، کتابخانه ای است که شرکت میکروسافت جهت تسهیل برنامه نویسی برای ویندوز توسعه داده است. این کتابخانه چیزی نیست جز تعدادی کلاس که به صورت پوششی بر روی API ویندوز قرار گرفته و کار کردن با پنجره ها را باز هم آسانتر کرده است. به عبارتی هزاران توابع موجود در API در قالب تعدادی کلاس و به صورت مرتب درآمده اند. مثلا توابع کار با پنجره در کلاس CWnd قرار گرفته اند؛ توابع کار با دکمه در کلاس CButton و توابع کار با دیالوگ در کلاس CDialog واقع شده اند. بسیاری از کلاسهای MFC از جمله CButton، CDialog، CEdit و CRichEdit فرزند کلاس CWnd هستند.
به کمک این نوع پروژه شما می توانید، منو، دیالوگ، نوار ابزار و حتی ریبون (ویژوال استودیو 2010) را به صورت دیداری طراحی کنید و فقط کدهای لازم برای مدیریت رویدادها (مثل کلیک روی یک منوی خاص) را می نویسید. در این نوع پروژه کلاسهایی مثل CImage برای کار با تصاویر، CButton برای کار با دکمه، CFont برای کار با قلمهای ویندوز، CMenu برای منوها و ده ها کلاس متنوع دیگر وجود دارد که برنامه نویسی تحت ویندوز را بسیار تسهیل می کند.

با همه این تفاسیر کار کردن با پروژه های MFC نسبت به زبانهایی مثل #C و ویژوال بیسیک بسیار سخت تر است! به عنوان مثال در #C به محض ساختن یک Text Box با نام edit1 متغیری با همین نام در اختیار شما قرار می گیرد که به راحتی می توانید با آن کار کنید (متن آن را بخوانید یا تغییر دهید یا رنگ آن را عوض کنید) لیکن در MFC باید یک متغیر به آن تخصیص دهید و یا با دستوری مثل GetDlgItem پنجره مربوط به آن Text Box را گرفته و سپس با آن کار کنید. آن هم نه همه کاری! مثلا کارهای ساده ای مثل تغییر رنگ یک کنترل در MFC به سختی پشتک بارو زدن است! کاری که در سایر زبانها در زمان طراحی قابل انجام است. البته همین امر هم سبب شده که برنامه های نوشته شده با ویژوال سی نسبت به سایر زبانها بسیار سریعتر باشند (هر زبان را بهر کاری ساختند!)
  • سعادت خواه
    avatar
    سلام،

    چند تا سوال موقع برنامه نویسی با VisualC++ برام پیش اومده، لطف بزرگی میکنید اگه جواب بدید:

    1- میخوام برای یک پروژه dialogbase رویداد کیبورد رو روی دیالوگ فعال کنم ولی روی دایالوگم کنترلهای دیگری مثل buttons & Editbox & etc موجوده و نمیذاره تا رویداد کیبورد فراخونی بشه، راه حلی براش هست؟

    2- در ضمن رویداد کیبورد همیشه حروف را بزرگ دریافت میکند. به عنوان مثال چه کپسلاک روشن باشه چه نباشه دکمه a کیبورد رو A دریافت میکنه.

    3- یک پروژه single document ساختم و میخواهم هم قابلیت رسم اشکال و نمودارها از طریق برنامه روی داکیومنتم داشته باشم و هم اینکه بتونم کنترلهای مختلف از جمله button روی اون قرار بدم. این کارهایی که به ذهنم رسید اینطوری بود: اگه baseclass رو از نوع CFormView انتخاب میکردم رویدادی مثل OnDraw پیدا نکردم که بتونم از طریق برنامه نمودارها و اشکال موردنظرمو رسم کنم با اینکه میتونستم به راحتی کنترلهای مختلف روی document قرار بدم. و اگه baseclass رو از نوع CView انتخاب میکردم نمیتونستم روی document کنترلهای مختلف قرار بدم. بنابراین دو تا سوال برام پیش اومد، یکی اینکه اگه بیس از نوع CView میباشه چطوری میتونم خودم کنترلی مثل CButton ایجاد کنم و نمایشش بدم و از رویدادهای اون استفاده کنم و اگه بیس از نوع CFormView باشه، چه رویداد و تابعی هنگام تغییر وضعیت پنجره فراخونی میشه مثل ondraw؟

    4- یک سوال بزرگ دیگه اینکه تمامی کنترلها و پنجره ها و دایالوگها خود نوعی شی هستند ولی این رویدادهایی که روی این شیئها اتقاق میفته رو نمیفهمم. یعنی چطور متوجه میشه که همچین رویدادی روی این شیء اتقاق افتاده؟ آیا به WindowsMessage ربطی داره؟ برنامه نویس میتونه خودش یک رویداد برای یک شیء بسازه؟
  • مدیر سایت  - رویدادها در پروژه مبتنی بر دیالوگ
    avatar
    سلام
    1. بله راه حلش این است که رویداد PreTranslateMessage مربوط به کلاس App را استفاده کنید.

    2. در PreTranslateMessage مشکل حل می شود.

    3. برای ایجاد دکمه و امثال آن روی CView از کدی مشابه زیر در فایل MainFrm.cpp استفاده کنید:
    CButton *MyBtn = new CButton();
    CRect rc(20, 20, 120, 50);
    MyBtn->Create(_T("Test";), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(100,100,200,130), this, ID_BTN_TEST);

    لیکن راه ساده تر این است که همان FormView را استفاده کرده و رویداد OnDraw یا OnPaint را مدیریت کنید: اگر نیستند، روی کلاس View کلیک راست کرده و در قسمت مشخصات گزینه override توابع را انتخاب کنید و تابع مورد نظر را اضافه کنید.

    4. متاسفانه این اشکال بزرگ VC است. راهش این است که کلاس این اشیاء از نو بنویسید (از کلاس پدر مشتق کنید) سپس رویدادهای مورد نظر آن را مدیریت کنید. مثلا یک کلاس CMyButton که از کلاس CButton مشتق شده بسازید و برای دکمه مورد نظر شیءی از این نوع تعریف کنید. حالا اگر روی کلاس CMyButton کلیک راست کنید به تمام رویدادها دسترسی دارید. راه دیگری هم دارد که همان استفاده از PreTranslateMessage است.
  • سعادت خواه
    avatar
    سوالام بیشتر شد:
    در مورد کیبورد من از رویداد onkeydown استفاده میکردم و این تابع همه چی که برای چک کردن کیبورد باشه رو به من میداد ولی pretranslatemessage یک MSG struct به من میده که من از اجزای اون سر در نمیارم و نمیدونم چیجوری باید این رویدادو مدیریت کنم مثلا اجزای message و wparam و lparam که از نوع int هستند چیند؟
    در مورد ساخت دکمه میدونم چیجوری میشه ساختش ولی نمیدونم چطوری نشونش بدم؟ و اینکه اگر من فقط یک شی از کلاس CButton بسازم نمیتونم از رویداد کلیک روی این شی ای که خودم ساختم استفاده کنم؟ یعنی باید یک کلاس دیگه مشتق شده از CButton بسازم و اون کلاسو مدیریت کنم؟ و اینکه بازم اگه از pretranslatemessage استفاده کنم همون سوالات قبلی پیش میاد. اون چیزی که در مورد formview گفتید جواب میده مرسی.
  • ناشناس  - یه سوال مبتدی
    avatar
    سلام من تازه میخوام یادگیری برنامه نویسی رو شروع کنم یه سوال برام پیش اومده :woohoo:
    در کل این آرایه هایی رو که در زبان برنامه نویسی تعریف میکنیم با چه برنامه ای باید به فایل اجرایی تبدیلشون کرد من ویزوآل سی پلاس پلاس رو نصب میکنم ولی آیکونی پیدا نمیکنم که بتونم برنامه رو باز کنم و توش آرایه ها رو تعریف کنم بعد ازش فایل اجرایی بگیرم ممنون میشم راهنماییم کنی :(
  • hamed  - سوال
    avatar
    با عرض سلام و خسته نباشی خدمت شما استاد عزیز
    ممکنه منو راهنمایی کنین که چه طور از دستورات و اینکه چه چیزی باید در آرگومانهای داخل پرانتز بنویسم باید اطلاع کسب کنم مثلا در cvcanny این آرگومانهایی که با ویرگول از هم جدا شدن چی هستن؟چه جوری تعریف می شن؟کدوماشو می تونیم صرف نظر کنیم؟ و کدوماش لازمن که مقدار دهی بشن؟
    cvCanny(const cvArr*imge,cvArr*edges,double threshold1,double threshold2,int aperture_size=3

    :?: :?: :?:
  • hamed
    avatar
    با عرض سلام خسته نباشی خدمت شما استاد عزیز
    با عرض سلام و تشکر
    ممکنه منو راهنمایی کنین که چه طور از دستورات و اینکه چه چیزی باید در آرگومانهای داخل پرانتز بنویسم باید اطلاع کسب کنم مثلا در cvcanny این آرگومانهایی که با ویرگول از هم جدا شدن چی هستن؟چه جوری تعریف می شن؟کدوماشو می تونیم صرف نظر کنیم؟ و کدوماش لازمن که مقدار دهی بشن؟
    cvCanny(const cvArr*imge,cvArr*edges,double threshold1,double threshold2,int aperture_size=3)
  • view  - com port
    avatar
    سلام
    دو تا سوال داشتم:
    1> می خواستم در باره ی استفاده از پورت com و همچنین رسم نمودارهایی که از این پورت می خونم اطلاعاتی داشته باشم من تازه c++ شروع کردم اگه منبع خوبی داشته باشید ممنون می شم معرفی کنید(دانشجوی برق هستم و با labview کار کردم و برای استفاده از این پورت در این نرم افزار مشکلی ندارم ولی فکر می کنم شاید c سریعتر باشه)
    2> تقریبا یه ساله که دارم با labview کار می کنم و خیلی دوستش دارم و بیشتر برای کارهای الکترونیکی و همچنین برای پردازش تصویر استفاده می کنم ولی مدتی که توی یه دو راهی گیر افتادم نمی تونم انتخاب کنم که مثلا کلا از کتاب خونهایی مثل AForge.net در c# استفاده کنم و یا مثلا opencv در c و یا این دو تا رو ول کنم و به labview بچسبم ( با vision toolkit و automation inspection)
  • بیتا
    avatar
    با سلام
    تشکر از سایت مفیدتون
    یک سوال داشتم از خدمتتون,کاربرد برنامه نویسی c++ (و یا کلا هر برنامه نویسی) در رشته مهندسی جوشکاری چیه؟؟
    ممنون میشم راهنمایی کنین.
اظهار نظر
مشخصات شما:
گراواتار enabled
نظر:
[b] [i] [u] [url] [quote] [code] [img]   
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch::(:shock:
:X:side::):P:unsure::woohoo::huh::whistle:;):s:!::?::idea::arrow:
امنیت
کد آنتی اسپم نمایش داده شده در عکس را وارد کنید.