2009-01-07 4 views
0

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

// 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

Оказывается, что сторонний UI инструментарий был реконструкции View (кто знает, почему?) Так мой указатель к нему было чертовски. Таким образом, я действительно обновлял другое представление!

2

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

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

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

2

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

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

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

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

0

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

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

// appends text 
GetEditCtrl().ReplaceSel("\r\nMynew line"); 
Смежные вопросы