Member 13916604 Ответов: 2

Перегрузите cedit и используйте его в ceditview


Привет,

У меня есть старое приложение SDI под VS 7.1 на C++ с использованием MFC.
И я хотел бы вывести класс CEdit, чтобы добавить некоторые функции (например, CEditEx).

Я не нашел, как использовать этот класс CEditEx в моем производном классе CEditView; он относится только к возможностям CEdit.

Заранее благодарю вас за вашу помощь (С, если это возможно, некоторыми дополнительными объяснениями о связи между CEdit и CEditView),
Эрик

Что я уже пробовал:

Я попытался перегрузить GetEditCtrl().

2 Ответов

Рейтинг:
13

Jochen Arndt

Цитата:
объяснение связи между CEdit и CEditView
CEditView он немного особенный. Пока не унаследована форма CEdit- он ведет себя как один из них. Видеть afxext.инл:
// CEditView
// NOTE: The cast in GetEditCtrl is ugly, but must be preserved for compatibility.
// CEdit is not related to CEditView by inheritance so we must be careful to ensure 
// that CEdit remains a binary compatible subset of CEditView.
_AFXEXT_INLINE CEdit& CEditView::GetEditCtrl() const
	{ return *(CEdit*)this; }

Решение состоит в том, чтобы реализовать необходимую функциональность в вашем CEditView производный класс.

Если у вас есть исходный код расширенного CEdit класс, скопируйте необходимые части кода в свой класс. CEditView основанный класс и префикс доступа ко всем CEdit члены с GetEditCtrl().


Member 13916604

Спасибо, я постараюсь сделать это таким образом

Member 13916604

Чтобы держать вас в курсе; я внедряю функции в doc и view. Это вполне сделано, но, чтобы иметь чистый дизайн, мне интересно, можно ли отправить сообщение из представления в doc (с параметрами)? Поскольку кажется, что WM_MESSAGE зарезервированы для просмотра и wnd.

Jochen Arndt

Общий метод состоит в том, чтобы получить доступ к документу с помощью CView::GetDocument() и привести его к вашему классу документа (или лучше реализовать функцию, подобную GetMyDocument() в вашем классе представления, возвращая уже ваш тип класса документа) и вызвать функции-члены вашего класса документа.

Поскольку CDocument основан на CCmdTarget, он может обрабатывать сообщения. Для конкретных сообщений приложения определите свои собственные с помощью смещений WM_APP plus (см. https://docs.microsoft.com/en-us/windows/desktop/winmsg/wm-app) и отправить их в Главное окно фрейма. Если никакое другое окно (сам основной фрейм, активный дочерний фрейм, представление активного дочернего фрейма) не обрабатывает сообщение, оно, наконец, направляется в документ.

Member 13916604

Йохен,

Ваше первое предложение-это то, что я сделал, но я хотел бы сохранить функции дока в тайне.

Я пробую ваше второе предложение, которое именно то, что я ищу.
Если моя функция обработчика находится в CMainFrame, она работает, но не в doc.

Вот карта сообщений моего доктора:
ON_MESSAGE(WM_MSG, OnMyMsg)

Но у меня есть следующая проблема с актерским составом:
ошибка c2440: 'метод static_cast' : не удается конвертировать из 'LRESULT (__thiscall CMyDoc::* )(параметр wparam,lparam должен)' к 'LRESULT (__thiscall метод cwnd::* )(параметр wparam,lparam должен)'

Я попытался принудительно привести его с помощью reinterpret_cast<LRESULT (CWnd::*)(WPARAM, LPARAM)>(); он компилируется, но моя функция не вызывается.

Возможно, я что-то упустил...

Jochen Arndt

Это не достаточно кода, чтобы определить вашу ошибку.

Но в модели представления документа MFC производные классы представлений связаны с производным классом doc. Они связаны и принадлежат друг другу. Таким образом, нет никаких проблем для вызова функций doc непосредственно из представления. Это тоже распространенный метод. Так почему же он отличается и сложнее, чем все остальные делают это?

Если вам нужно защитить функции doc, сделайте их защищенными и объявите свой класс(ы) представления как друга(ы). Тогда только сам документ и друзья (представления) могут вызывать эти функции.

Member 13916604

Работа делается таким образом ^^
Спасибо Вам за Вашу поддержку и объяснения

Рейтинг:
1

Richard MacCutchan

Видеть Класс CEditView[^], где он показывает родительский класс, чтобы вы могли видеть, что он наследует.


Member 13916604

На самом деле CEdit не является ни членом CEditView, ни имеющим отношения наследования. Вот почему это так сложно...

Richard MacCutchan

Это был смысл моего ответа и ссылки, которую я дал вам.

Member 13916604

Извините, я прочитал ваш ответ немного быстро и не уловил вашей точки зрения

Richard MacCutchan

Вам нужно посмотреть на класс CEditView, чтобы увидеть его связь с объектом CEdit. Поскольку они тесно связаны друг с другом, было бы довольно трудно вместо этого ввести свой собственный класс. Вам нужно посмотреть на конструкторы CEditView и его родительских классов.