2009-07-21 8 views
5

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!

+0

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

+0

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

+0

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

Respuesta

-1

Por favor, consulte las respuestas por DavidK y sharptooth para la solución a mis problemas.

+0

Como se indicó en el área principal de comentarios, no sabía cuál de las respuestas seleccionar como la "aceptada". Si publicar mi propia respuesta con una referencia a los originales no es una solución válida para ese problema, publique un comentario. – Xperimental

4

Creo que la mejor manera de hacerlo es poner un control a través del editor de diálogo en un diálogo, establecer sus estilos visuales a los que elija y luego abrir el archivo .rc en un editor de texto y copiar los estilos de ese control desde allí. De esta forma, podrá crear controles mucho más cercanos a los que agrega a través del editor de diálogos.

por ejemplo, después de poner un simple botón en un diálogo con Aceptar/Cancelar botones y un control de texto, mi diálogo es la siguiente con el archivo .rc:

IDD_MFCAPP_DIALOG DIALOGEX 0, 0, 320, 200 
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU 
EXSTYLE WS_EX_APPWINDOW 
CAPTION "MFCApp" 
FONT 8, "MS Shell Dlg", 0, 0, 0x1 
BEGIN 
    DEFPUSHBUTTON "OK",IDOK,263,7,50,16 
    PUSHBUTTON  "Cancel",IDCANCEL,263,25,50,16 
    CTEXT   "TODO: Place dialog controls here.",IDC_STATIC,10,96,300,8 
    PUSHBUTTON  "Button1",IDC_BUTTON1,43,17,50,14 
END 

Ahora, ya que tengo toda la información acerca de cómo se creó el diálogo en el back-end, simplemente puedo replicar este comportamiento a través del código.

P.S. Por supuesto, harías esto en un proyecto de prueba separado.

+0

Sí, normalmente yo también lo haría. – djeidot

5

controles dinámicamente creados siempre reciben la fuente stock inicialmente: el enfoque habitual es fijar simplemente la fuente del control en la fuente del diálogo de los padres: algo así como

pEdits[i]->SetFont(GetFont()); 
+0

Gracias por esa solución rápida. – Xperimental

1

Es necesario añadir el estilo ES_AUTOHSCROLL a la caja de edición. Este estilo es responsable de desplazar el texto hacia la izquierda cuando ingresa más texto del que se puede mostrar.

Abrir archivos .rc en el editor de texto y buscar los estilos de controles puede ayudarlo a encontrar dichos puntos.

+0

Gracias, eso lo solucionó. De alguna manera, me he perdido la bandera de estilo, ya que había intentado ese enfoque con la apertura del archivo .rc antes, aunque no estoy seguro de por qué. – Xperimental

Cuestiones relacionadas