Прикрепление и отделение объектов

ОГЛАВЛЕНИЕ

Прикрепление и отделение объектов MFC (библиотека базовых классов Microsoft) к и от объектов Windows.

Введение

MFC предоставляет набор "объектов-оберток", содержащих встроенные объекты Windows. Например, CWnd оборачивает HWND, CFont оборачивает HFONT, CBrush оборачивает HBRUSH, и так далее. Они сведены в таблицу ниже. Есть значимые взаимодействия между MFC и объектами Windows, которые надо понимать.

Нерешение этих вопросов может вызывать проблемы с произвольными операторами контроля ошибок, ошибками доступа, исчезающими объектами, и другие менее заметные проблемы.

Данная статья объясняет вопросы обращения с интерфейсом MFC/Windows.

Объект MFC

Объект Windows

(вариант)

CWnd

HWND

любое окно

CEdit

HWND

EDIT(редактировать)

CListBox

HWND

LISTBOX(окно списка)

CStatic

HWND

STATIC(статический)

CComboBox

HWND

COMBOBOX(комбинированный список)

CGDIObject

(gdi object)

(любой)

CBitmap

HBITMAP

 

CBrush

HBRUSH

 

CPen

HPEN

 

CFont

HFONT

 

CRegion

HRGN

 

CPalette

HPALETTE

 

 

Создание объекта Windows в два шага

Создание большинства объектов происходит в два шага. Первый шаг – создать объект C++, являющийся "оберткой" вокруг объекта Windows. Второй шаг – создать реальный объект Windows. Некоторые параметризованные конструкторы делают оба этих шага сразу. Например,

CPen pen;

Создает объект MFC CPen, но не связывает HPEN с ним. Но конструктор

CPen pen(PS_SOLID, 0, RGB(255, 0, 0));

создает объект MFC CPen, затем создает нижележащий объект Windows HPEN и прикрепляет этот объект к CPen.
Можно сделать это неявно с помощью метода Create(создать) (который иногда необоснованно переименуется, потому что разработчики MFC не были экспертами C++). Например, для создания пера можно сделать

CPen pen;
pen.CreatePen(PS_SOLID, 0, RGB(255, 0, 0));

(MFC имеет CreatePen и CreatePenIndirect, что глупо, потому что нет метода Create в CPen или в суперклассе CGDIObject).