מחלקות התשתית שלמיקרוסופט,Microsoft Foundation Classes, אוMFC, זוספרייה של מיקרוסופט, העוטפת במחלקות++C את ה-API שלחלונות, ומהווהמסגרת יישום[1] לפיתוח בסביבת חלונות. מוגדרות בה מחלקות עבור מרבית שגרות הטיפול באובייקטים של חלונות וכן עבור חלונות מוגדרים מראש (predefined windows) ופקדים שכיחים.
MFC נוצרה ב־1992 עם המהדר (C/C++ 7.0 (compiler של מיקרוסופט, לשימוש עם גרסאות16 ביט של חלונות. היה זה חלק ממאמץ כללי של מיקרוסופט להשגתנתח שוק לכלי פיתוח. MFC עוצבה להיות חלון הראווה ליכולותיה שלשפת התכנות ++C. באותם ימים ++C רק החלה להחליף את C בפיתוחם של יישומיתוכנה מסחריים ו־C/C++ 7.0 הייתה הראשונה בין המהדרים של מיקרוסופט בהוספת תמיכה ב־++C. את ההשראה לפיתוחה קיבלה MFC מ־TCL)Think Class Library) שלמקינטוש - שמאוחר יותר נרכשה על ידיסימנטק - ובהרבה מובנים קיים דמיון למבנה שלה.
OWL)Object Windows Library) היה מוצר מתחרה שהוצג בידיבורלנד באותה התקופה. ה-OWL עוצב עבור מהדר הטורבו C של בורלנד. לזמן מה היה OWL פופולרי יותר מאשר MFC, מכיוון שהוא נאמן יותר לקווים המנחים שלתכנות מונחה עצמים. אך למרות זאת הוא איבד נתח שוק, עקב הפיגור בהוצאת עדכוני OWL למאפייניה החדישים של חלונות וכאשר בורלנד שחררה גרסה חדשה שלסביבת פיתוח, חסרת תאימות למהדורות הקודמות, היה זה עקב כך, שנאלצה לרכוש ממיקרוסופטרישיון לשימוש ב-MFC.
כאשר MFC הוצגה, מיקרוסופט הרחיבה את תחביר ++C עם סדרות שלמאקרויים לניהול הודעות (messages),חריגות (exceptions) וטיפול דינמי בעצמים בזמן ריצה (dynamic class instantiation), של חלונות. השינויים התחביריים להודעות חלונות נועדו לצמצום הזיכרון הנדרש, באמצעות מניעת שימוש מיותר בטבלה וירטואלית (vtable) וסיפקו מבנה יותר קונקרטי למגוון הכלים המסופקים בסביבת הפיתוחVisual C++ לעריכת ולתמרון קוד בלי לנתח את כל השפה. המאקרויים לטיפול בהודעות החליפו את מנגנון הפונקציות הווירטואליות שסופק על ידי ++C. מכיוון שכמה גרסאות של מאקרויים הכשילו את בדיקת הטיפוס הנעשית בידי המהדר, השימוש בהם נעשה מקור פורה לבאגים עבור משתמשי MFC. המאקרויים המיישמים סִדרות (serialization), תמיכה בחריגות וטיפוסי זמן ריצה דינמיים (dynamic runtime types), היו פחות בעייתיים והקדימו יכולות להרחבות של שפה מבוססתתקן, במספר שנים. גרסות32 ביט של MFC, עבורWindows NT 3.1 ומערכות הפעלה מאוחרות יותר של חלונות, שמרו על מאפיינים אלו לשם תאימות.
MFC קודמה בתחילה בידי מיקרוסופט. אך הבולטות שניתנה לה, הועמדה מאוחר יותר בצילן של מספרטכנולוגיות אחרות. ההתפתחות באה כשנעשה ברור ש־MFC מורכבת מדי עבור מתכנתים רבים ולכן שמה מיקרוסופט דגש רב יותר עלVisual Basic ככלי פיתוח לתוכנה מסחרית. כיום, היורש של Visual Basic ושל MFC הואWindows Forms[2] ב-Rapid application development[3] שלNet.. תוכניות C++Native[4] יכולות להשתמש ב־Windows Forms באמצעות הוספת C++ managed extensions[5].
MFC ממשיכה גם כיום לשמש לפיתוח חדש, בחברות שנכנסו להתחייבות אסטרטגית ל־++C ולפלטפורמת חלונות.
ב־MFC למעלה ממאתיים מחלקות, שקוד המקור המלא שלהן, כלול בכל עותק של סביבת הפיתוח ++Visual C. המחלקות מאורגנות בעץ תורשה שבראשו המחלקה CObject ורוב המחלקות יורשות ממנה. על פי רוב, גם מחלקה שכותב המתכנת תירש מ־CObject. את רובן של המחלקות אין צורך להכיר באופן מיידי. וכאשר עולה צורך באחת מהן, ניתן לחפש מידע עליה בעזרה המקוונת של מיקרוסופט MSDN.
בשיטת סימון זו מקבל משתנה שם תאורי שמתחיל באות גדולה. כאשר השם מורכב ממספר מילים, כל מילה מתחילה באות גדולה. את השם מקדמים באותיות שמציינות את טיפוסו. לדוגמה: b תציין משתנה בוליאני (boolean), מחלקה (class) תצוין ב־c ומחרוזת (string) תצוין באמצעות str או sz (או psz אם המחרוזת מוחזקת על ידי מצביע בתכנה).
משתנים בשיטה זו עשויים להראות כך: lpszName, או hWnd.
מתכנת הונגרי בשם צ'ארלס סימוניי, הנהיג במיקרוסופט שיטה זו למתן שמות ועל שמו היא נקראת השיטה ההונגרית. אפשרות נוספת היא שבמבט חפוז השמות נראים ככתובים בשפה זרה ולכן קיבלו שם זה.
שיטה זו נועדה ליצור אחידות בקוד ולמנוע שגיאות בשימוש במשתנים בשל חוסר תשומת לב לטיפוס של המשתנה. לשיטה נמצאו תומכים בשל יעילותה ומתנגדים בשל כיעורה, אך בפועל Windows API ו־MFC מבוססות על שיטה זו ולכן בתכנות לחלונות נהוג להשתמש בה.
כאמור MFC הייתה מורכבת מדי בעבור מתכנתים רבים והיוותה רף גבוה מדי.
בסביבת הפיתוח ++Visual C ישנם אשפים (wizards) המייצרים כמויות גדולות של קוד במהירות רבה. למרות היתרון הקיים באשפים אלו, ישנם הממליצים להתחיל את הלימוד בלא להשתמש בהם כיוון שהם עלולים לבלבל את המתלמד.
ייתכן שכדאי גם ללמוד באופן תאורטי את העקרונות המופשטים העומדים בבסיס השפה עוד בטרם כתיבת הקוד. עקרון שכזה לדוגמה הוא מודל מסמך/תצוגה.
כדי לשלוט ב־MFC יש לדעת את הנושאים הבאים:
| גרסת מוצר | תכונות עיקריות | גרסת .Net | ספריה | גרסת MFC | שנת שחרור |
|---|---|---|---|---|---|
| Microsoft C/C++ 7.0 | ממשק עבור WINDOWS API מחלקות לשימוש כללי: מחלקות אוסף - Collection מחלקת מחרוזת - String מחלקות זמן ותאריך תמיכה ביישומי ריבוי מסמכים - MDI | MFC 1.0 | 1992 | ||
| Visual C++ 1.0 | תמיכה בחלוניות Open ו Save As ובתצוגת רשימת קבצים אחרונים תמיכה בתצוגה לפני הדפסה תמיכה בסרגלי כלים ושורת סטטוס תמיכה משופרת בממשק OLE 1.0 תמיכה ב-DLL | MFC 2.0 | |||
| Visual C++ 1.5 | תמיכה בקישוריות למסדי נתונים -ODBC ממשק ל-OLE 2.01 | MFC 2.5 | |||
| Visual C++ 1.51 | MFC 2.51 | ||||
| Visual C++ 1.52c | MFC 2.5 (עדכון אחרון ל-Windows 3.x) | ||||
| Visual C++ 2.0 | תמיכה בכרטיסיות סרגלי תפריטים צפים ערכת פיתוח פקדים - CDK ליצירת פקדי OLE | MFC 3.0 | |||
| Visual C++ 2.1 | תמיכה בפקדים המשותפים דרייבר ODBC 2 משולב עם מנוע Access Jet מחלקות winsock | MFC 3.1 | |||
| Visual C++ 2.2 | MFC 3.2 | ||||
| Visual C++ 4.0 | מחלקות עצמי גישה לנתונים - DAO סרגלי פקדים צפים של חלונות 95 תמיכה מליאה בפקדים המשותפים של חלונות 95 מחלקות לסנכרון מטלות | MFC 4.0 (mfc40.dll כולל עםWindows 95) | אוגוסט 1995 | ||
| Visual C++ 4.1 | MFC 4.1 | ||||
| Visual C++ 4.2 | מחלקות WinInet מחלקות שרת ActiveX Documents מחלקות פקדי MFC ActiveX | MFC 4.2 (mfc42.dll כוללWindows 98 | מרץ 1998 | ||
| eMbedded Visual C++ 3.0 | mfc42.dll | MFC 4.2 | |||
| Visual C++ 5.0 | ספריית ATL תמיכת שפת C++ עבור לקוח - COM | mfc42.dll | MFC 4.21, עדכון גדול מ MFC 4.2. | ||
| Visual C++ 6.0 | תמיכה עבור HTML דינמי מכולות מסמכים פעילים תמיכה ב־ADO | mfc42.dll | MFC 6.0 | 1998 | |
| eMbedded Visual C++ 4.0 | mfcce400.dll | MFC 6.0 | |||
| Visual C++ .NET 2002 (Visual C++ 7.0) | 1.0 | mfc70.dll | MFC 7.0 | פברואר 2002 | |
| Visual C++ .NET 2003 (Visual C++ 7.1) | 1.1 | mfc71.dll | MFC 7.1 MFC 7.10.6119.0 | אפריל 2003 אפריל 2011 | |
| Visual C++ 2005 (Visual C++ 8.0) | 2.0 | mfc80.dll | MFC 8.0.50727.42 MFC 8.0.50727.762 MFC 8.0.50727.4053 MFC 8.0.50727.5592 MFC 8.0.50727.6195 | אוקטובר 2005 יוני 2007 יולי 2009 אפריל 2011 יוני 2011 | |
| Visual C++ 2008 (Visual C++ 9.0) | 3.5 | mfc90.dll | MFC 9.0.21022.8 MFC 9.0.30411 MFC 9.0.30729.1 MFC 9.0.30729.4148 MFC 9.0.30729.5570 | נובמבר 2007 אפריל 2008 אוגוסט 2008 יולי 2009 אפריל 2011 | |
| Visual C++ 2010 (Visual C++ 10.0) | 4.0 | mfc100.dll | MFC 10.0.30319.1 MFC 10.0.30319.415 MFC 10.0.40219.1 MFC 10.0.40219.325 | אפריל 2010 אפריל 2011 מרץ 2011 אוגוסט 2011 | |
| Visual C++ 2012 (Visual C++ 11.0) | 4.5 | mfc110.dll | MFC 11.0.50727.1 MFC 11.0.51106.1 MFC 11.0.60610.1 MFC 11.0.61030 | 26 ביולי 2012 5 בנובמבר 2012 26 ביולי 2013 20 בנובמבר 2013 | |
| Visual C++ 2013 (Visual C++ 12.0) | 4.5.1, 4.5.2 | mfc120.dll | MFC 12.0.21005.1 MFC 12.0.30501.0 | 5 באוקטובר 2013 30 בדצמבר 2014 | |
| Visual C++ 2015 (Visual C++ 14.0) | 4.6 4.6.1 | mfc140.dll | MFC 14.0.23026.0 MFC 14.0.23506.0 MFC 14.0.23918.0 MFC 14.0.24210.0 MFC 14.0.24212.0 | 20 ביולי 2015 30 בנובמבר 2015 | |
| Visual C++ 2017 (Visual C++ 15.0) | 4.6.2 | mfc140.dll | MFC 14.10.25008.0 | 7 במרץ 2017 |