 Почему в CEditView не редактируется и не появляется никакой текст ?
    Почему в CEditView не редактируется и не появляется никакой текст ?
    
  |  | Наши проекты: Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту | |
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS | 
| [216.73.216.107] | 
|   | 
 | 
 Правила раздела Visual C++ / MFC / WTL (далее Раздела)
    Правила раздела Visual C++ / MFC / WTL (далее Раздела)
   FAQ Раздела
 FAQ Раздела   Обновления для FAQ Раздела
 Обновления для FAQ Раздела    Поиск по Разделу
 Поиск по Разделу   MSDN Library Online
 MSDN Library Online Почему в CEditView не редактируется и не появляется никакой текст ?
    Почему в CEditView не редактируется и не появляется никакой текст ?
    
  | 
         
         
          
           Сообщ.
           #1
          
          , 
          
         
         | |
|  |  Доброе утро! Я создал в Visual Studio 2019 проект MFC с view типа CView. Тип приложения - несколько документов, стиль = MFC Standard. Далее заменил базовый класс view с CView на CEditView, чтобы получить редактор. Как все выглядит на экране - см. скриншот (дерево слева к вопросу здесь не относится). Больше никаких замен в CView не делал. Я ожидал, что замена на CEditView приведет к тому, что в новых документах (на скриншоте - 3 новых документа во вкладках, появится "редакторы", в которых можно будет набирать текст. Однако текст не набирается. Вопросы: почему редактор "не активируется" ? Что еще необходимо сделать, чтобы редактор стал работать ? Как установить в редакторе какой-либо текст, который будет редактироваться ? Прикреплённая картинка Прикреплённая картинка -------------------- Результат замены класса: ------------------- class CTestMFCEmptyView : public CEditView --- в объявлении замена базового класса только здесь ! { protected: // создать только из сериализации CTestMFCEmptyView() noexcept; DECLARE_DYNCREATE(CTestMFCEmptyView) // Атрибуты public: CTestMFCEmptyDoc* GetDocument() const; // Операции public: // Переопределение public: virtual void OnDraw(CDC* pDC); // переопределено для отрисовки этого представления virtual BOOL PreCreateWindow(CREATESTRUCT& cs); protected: virtual BOOL OnPreparePrinting(CPrintInfo* pInfo); virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo); virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo); // Реализация public: virtual ~CTestMFCEmptyView(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: // Созданные функции схемы сообщений protected: DECLARE_MESSAGE_MAP() }; ---------------------- замена в карте сообщений ---------------------------- // было - CView, заменено на - CEditView IMPLEMENT_DYNCREATE(CTestMFCEmptyView, CEditView) BEGIN_MESSAGE_MAP(CTestMFCEmptyView, CEditView) // Стандартные команды печати ON_COMMAND(ID_FILE_PRINT, &CEditView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, &CEditView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CEditView::OnFilePrintPreview) END_MESSAGE_MAP() | 
| 
         
         
          
           Сообщ.
           #2
          
          , 
          
         
         | |
|  |  1. CEditView имеет дефолтовые ограничения на размер редактируемого текста. Лучше использовать CRichEditView 2. Для доступа к редактируемому тексту надо получить доступ к внутреннему CEdit через GetEditCtrl() 3. Лучше приложить свой проект. По одним заголовкам сказать сложно что вы не проинициализировали. | 
| 
         
         
          
           Сообщ.
           #3
          
          , 
          
         
         | |
|  |  sharky72, архив с проектом прилагаю. TestMFC_EmptyView.h - здесь объявлен наследник CEditView, он никакой исходный текст не загружает и не позволяет что-либо вводить на экране. TestMFC_EmptyView.cpp - реализация методов класса. Документ к этому view - TestMFC_EmptyDoc.h/cpp - документ я не использую. MainFrm_Empty.h/cpp - главный фрейм проекта. Ctrl-N создает документ и view к нему, открываются вкладки с именами TestMfcEmpty1, 2, ... Дерево не относится к этому вопросу, вопрос по нему в дрйго ветке. Посмотрите, пожалуйста, если можно. Прикреплённый файл  TestMFC_Empty.rar (107,66 Кбайт, скачиваний: 9) | 
| 
         
         
          
           Сообщ.
           #4
          
          , 
          
         
         | |
|  |  Потому что наследуемый метод должен вызывать родительский. У вас нарушена иерархия инициализации окна   BOOL CTestMFCEmptyView::PreCreateWindow(CREATESTRUCT& cs) {     // TODO: изменить класс Window или стили посредством изменения     //  CREATESTRUCT cs     return CEditView::PreCreateWindow(cs); } Прикреплённая картинка Добавлено И текст надо добавляеть не в OnDraw() это вообще для другого. А в OnInitialUpdate   class CTestMFCEmptyView : public CEditView {    ...    void OnInitialUpdate() override;    ... } void CTestMFCEmptyView::OnInitialUpdate() {     CString temp = L"qqqqqqqqqq";     CEdit& ctrl = GetEditCtrl();     ctrl.SetWindowText(temp); } | 
| 
         
         
          
           Сообщ.
           #5
          
          , 
          
         
         | |
|  | Цитата sharky72 @  Потому что наследуемый метод должен вызывать родительский. У вас нарушена иерархия инициализации окна Да, действительно! В принципе я знаю об этом, но надо было отследить ВСЕ вхождения CView. Спасибо, что подметили! Цитата sharky72 @  И текст надо добавлять не в OnDraw() это вообще для другого. А в OnInitialUpdate Спасибо, учту! |