Использование производного класса от CEdit в моем DIalog - PullRequest
4 голосов
/ 08 декабря 2011

Я делаю приложение, используя MFC. Я только что создал класс, производный от CEdit, чтобы я мог перехватить OnChar () и выполнить проверку данных. Как заменить элемент управления для редактирования в моем приложении полученным, созданным мной?

Ответы [ 2 ]

1 голос
/ 11 мая 2012

Я нашел решение. Причина, по которой у меня были такие трудные времена, заключается в том, что я не использовал Class Wizard для создания нового класса, что усложняло ситуацию. Если вы просто используете мастер классов, у вас есть возможность добавить управляющие переменные к своим производным классам, как если бы они были обычными классами, если базовый класс является правильным классом для вашего элемента. Это не обязательно, хотя. Все, что вам нужно сделать, это создать указатель типа вашего производного класса и привести объект, который вы пытаетесь получить, как вы обычно делаете с не производным классом.

Пример доступа к элементу управления Edit с использованием класса, производного от CEdit

CMyCustomEdit * editPtr = (CMyCustomEdit*)GetDlgItem(IDC_EDIT1);

Как упомянуто ниже другим участником (спасибо за это), использование GetDlgItem не очень хорошая идея. На самом деле, в моем коде я обнаружил подклассы, чтобы я мог использовать свой новый класс с уже существующими элементами управления Edit. Как упоминалось ранее, я не понимал, что элемент управления Edit не обязательно был присоединен к CEdit, поэтому приведенный выше пример должен дать четкое представление о том, что ваш IDC_EDIT можно использовать как CMyCustomEdit, а также CWnd и т. Д .; он будет вести себя естественно, пока вы ссылаетесь на него с правильными классами.

Теперь для подкласса. Если вы действительно хотите, чтобы ваш элемент управления Edit всегда вызывал производный класс перед базовым классом, вам придется сделать его подклассом. Не думайте об этом как об объектно-ориентированной концепции, это только для того, чтобы сообщения (типа WN_CHAR) сначала проходили через ваш производный класс, а затем вызывали базовый класс.

Пример подкласса CMyCustomEdit для элемента управления Edit:

Сначала вам нужно включить файл .h вашего нового класса в .cpp и .h вашего диалогового окна. Это те, которые обычно имеют то же имя, что и ваш проект. Здесь это будет MyMainDialog.

#include "CMyCustomEdit.h"

В производном диалоговом классе включите переменную типа вашего нового производного класса:

class MyMainDialog : public CDialogEx
{
protected:
  CMyCustomEdit m_cmCEdit;
}

Затем в OnInitDialog () вашего производного диалогового класса (MyMainDialog) подкласс вашего элемента управления редактирования. В целях безопасности добавьте это после обычного кода в функции и перед возвратом (как обычно):

m_cmCEdit.SubclassDlgItem(IDC_EDIT1, this);

После того, как это будет сделано, когда вы сделаете что-либо в вашем элементе управления Edit с идентификатором IDC_EDIT1, сообщения будут проходить через CMyCustomEdit перед переходом в CEdit. Это обычно необходимо, когда вам нужно перезаписать сообщения из базовых классов.

Надеюсь, это поможет любому с подобным вопросом.

1 голос
/ 08 декабря 2011

До НЕ Использование GetDlgItem !!

GetDlgItem() возвращает указатель CWnd и ничего больше. Это означает, что у вас есть нарезанный указатель CMyCustomEdit. Конечно, он работает во всех случаях, когда ваш метод отправляет сообщение в базовый HWND. Но это просто чистая удача! Вы можете прочитать больше о проблеме здесь .

Правильное решение заключается в создании подкласса вашего элемента управления редактирования с использованием DDX_Control .

...