TN014: Controles personalizados

Esta nota describe la compatibilidad de MFC para controles personalizados y self-drawing. También se describe la dinámica creación de subclases. Asesoramiento general sobre la propiedad de objetos CWnd vs HWNDs se presenta.

La aplicación de ejemplo MFC CTRLTEST ilustra muchas de estas características. Consulte el código fuente de la muestra General de MFC CTRLTEST y ayuda en línea.

Dibujado por el propietario controles y menús

Windows proporciona soporte para menús y controles "owner draw". Se trata de mensajes de Windows enviados a la ventana principal de un control o el menú que le permiten personalizar la apariencia visual y el comportamiento del control o el menú.

MFC admite directamente owner draw con las entradas de mapa de mensajes:

Se pueden reemplazar en su CWnd-derivado de la clase (normalmente un cuadro de diálogo o ventana de marco principal) para implementar el comportamiento dibujado por el propietario.

Este enfoque no conducir a código reutilizable. Si tiene dos controles similares en dos distintos cuadros de diálogo, debe implementar el comportamiento de control personalizado en dos lugares. La arquitectura de control self-drawing MFC admite soluciona este problema.

Menús y controles self-Drawing

MFC proporciona una implementación predeterminada (en CWnd y CMenu) para los mensajes estándar dibujado por el propietario. Esta implementación predeterminada será descodificar los parámetros dibujado por el propietario y delegar los mensajes dibujado por el propietario de los controles o menú. Esto se denomina "self-draw" ya que el código de dibujo (medición/comparando) está en la clase del control o menú, no en la ventana propietaria.

Esto le permite crear clases reutilizables control que mostrar el control utilizando la semántica de "propietario de dibujar". El código para dibujar el control, no el dueño del control, está en la clase del control. Se trata de un enfoque orientado a la programación de control personalizado.

Para obtener más información sobre el propietario-sorteo estructuras (DRAWITEMSTRUCT, MEASUREITEMSTRUCT, COMPAREITEMSTRUCTy DELETEITEMSTRUCT) consulte la documentación de MFC para CWnd::OnDrawItem, CWnd::OnMeasureItem, CWnd::OnCompareItemy CWnd::OnDeleteItem respectivamente.

Mediante los menús y controles self-drawing

Para menús self-drawing, debe reemplazar funciones miembro MeasureItem y DrawItem.

Para self-drawing cuadros de lista y cuadros combinados, debe reemplazar MeasureItem y DrawItem. Debe especificar el estilo OWNERDRAWVARIABLE en la plantilla de cuadro de diálogo (LBS_OWNERDRAWVARIABLE y CBS_OWNERDRAWVARIABLE respectivamente). El estilo OWNERDRAWFIXED no funciona con self-drawing elementos desde la altura de punto fijo se determina antes de self-drawing controles están conectados al cuadro de lista. (Los miembros de Win 3.1 funciones CListBox::SetItemHeight y CComboBox::SetItemHeight puede utilizarse para eludir esta limitación).

Además, tenga en cuenta que el cambio a un estilo OWNERDRAWVARIABLE afectará el estilo NOINTEGRALHEIGHT . Debido a que el control no puede calcular una altura integral con elementos de tamaños variables, el estilo por defecto de INTEGRALHEIGHT es ignorada y el control es siempre NOINTEGRALHEIGHT. Si tus artículos son fijos altura, puede impedir que elementos parciales se dibujan especificando el tamaño del control un multiplicador integral del tamaño del elemento.

Para self-drawing cuadros de lista y cuadros combinados con el estilo SORT (LBS_SORT y CBS_SORT respectivamente), se debe reemplazar la función de miembro de CompareItem.

Para self-drawing cuadros de lista y cuadros combinados, DeleteItem normalmente no se reemplaza. DeleteItem puede reemplazarse si memoria adicional u otros recursos se almacenan con cada elemento del cuadro lista cuadro o combinado.

Ejemplos de menús de controles Self-Drawing

El ejemplo General de MFC CTRLTEST proporciona ejemplos de un menú self-draw (mostrando colores) y un cuadro de lista self-draw (también mostrando colores).

El ejemplo más típico de un botón de self-drawing es un botón de mapa de bits (un botón que muestra imágenes de mapa de bits de uno, dos o tres para los diferentes Estados). Esto está previsto en la clase MFC CBitmapButton.

Subclases dinámico

Subclases es el término de Windows para reemplazar el WndProc de una ventana con un diferente WndProc y pidiendo el viejo WndProc funcionalidad predeterminada (superclase).

No debe confundirse con derivación de clase de C++ (C++ terminología utiliza las palabras "de base" y "derivan", mientras que el modelo de objetos de Windows utiliza "super" y "sub"). Derivación de C++ con subclases MFC y Windows son funcionalmente muy similares, excepto C++ no admite una característica similar a subclases dinámico.

La clase CWnd proporciona la conexión entre un objeto de C++ (derivado de CWnd) y un objeto de ventana de Windows (también conocido como un HWND).

Hay tres maneras comunes que estén relacionadas:

Este último caso se hace con las funciones miembro:

Ambas rutinas adjuntar un objeto CWnd un HWNDde Windows existente. SubclassWindow toma el HWND directamente, y SubclassDlgItem es un auxiliar que tenga un identificador de control y la ventana padre (normalmente un cuadro de diálogo). SubclassDlgItem está diseñado para sujetar objetos de C++ a los controles de cuadro de diálogo creados a partir de una plantilla de cuadro de diálogo.

Consulte la ejemplo CTRLTEST para varios ejemplos de cuándo se debe utilizar SubclassWindow y SubclassDlgItem.

&Notas técnicas por número |nbsp; Notas técnicas por categoría

Index