Работали ли вы с MFC (Microsoft Foundation Classes)?

«Работали ли вы с MFC (Microsoft Foundation Classes)?» — вопрос из категории Other, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, имел опыт поддержки и модернизации legacy приложений на MFC. Это фреймворк для разработки Windows-приложений на C++, который предоставляет обёртки над WinAPI.

Основные аспекты работы с MFC:

  1. Архитектура документа/представления (Document/View):
    
    class CMyDocument : public CDocument {
    DECLARE_DYNCREATE(CMyDocument)
    // Данные документа
    std::vector<DataPoint> m_points;
    public:
    BOOL OnNewDocument() override {
        if (!CDocument::OnNewDocument()) return FALSE;
        m_points.clear();
        return TRUE;
    }
    };

class CMyView : public CView { DECLARE_DYNCREATE(CMyView) CMyDocument GetDocument() const { return reinterpret_cast<CMyDocument>(m_pDocument); } void OnDraw(CDC* pDC) override { // Отрисовка данных из документа for (const auto& point : GetDocument()->m_points) { pDC->Ellipse(point.x-5, point.y-5, point.x+5, point.y+5); } } };


2. **Обработка сообщений Windows через макросы:**
```cpp
BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
    ON_BN_CLICKED(IDC_BUTTON_OK, &CMyDialog::OnButtonOk)
    ON_EN_CHANGE(IDC_EDIT_NAME, &CMyDialog::OnEditChange)
    ON_WM_PAINT()
END_MESSAGE_MAP()
  1. Использование стандартных контролов: CButton, CEdit, CListCtrl, CTreeCtrl с привязкой данных через DDX_Text, DDX_Control.

Проблемы и решения:

  • Устаревший код: Рефакторинг с выделением бизнес-логики из UI-кода
  • Многопоточность: Осторожная работа с UI из рабочих потоков через PostMessage
  • Совместимость: Поддержка High-DPI, Unicode (переход с CString на CStringW)
  • Тестирование: Сложность юнит-тестирования из-за тесной связи с WinAPI

В новых проектах предпочитаю использовать Qt или современные UI-фреймворки, но понимание MFC полезно для поддержки существующих enterprise-приложений.