CEditView не показывает текст - PullRequest
0 голосов
/ 08 января 2009

У меня есть представление, которое получено из CEditView. Это только для чтения. Я хотел бы установить текст как вид регистрации, но на экране ничего не появляется. Если после GetEditCtrl().GetWindowText(temp); я проверяю 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
}

Ответы [ 4 ]

2 голосов
/ 08 января 2009

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

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

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

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

2 голосов
/ 08 января 2009

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

GetEditCtrl().SetWindowText(temp + CString("\r\n") + message);
0 голосов
/ 09 января 2009

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

0 голосов
/ 08 января 2009

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

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

// appends text
GetEditCtrl().ReplaceSel("\r\nMynew line"); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...