我有一个从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
}
答案 0 :(得分:2)
问题似乎存在于您发布的代码之外的某个地方。我使用从CEditView派生的视图创建了一个新的MFC应用程序,并且您用来添加文本的代码工作正常,尽管我必须将文字"\r\n"
包装在显式临时CString
中,如:
GetEditCtrl().SetWindowText(temp + CString("\r\n") + message);
答案 1 :(得分:2)
正如乔尔所说,问题出在其他地方。但是,你正在做的事情存在更大的问题。一旦向控件添加多行文本,从控件中复制文本,追加到字符串,然后设置文本将会有糟糕的性能。
过去,当我需要一个窗口来显示日志消息时,我创建了一个包含CListBox
控件的视图。要添加行,请调用CListBox::AddString
,然后当列表框达到某个最大行数时,请调用CListBox::DeleteString
删除最旧的项目。这样,添加行总是很快,控件使用的内存量不会无限增长。
如果文字仅用于展示,而您不需要它可编辑,我建议您考虑使用CListBox
。
我希望这有帮助!
答案 2 :(得分:0)
除了ChrisN的回答,如果你想保留一个CEdit,你可以使用
// sets cursor to end of text
int nCurrentLength= GetEditCtrl().GetWindowTextLength();
GetEditCtrl().SetSel(nCurrentLength,nCurrentLength);
// appends text
GetEditCtrl().ReplaceSel("\r\nMynew line");
答案 3 :(得分:0)
事实证明第三方UI工具包正在重建View(谁知道为什么?)所以我的指针是陈旧的。因此,我实际上刷新了不同的观点!