Рейтинг:
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 и его родительских классов.