Necesito crear algunos controles dinámicamente en un cuadro de diálogo MFC. La creación funciona bien hasta el momento, pero los controles creados dinámicamente se ven diferentes de los controles creados con el editor de recursos. Algunos controles incluso se comportan de manera diferente. Creo que me faltan algunas inicializaciones que hace el código generado.Cómo recrear el estilo utilizado por el editor de recursos al crear controles MFC dinámicamente?
Actualmente solo creo controles CStatic
y CEdit
. Ambos no usan la fuente estándar de Windows cuando los creo dinámicamente (la fuente se parece más a la fuente predeterminada utilizada antes de Windows 95, si no recuerdo mal).
Además, el control CEdit
se comporta diferente de cuando lo creo con el editor de recursos. El control creado dinámicamente parece limitar la longitud del texto al tamaño visible. Puedo establecer un texto más largo con SetWindowText()
y leer el texto completo con GetWindowText()
, pero el usuario no puede ingresar un texto más largo que el tamaño mostrado. El control CEdit
creado por el editor de recursos se comporta diferente: si el usuario ingresa un texto más largo que lo que se puede mostrar, el texto ingresado se "desplaza" dentro del control (sin barras de desplazamiento, ya que es un solo control de línea).
Intenté solucionar ese problema llamando al SetLimitText()
en el control, pero eso no cambió el comportamiento.
Los controles se guardan en matrices definidas en la clase de diálogo:
CStatic** m_pLabels;
CEdit** m_pEdits;
La creación de los controles que ocurre en el método de la clase de diálogo OnInitDialog()
:
for (int i = 0; i < max; i++)
{
m_pLabels[i] = new CStatic();
m_pLabels[i]->Create("key", WS_CHILD | WS_VISIBLE | SS_RIGHT,
CRect(10, 10 + i * 30, 130, 35 + i * 30), this);
m_pEdits[i] = new CEdit();
m_pEdits[i]->CreateEx(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_TABSTOP | WS_VISIBLE | WS_BORDER,
CRect(133, 10 + i * 30, 350, 35 + i * 30), this, i + 100);
m_pEdits[i]->SetLimitText(499);
m_pEdits[i]->SetWindowText("value to be edited");
}
Gracias por su ¡ayuda!
No sé cuál de las respuestas debo seleccionar como la "respuesta aceptada" ya que cada una responde una parte de mi pregunta. ¿Cuál es el procedimiento normal aquí? – Xperimental
Buena pregunta, ¡no estoy seguro! Le sugiero que simplemente elija el que sea más informativo y lo acepte, con algún comentario para explicar lo que hizo. – DavidK
Otra posible solución sería que yo respondiera la pregunta yo mismo, citando sus respuestas y luego seleccionando mi respuesta como la aceptada. O podría responder con algo como "Lee las otras respuestas para la solución final". – Xperimental