visual c++ - SetLimitText() en un CEdit en Vista no funciona
visual-c++ mfc (3)
No debería haber problemas con solo 6000 caracteres. ¿Tal vez el problema está en otra parte? ¿Tiene algún controlador para cambios de eventos / notificaciones del cuadro de texto? Tal vez están colgando?
Esto está sucediendo en Vista. Creé un nuevo diálogo basado en un proyecto MFC para probar esto. Agregué un control CEdit a mi diálogo. Llamé a SetLimitText para que mi CEdit reciba 100000 caracteres. Intenté ambos:
this->m_cedit1.SetLimitText(100000);
UpdateData(FALSE);
y
static_cast<CEdit*>(GetDlgItem(IDC_EDIT1))->LimitText(100000);
Hice estas llamadas en InitDialog.
después de pegar 5461 caracteres en mi CEdit, se vuelve vacío y no responde. ¿Alguna idea de lo que está causando esto y soluciones para poder pegar largas cadenas de texto en un CEdit o cualquier otro control?
nota: 5461 es 0x1555 o 1010101010101 en binario, lo que me parece bastante extraño.
si pego 5460 caracteres no tengo problemas.
Contacté con el soporte de microsof.
El objetivo era tener aproximadamente 240000 caracteres en una sola línea de texto editable.
Puedo reproducir el problema en Windows Vista (x64 y x32 ambos) pero no en Windows XP.
este código funciona bien en XP:
BOOL ClongeditXPDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application''s main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
UINT limit = m_longEdit.GetLimitText();
m_longEdit.SetLimitText(240000);
UINT limit2 = m_longEdit.GetLimitText();
CString str;
str = _T("");
for(int i = 0; i < 250000; i++)
str += _T("a");
m_longEdit.SetWindowText(str);
return TRUE; // return TRUE unless you set the focus to a control
}
Si utilizo un control CRichEdit en su lugar, cuando presiono la tecla "finalizar" o la tecla "flecha derecha" después de pegar una cadena larga en el interior, no puedo ver todos los caracteres en el Control de edición enriquecida. intentar pasar el último carácter visible produce un pitido. El resto de los personajes están ahí, lo sé porque si hago doble clic en Rich Edit Control y copio el texto usando ctrl-c y luego lo pego en un editor de texto, puedo ver los 240000 caracteres. Entonces, el control contiene la cantidad correcta de caracteres, pero los últimos caracteres no se pueden ver excepto en un editor externo, por lo que mi problema original permanece.
Aquí están las respuestas de los representantes de microsoft:
El problema aquí es que un control de edición con una gran cantidad de caracteres no pinta su texto.
Intenté establecer diferentes personajes, y descubrí que podía caber más '''' que de ''x'' que ''m''. El problema no es directamente el número de caracteres, sino el número de píxeles. Al multiplicar el número de caracteres visibles por el ancho del píxel de los caracteres en la fuente seleccionada, se muestra que el límite es de aproximadamente 32k píxeles.
otra respuesta de microsoft:
Hice una extensa investigación sobre este tema y me gustaría actualizarlo sobre el progreso del caso.
La principal diferencia entre el control Edit en Vista y en XP es que el control Edit en Vista precompone sus glifos para una mejor compatibilidad internacional (internamente, termina llamando a ExtTextOut con ETO_GLYPH_INDEX y una matriz de glifos en lugar de una cadena de caracteres. Esto termina guardando los índices de glifos en un metarchivo y así se ejecuta en el límite de píxeles de 32 K. Cuando se proporcionan demasiados caracteres, ExtTextOut falla y no extrae nada. El control de Edición en XP no precompone los glifos, por lo que no tiene este problema, pero no manejará caracteres internacionales también.
El control de edición en XP se recortará a 32k, pero como es fuera de pantalla no es obvio. Cuando se desplaza hacia la derecha, comienza con el primer carácter visible, por lo que la parte visible del control siempre es anterior a 32k píxeles.
El control RichEdit dibuja el comienzo, pero después de tocar Fin, las ediciones ocurren principalmente fuera de la pantalla. RichEdit 3.0 y 4.1 da un comportamiento similar. Este parece ser el límite de píxeles de 32k del control RichEdit, ya que dibuja su texto en un mapa de bits fuera de pantalla antes de mostrarlo en la pantalla.
Teniendo en cuenta estos puntos, el comportamiento es por diseño. Debería crear su propio control para obtener el comportamiento de mostrar una cadena tan grande como 240000 en una sola línea.
y el último:
Hice más investigaciones sobre este tema para encontrar cualquier solución ligera para superar el límite de 32k píxeles, pero desafortunadamente parece que no hay una solución para esto.
Algunas de las alternativas que probamos son RichEdit 3.0, RichEdit 4.1, el uso de UniScribe, el uso de diferentes fuentes, etc., pero ninguno de ellos parece ser suficiente.
Posiblemente, necesitaría crear su propio control personalizado si desea mostrar una cadena editable de línea única que exceda el límite de píxeles de 32k en Windows Vista.
FYI - si el texto es de solo lectura / solo dsiplay, puede agregar algunos CR-LF a la cadena para corregir la visualización del texto. Parece que la función ExtTextOut funciona ligeramente diferente cuando las líneas nuevas. Como se trata de un cuadro de edición de una sola línea, las líneas nuevas se quitan para que el texto tenga el mismo aspecto: a menos que lo copie y lo pegue, las líneas vendrán en la cadena ...