Как правильно создать подкласс элемента управления MFC? - PullRequest
4 голосов
/ 12 февраля 2010

Размещаем диалоги с помощью редактора ресурсов. Скажем, у меня есть RichEditCtrl с именем IDC_RICH. И я хочу связать его с экземпляром пользовательского класса CMyRichEditCtrl : CRichEditCtrl, не теряя возможности устанавливать для него свойства в редакторе ресурсов.

Какой правильный путь? Конечно, вы можете получить некоторые функциональные возможности, создав переменную, связанную с DDX, и изменив тип на CMyRichEditCtrl. Но в некоторых случаях я вижу людей, вызывающих код вроде:

m_Rich.SubclassDlgItem(IDC_RICH, this));

Какая разница?

РЕДАКТИРОВАТЬ: Одна проблема, которую я вижу, состоит в том, что когда я переопределяю методы Create (Ex), они не вызывают. Это похоже на то, что элемент управления уже создан к тому времени, когда мой объект связан с идентификатором ресурса, возможно?

Ответы [ 3 ]

7 голосов
/ 12 февраля 2010

DDX_Control () делает SubclassWindow () под капотом. SubclassDlgItem является ярлыком для SubclassWindow (GetDlgITem ()). Обычно (общее обобщение здесь) люди, использующие SubclassWindow, - те, кто приобрел эту привычку до того, как DDX_Control существовал (до 1995 года или около того?) И никогда не переходил в режим MFC, или люди, которые копируют и вставляют свои программы вместе из фрагментов блога влево и вправо.

Итак, используйте DDX_Control () для ясности, хотя технически это не будет иметь значения, если вы используете SubclassDlgItem ().

4 голосов
/ 12 февраля 2010

Окна, которые вы вводите в диалог с редактором ресурсов, создаются с использованием CreateWindow (Ex) с первым аргументом, установленным на имя класса, указанное в файле .rc. Затем механизм DDX_ связывает это экземплярное окно с членом класса диалога в DoDataExchange ().

MFC - это слой поверх Win32, но разработка MFC не полностью защищает вас от Win32. Это больше похоже на набор классов и методов, которые избавляют от рутинной работы MFC и предоставляют некоторую форму объектно-ориентированного подхода. Методы объекта MFC не являются теми, которые выполняют реальную работу, и большая часть фреймворка делает вещи под капотом и не уведомляет «верхний уровень» (то есть объекты MFC), если это явно не подключено. Create () - это такой метод, который существует только в том случае, если вы хотите вручную создать элемент управления, он не вызывается MFC при создании объекта. (это обобщение, потому что иногда это так, но это выходит за рамки этого обсуждения).

1 голос
/ 04 января 2017

1> Для элементов управления, которые вы вводите в диалог с редактором ресурсов, используется DDX_Control:

class CMyDlg : public CDialogEx
{

protected:
    virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

public:
    CRichEditCtrl m_Rich;
};

void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_RICHEDIT1, m_Rich);
}

2> Для элементов управления, которые создаются вручную:

CRichEditCtrl m_Rich; m_Rich.Create(...); m_Rich.SubclassDlgItem(IDC_RICH, this));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...