2011-05-18 30 views
7

Muy bien, primero estoy codificando en C usando la api win32, no mfc, no .net, no wxwidgets. He creado una ventana con la clase WC_TABCONTROL, y he agregado pestañas a ella, todo funciona bien, excepto ... Necesito tener contenido en cada pestaña, recibí la impresión de msdn de que necesitaba crear un diálogo para cada uno página, y luego carga el diálogo cuando el usuario selecciona una pestaña. El único problema con esto es que mi ventana principal no es un diálogo, por lo que hacer que el cuadro de diálogo para la pestaña encaje perfectamente no funciona demasiado bien.C control de pestañas win32

Así que me pregunto si hay una mejor manera de hacerlo. Pensé en solo esconderme y mostrar diferentes controles por pestaña, pero eso no parece una buena idea.

Lo que me gustaría es que cuando mi aplicación comience a cambiar el tamaño de la ventana y el control de pestañas al tamaño mínimo necesario para todas las pestañas (3-4 pestañas), y la ventana no se podrá redimensionar lo cual supongo que simplifica las cosas un poco. Hice esto siguiendo el ejemplo en msdn (cargando cada cuadro de diálogo en la memoria, pasando por cada uno y configurando un RECT al tamaño mínimo necesario luego redimensionando todo), el problema es que el tamaño está en unidades de cuadro de diálogo y no puedo conviértalo en píxeles porque todavía no tengo un HWND para el cuadro de diálogo.

Básicamente mi pregunta es cuál es la mejor manera de administrar los controles en una ventana con un control de pestañas. Entonces, si tengo un control de pestañas y el usuario cambia de tab1 a tab2, quiero que se muestren controles diferentes para el usuario.

+4

Voto a favor de mi compañero "no mfc, no .net, no wxwidgets" hermano. :( – Colen

+7

Mi razón para no usar mfc o .net o wxwidgets es una: propósitos de aprendizaje, y la api win32 me fascina. Y siempre me ha gustado hacer las cosas un poco más bajo. – Josh

Respuesta

3

La idea básica de MSDN es tener los controles para cada pestaña dentro de su propia HWND. El beneficio de esto es que puede ocultar/mostrar todos los controles dentro de un HWND ocultando/mostrando ese padre HWND. Esto significa que pasar de una pestaña a otra es simplemente ocultar un contenedor HWND y mostrar otro, que es más simple y más elegante que tener que ocultar/mostrar grupos de controles. (También mantiene el código del controlador de diálogo para cada panel por separado, que generalmente es lo que desea). Sin embargo, se permiten ambos enfoques: a menudo es más conveniente crear un diálogo, pero no es obligatorio.

Estos contenedores HWND no tienen que ser cuadros de diálogo, pero usar un diálogo significa que Windows completará el contenido de un archivo .rc y manejará las tabulaciones del teclado automáticamente. Si creas tu propio HWND, tendrás que hacer esto tú mismo. Podría adoptar un enfoque híbrido: comience con un diálogo, pero agregue sus propios controles en el controlador WM_INITDIALOG si es necesario, e incluso maneje WM_SIZE para hacer un diseño personalizado para que los controles se ajusten mejor.

Si va por la ruta de crear su propio HWND, busque IsDialogMessage() para una manera simple de agregar soporte de tabulación del teclado a su propio HWND; y también verifique el estilo WS_EX_CONTROLPARENT para que funcione la tabulación entre las pestañas y los controles en el contenedor HWND.

Re: "el problema es que el tamaño está en unidades de cuadro de diálogo y no puedo convertirlo en píxeles porque todavía no tengo un HWND para el cuadro de diálogo". - puede usar CreateDialog para crear el diálogo como invisible - omita WS_VISIBLE del archivo .rc - luego puede medir/cambiar el tamaño según corresponda antes de mostrarlo.

+0

Pensé en usar CreateDialog para crear cada diálogo y verifique el tamaño, el único problema es que se trata de crear unos 4 cuadros de diálogo para que la aplicación se ejecute y el ID prefiera crearlos según sea necesario, entonces, si hay alguna manera, puedo verificar el tamaño de cada uno sin crearlos realmente. resuelve mis problemas :) – Josh

+1

Los cuadros de diálogo pueden ser relativamente baratos de instanciar, en relación con la percepción del tiempo del usuario final de todos modos.(Si los está poblando con información de fuentes lentas, entonces, demore la población.) Mi 2c: siga adelante y pruébelo de la manera más fácil primero, y vea si es lo suficientemente rápido. Si es lo suficientemente rápido, entonces has terminado, pasa al siguiente problema. Solo dedique el tiempo a agregar la complejidad adicional para medir sin crear si está seguro de que es necesario para hacer una diferencia necesaria. (Regla de desarrollo general: no optimice prematuramente: el tiempo de desarrollo es un recurso valioso, utilícelo donde haga la mayor diferencia). – BrendanMcK

Cuestiones relacionadas