2010-02-12 3 views
3

Мы размещаем диалоговые окна, используя редактор ресурсов. Так сказать, у меня есть RichEditCtrl, называемый IDC_RICH. И я хочу связать его с экземпляром пользовательского класса CMyRichEditCtrl : CRichEditCtrl, не теряя возможности устанавливать в нем свойства в редакторе ресурсов.Каков правильный способ создания подкласса MFC-управления?

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

m_Rich.SubclassDlgItem(IDC_RICH, this)); 

В чем разница?

EDIT: Одна из проблем, которые я вижу, заключается в том, что когда я переопределяю методы Create (Ex), они не вызываются. Это похоже на то, что элемент управления уже создан к тому моменту, когда мой объект привязан к идентификатору ресурса, pehaps?

ответ

4

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

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

+0

По классу-имя, которое вы означает класс Window, а не класс C++? Если я создаю настраиваемый элемент управления с его собственным именем класса Window, он все равно позволит мне изменить базовые свойства в редакторе ресурсов? Или просто появиться как большая серая коробка? –

+0

Да, класс окна, первый параметр для CreateWindow(). Вы не можете поместить пользовательский контроль в редактор ресурсов без явной поддержки кодировки. Это то, что используется в элементе «Пользовательский контроль» в VS Toolbox. Вы можете установить несколько свойств, таких как включен и заголовок, но это очень просто. («пользовательский контроль» я имею в виду «производный от CWnd», а не из другого элемента управления, и если вы это сделаете, вы можете установить свойства в редакторе ресурсов, потому что редактор ресурсов не будет знать о новом элементе управления или классе окна управления имя). – Roel

6

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

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

0

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));

Смежные вопросы