CEditView не показывает текст

У меня есть представление, производное от CEditView. Он доступен только для чтения. Я хотел бы установить текст как своего рода логирование, но на экране ничего не отображается. Если я проверю temp в отладчике после GetEditCtrl().GetWindowText(temp);, я вижу, что текст действительно меняется внутри, но я ничего не вижу на экране.

// HistoryView.cpp : implementation file
//

#include "stdafx.h"
#include "HistoryView.h"


// CHistoryView

IMPLEMENT_DYNCREATE(CHistoryView, CEditView)

CHistoryView::CHistoryView()
{

}

CHistoryView::~CHistoryView()
{
}

BEGIN_MESSAGE_MAP(CHistoryView, CEditView)
END_MESSAGE_MAP()


// CHistoryView diagnostics

#ifdef _DEBUG
void CHistoryView::AssertValid() const
{
    CEditView::AssertValid();
}

#ifndef _WIN32_WCE
void CHistoryView::Dump(CDumpContext& dc) const
{
    CEditView::Dump(dc);
}
#endif
#endif //_DEBUG


// CHistoryView message handlers

void CHistoryView::OnInitialUpdate()
{
    CEditView::OnInitialUpdate();

    // TODO: Add your specialized code here and/or call the base class
    GetEditCtrl().SetReadOnly(TRUE);
}

//!
/*!
*/
void CHistoryView::AddRow(CString message)
{
    CString temp;
    GetEditCtrl().GetWindowText(temp);

    if (temp.IsEmpty())
    {
        GetEditCtrl().SetWindowText(message);
    }
    else
    {
        GetEditCtrl().SetWindowText(temp + "\r\n" + message);
    }

    GetEditCtrl().LineScroll(2, 0);
    //GetEditCtrl().UpdateWindow(); // no effect
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
1 477
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Проблема, кажется, кроется не в опубликованном вами коде. Я создал новое приложение MFC с представлением, полученным из CEditView, и код, который вы используете для добавления текста, работал нормально, хотя мне пришлось обернуть буквальный "\r\n" внутри явного временного CString, как в:

GetEditCtrl().SetWindowText(temp + CString("\r\n") + message);

Спасибо за попытку. Хотя подобный код работал ранее (ну, насколько вы могли ожидать, учитывая точку зрения ChrisN), похоже, что я что-то сломал, переходя с VS2003-> VS2005.

Nick 08.01.2009 01:41

Как говорит Джоэл, проблема в другом. Но есть большая проблема с тем, что вы делаете. Копирование текста из элемента управления, добавление к строке, а затем установка текста будет иметь ужасную производительность, если вы добавите в элемент управления больше, чем несколько строк текста.

Раньше, когда мне требовалось окно для отображения сообщений журнала, я создавал представление, содержащее элемент управления CListBox. Чтобы добавить строку, вызовите CListBox::AddString, затем, когда список достигает некоторого максимального количества строк, вызовите CListBox::DeleteString, чтобы удалить самый старый элемент. Таким образом, добавление строк всегда происходит быстро, а объем памяти, используемой элементом управления, не увеличивается бесконечно.

Если текст предназначен только для отображения и вам не нужно, чтобы он был доступен для редактирования, я бы посоветовал вам подумать об использовании вместо него CListBox.

Надеюсь, это поможет!

В дополнение к ответу ChrisN, если вы хотите сохранить CEdit, вы можете использовать

// sets cursor to end of text
int nCurrentLength= GetEditCtrl().GetWindowTextLength();
GetEditCtrl().SetSel(nCurrentLength,nCurrentLength); 

// appends text
GetEditCtrl().ReplaceSel("\r\nMynew line"); 
Ответ принят как подходящий

Оказалось, что сторонний набор инструментов пользовательского интерфейса реконструировал представление (кто знает, почему?), Поэтому мой указатель на него устарел. Таким образом, я действительно обновлял другую точку зрения!

Другие вопросы по теме