У меня есть представление, производное от 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
}





Проблема, кажется, кроется не в опубликованном вами коде. Я создал новое приложение MFC с представлением, полученным из CEditView, и код, который вы используете для добавления текста, работал нормально, хотя мне пришлось обернуть буквальный "\r\n" внутри явного временного CString, как в:
GetEditCtrl().SetWindowText(temp + CString("\r\n") + message);
Как говорит Джоэл, проблема в другом. Но есть большая проблема с тем, что вы делаете. Копирование текста из элемента управления, добавление к строке, а затем установка текста будет иметь ужасную производительность, если вы добавите в элемент управления больше, чем несколько строк текста.
Раньше, когда мне требовалось окно для отображения сообщений журнала, я создавал представление, содержащее элемент управления 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");
Оказалось, что сторонний набор инструментов пользовательского интерфейса реконструировал представление (кто знает, почему?), Поэтому мой указатель на него устарел. Таким образом, я действительно обновлял другую точку зрения!
Спасибо за попытку. Хотя подобный код работал ранее (ну, насколько вы могли ожидать, учитывая точку зрения ChrisN), похоже, что я что-то сломал, переходя с VS2003-> VS2005.