headerctrl.h

Clase wxHeaderCtrl

wxHeaderCtrl es el control que contiene los encabezados de columna que se utiliza normalmente para la visualización de datos tabulares.

Jerarquía:

Jerarquía de la clase wxHeaderCtrl

Se utiliza como parte de wxGrid, en la versión genérica wxDataViewCtrl y en la vista de informe de wxListCtrl, pero también se puede utilizar de forma independiente. En general, esta clase está pensada para ser utilizada como parte de otro control que ya almacene la información de las columnas en algún lugar, ya que no se puede utilizar directamente: en su lugar, es necesario heredar de ella e implementar el método GetColumn() para proporcionar la información de las columnas. Ver wxHeaderCtrlSimple para una clase de control concreta que puede utilizarse directamente.

Además de etiquetar las columnas, el control tiene las siguientes características:

  • Soporte de reordenación de columnas, ya sea configurando explícitamente el orden de las columnas y llamando a SetColumnsOrder() o arrastrando las columnas interactivamente (si está habilitado).
  • Visualización de los iconos en la cabecera: esto se utiliza a menudo para mostrar un indicador de ordenación u ordenación inversa cuando se hace clic en la cabecera de la columna.

Hay que tener en cuenta que este control no hace nada más que mostrar las cabeceras de las columnas. En particular, la reordenación y ordenación de las columnas debe seguir siendo soportada por el control asociado que muestra los datos reales bajo la cabecera. Hay que recordar también llamar al método ScrollWindow() del control si la ventana de visualización de datos asociada tiene una barra de desplazamiento horizontal, de lo contrario las cabeceras no se alinearían con los datos cuando se desplace la ventana.

Este control se implementa utilizando el control de cabecera nativo bajo sistemas MSW y una implementación genérica en otros lugares.

Mejoras futuras

Algunas características son soportadas por el control nativo MSW y por lo tanto podrían ser fácilmente implementadas en esta versión de wxHeaderCtrl pero necesitan ser implementadas en la versión genérica también para ser realmente útiles. Por favor, háganos saber si necesita o, mejor, planea trabajar en la aplicación, cualquiera de ellos:

  • Mostrar mapas de bits en lugar de o junto con el texto.
  • Encabezados dibujados a medida.
  • Filtros asociados a una columna.

Estilos

Esta clase admite los siguientes estilos:

wxHD_ALLOW_REORDER
Si se especifica este estilo (es por defecto), el usuario puede reordenar las columnas del control arrastrándolas.
wxHD_ALLOW_HIDE
Si se especifica este estilo, el control muestra un menú emergente que permite al usuario cambiar la visibilidad de las columnas al hacer clic con el botón derecho del ratón. Hay que tener en cuenta que el programa siempre puede ocultar o mostrar las columnas, este estilo sólo afecta a la capacidad del usuario para hacerlo.
wxHD_BITMAP_ON_RIGHT
La imagen de la columna, si existe, se mostrará a la derecha si se utiliza este estilo. Hay que tener en cuenta que este estilo sólo se implementa en wxMSW actualmente y no hace nada en las otras plataformas. Está disponible desde wxWidgets 3.1.1.
wxHD_DEFAULT_STYLE
Nombre simbólico para el estilo de control por defecto, actualmente igual a wxHD_ALLOW_REORDER.

Eventos emitidos por esta clase

Las siguientes macros de manejadores de eventos redirigen los eventos a manejadores de funciones miembro 'func' con prototipos como:

void handlerFuncName(wxHeaderCtrlEvent& event)

Macros de eventos para eventos emitidos por esta clase:

EVT_HEADER_CLICK(id, func)
Se ha hecho clic en el encabezado de una columna.
EVT_HEADER_RIGHT_CLICK(id, func)
Se ha hecho clic con el botón derecho en el encabezado de una columna.
EVT_HEADER_MIDDLE_CLICK(id, func)
Se ha hecho clic en el encabezado de una columna con el botón central del ratón.
EVT_HEADER_DCLICK(id, func)
Se ha hecho doble clic en el encabezado de una columna.
EVT_HEADER_RIGHT_DCLICK(id, func)
Se ha hecho doble clic derecho sobre el encabezado de una columna.
EVT_HEADER_MIDDLE_DCLICK(id, func)
Se ha hecho doble clic con el botón central del ratón sobre el encabezado de una columna.
EVT_HEADER_SEPARATOR_DCLICK(id, func)
Se ha hecho doble clic sobre el separador situado a la derecha de la columna especificada (esta acción se utiliza habitualmente para redimensionar la columna para ajustarla al ancho de su contenido y el control proporciona el método UpdateColumnWidthToFit() para facilitar su implementación).
EVT_HEADER_BEGIN_RESIZE(id, func)
El usuario comenzó a arrastrar el separador a la derecha de la columna con el índice especificado (esto sólo puede ocurrir para las columnas para las que wxHeaderColumn::IsResizeable() devuelve true). El evento puede ser vetado para evitar que la columna sea redimensionada. Si no lo es, los eventos de redimensionamiento y fin de redimensionamiento (o arrastre cancelado) se generarán más tarde.
EVT_HEADER_RESIZING(id, func)
El usuario está arrastrando la columna con el índice especificado redimensionándola y su anchura actual es wxHeaderCtrlEvent::GetWidth(). El evento puede ser vetado para detener completamente la operación de arrastre en cualquier momento.
EVT_HEADER_END_RESIZE(id, func)
El usuario ha dejado de arrastrar la columna soltando el ratón. Normalmente la columna debería redimensionarse al valor de wxHeaderCtrlEvent::GetWidth().
EVT_HEADER_BEGIN_REORDER(id, func)
El usuario ha comenzado a arrastrar la columna con el índice especificado (esto sólo puede ocurrir para los controles con estilo wxHD_ALLOW_REORDER). Este evento puede ser vetado para evitar que la columna sea reordenada, de lo contrario se generará posteriormente el mensaje de fin de reordenación.
EVT_HEADER_END_REORDER(id, func)
El usuario soltó la columna en su nueva ubicación. El evento puede ser vetado para evitar que la columna se coloque en la nueva posición o manejado para actualizar la visualización de los datos en el control asociado para que coincida con la nueva ubicación de la columna (disponible desde wxHeaderCtrlEvent::GetNewOrder()).
EVT_HEADER_DRAGGING_CANCELLED(id, func)
Se ha cancelado la operación de redimensionamiento o reordenación actualmente en curso. Esto puede ocurrir si el usuario pulsó la tecla Esc mientras arrastraba el ratón o se perdió la captura del ratón por alguna otra razón. Sólo se necesita manejar este evento si la aplicación entró en algún modo modal cuando comenzó el redimensionamiento o reordenamiento, en cuyo caso se debería manejar este evento además de los correspondientes a fin de redimensionamiento o reordenamiento.

Funciones miembro

wxHeaderCtrl()

wxHeaderCtrl::wxHeaderCtrl()

Constructor por defecto que no crea la ventana subyacente.

Se debe utilizar Create() después de crear el objeto utilizando este constructor.

wxHeaderCtrl()

wxHeaderCtrl::wxHeaderCtrl( wxWindow * parent, wxWindowID winid = wxID_ANY, const wxPoint & pos = wxDefaultPosition, const wxSize & size = wxDefaultSize, long style = wxHD_DEFAULT_STYLE, const wxString & name = wxHeaderCtrlNameStr )

Constructor que crea la ventana.

Consultar la documentación de los parámetros en Create().

AddColumnsItems()

void wxHeaderCtrl::AddColumnsItems( wxMenu & menu, int idColumnsBase = 0 )

Función auxiliar que añade los elementos seleccionables correspondientes a todas las columnas al menú dado.

Esta función es usada por ShowColumnsMenu() pero también puede ser usada si se muestra un menú propio de columnas personalizado y se quieren mostrar todas las columnas en él. Añadir elementos de menú con etiquetas de columna como texto e ids consecutivos empezando por idColumnsBase al menú y comprobar los elementos correspondientes a las columnas actualmente visibles.

Ejemplo de uso:

wxMenu menu;
menu.Append(100, "Some custom command");
menu.AppendSeparator();
AddColumnsItems(menu, 200);
const int rc = GetPopupMenuSelectionFromUser(menu, pt);
if ( rc >= 200 )
    ... toggle visibility of the column rc-200 ...
Parámetros
menu
El menú al que se añadirán los elementos. Puede estar vacío o no.
idColumnsBase
El id del elemento de menú correspondiente a la primera columna, las demás son consecutivas a partir de ella. Debe ser positivo.
Create()

bool wxHeaderCtrl::Create( wxWindow * parent, wxWindowID winid = wxID_ANY, const wxPoint & pos = wxDefaultPosition, const wxSize & size = wxDefaultSize, long style = wxHD_DEFAULT_STYLE, const wxString & name = wxHeaderCtrlNameStr )

Crea la ventana de control de cabecera.

Parámetros
parent
La ventana padre. El control de cabecera debería posicionarse típicamente a lo largo del borde superior de esta ventana.
winid
Id del control o wxID_ANY si no le importa.
pos
La posición inicial del control.
size
El tamaño inicial del control (normalmente no es muy útil ya que este control normalmente se redimensionará para tener el mismo ancho que el control de visualización de datos asociado).
style

El estilo del control, wxHD_DEFAULT_STYLE por defecto. Hay que tener en cuenta que el estilo por defecto permite al usuario reordenar las columnas arrastrándolas y se necesita desactivar explícitamente esta función utilizando:

wxHD_DEFAULT_STYLE & ~wxHD_ALLOW_REORDER 

si no se desea.

name
El nombre del control.
GetColumn()

virtual const wxHeaderColumn& wxHeaderCtrl::GetColumn(unsigned int idx) const

Método a implementar por las clases derivadas para devolver la información de la columna dada.

Parámetros
idx
El índice de la columna, entre 0 y el último valor pasado a SetColumnCount().
GetColumnAt()

unsigned int wxHeaderCtrl::GetColumnAt(unsigned int pos) const

Devuelve el índice de la columna mostrada en la posición dada.

Parámetros
pos
La posición de visualización, por ejemplo 0 para la columna más a la izquierda, 1 para la siguiente y así sucesivamente hasta SetColumnCount() - 1.
GetColumnCount()

unsigned int wxHeaderCtrl::GetColumnCount() const

Devuelve el número de columnas del control.

Valor de retorno

Número de columnas establecido previamente por SetColumnCount().

GetColumnPos()

unsigned int wxHeaderCtrl::GetColumnPos(unsigned int idx) const

Obtiene la posición en la que se muestra actualmente esta columna.

Obsérvese que se devuelve una posición válida incluso para las columnas ocultas actualmente.

Parámetros
idx
El índice de la columna, debe ser menor que GetColumnCount().
GetColumnsOrder()

wxArrayInt wxHeaderCtrl::GetColumnsOrder() const

Devuelve la matriz que describe el orden de visualización de las columnas.

Para los controles sin estilo wxHD_ALLOW_REORDER el array devuelto será el mismo que se pasó a SetColumnsOrder() previamente o definirá el orden por defecto (con n-ésimo elemento siendo n) si no se ha llamado. Pero para los controles con estilo wxHD_ALLOW_REORDER, las columnas también pueden ser reordenadas por el usuario.

GetColumnTitleWidth()

int wxHeaderCtrl::GetColumnTitleWidth(const wxHeaderColumn & col)

Devuelve el ancho necesario para el título de la columna dada.

GetColumnTitleWidth()

int wxHeaderCtrl::GetColumnTitleWidth(unsigned int idx)

Devuelve el ancho necesario para la columna con el índice dado.

Esto es sólo una envoltura conveniente para la sobrecarga que toma wxHeaderColumn.

IsEmpty()

bool wxHeaderCtrl::IsEmpty() const

Devuelve true si el control tiene columnas.

MoveColumnInOrderArray()

static void wxHeaderCtrl::MoveColumnInOrderArray( wxArrayInt & order, unsigned int idx, unsigned int pos )

Función auxiliar para manipular la matriz de índices de columnas.

Esta función reorganiza la matriz de índices de columnas indexadas por posiciones (es decir, utilizando la misma convención que para SetColumnsOrder()) de modo que la columna con el índice dado se encuentre en la posición especificada.

Parámetros
order
Matriz que contiene los índices de las columnas por orden de sus posiciones.
idx
El índice de la columna a mover.
pos
La nueva posición de la columna idx.
OnColumnCountChanging()

virtual void wxHeaderCtrl::OnColumnCountChanging(unsigned int count)

Puede sobrescribirse en la clase derivada para actualizar las estructuras de datos internas cuando cambia el número de columnas del control.

Este método es llamado por SetColumnCount() antes de cambiar efectivamente el número de columnas.

La versión de la clase base no hace nada pero es una buena práctica llamarlo desde la versión sobreescrita en la clase derivada.

ResetColumnsOrder()

void wxHeaderCtrl::ResetColumnsOrder()

Restablece el orden natural de las columnas.

Después de llamar a esta función, la columna con índice idx aparece en la posición idx en el control.

SetColumnCount()

void wxHeaderCtrl::SetColumnCount(unsigned int count)

Establece el número de columnas del control.

El control utilizará GetColumn() para obtener información sobre todas las nuevas columnas y actualizarse, es decir, este método también tiene el mismo efecto que llamar a UpdateColumn() para todas las columnas, pero sólo debe utilizarse si el número de columnas ha cambiado realmente.

SetColumnsOrder()

void wxHeaderCtrl::SetColumnsOrder(const wxArrayInt & order)

Cambia el orden de visualización de las columnas.

El orden de visualización define el orden en que aparecen las columnas en la pantalla y no afecta a la interpretación de los índices por parte de los demás métodos de la clase.

La matriz de orden especifica los índices de columna correspondientes a las posiciones de visualización.

Parámetros
order
Una permutación de todos los índices de columna, es decir, una matriz de tamaño GetColumnsOrder() que contiene todos los índices de columna exactamente una vez. El n-ésimo elemento de esta matriz define el índice de la columna mostrada en la n-ésima posición desde la izquierda (para la dirección de escritura por defecto de izquierda a derecha).
ShowColumnsMenu()

bool wxHeaderCtrl::ShowColumnsMenu( const wxPoint & pt, const wxString & title = wxString() )

Muestra el menú emergente que permite al usuario mostrar u ocultar las columnas.

Esta función muestra el menú emergente que contiene todas las columnas con marcas de verificación para las que se muestran actualmente y permite al usuario marcarlas o desmarcarlas para cambiar su visibilidad. Es llamada desde el manejador por defecto EVT_HEADER_RIGHT_CLICK para los controles que tienen el estilo wxHD_ALLOW_HIDE. Y si la columna tiene también el estilo wxHD_ALLOW_REORDER, el menú también contiene un ítem para personalizar las columnas mostradas usando el cual se llama a ShowCustomizeDialog(), por favor ver su descripción para más detalles.

Si una columna fue toggleada, se llama a la función virtual UpdateColumnVisibility() por lo que debe ser implementada para los controles con estilo wxHD_ALLOW_HIDE o si se llama a esta función explícitamente.

Parámetros
pt
La posición del menú, en las coordenadas de la ventana de cabecera.
title
El título del menú si no está vacío.
Valor de retorno

true si se ha mostrado u ocultado una columna o false si no se ha hecho nada, por ejemplo porque se ha cancelado el menú.

ShowCustomizeDialog()

bool wxHeaderCtrl::ShowCustomizeDialog()

Mostrar el diálogo de personalización de columnas.

Esta función muestra un diálogo modal que contiene la lista de todas las columnas que el usuario puede utilizar para reordenarlas, así como mostrar u ocultar columnas individuales.

Si el usuario acepta los cambios realizados en el diálogo, se llamará a los métodos virtuales UpdateColumnVisibility() y UpdateColumnsOrder() por lo que deben ser sobrescritos en la clase derivada si alguna vez se llama a este método. Nótese que el usuario podrá invocarlo interactivamente desde el menú emergente de la cabecera si el control tiene los estilos wxHD_ALLOW_HIDE y wxHD_ALLOW_REORDER.

UpdateColumn()

void wxHeaderCtrl::UpdateColumn(unsigned int idx)

Actualiza la columna con el índice dado.

Cuando el valor devuelto por GetColumn() cambia, este método debe ser llamado para notificar al control sobre el cambio y actualizar la presentación visual para que coincida con los nuevos datos de la columna.

Parámetros
idx
El índice de la columna, debe ser menor que GetColumnCount().
UpdateColumnsOrder()

virtual void wxHeaderCtrl::UpdateColumnsOrder(const wxArrayInt & order)

Método llamado cuando se cambia el orden de las columnas en el diálogo de personalización.

Este método sólo se llama desde ShowCustomizeDialog() cuando el usuario cambia el orden de las columnas. En particular no es llamado si una sola columna cambia de lugar porque el usuario la arrastró a la nueva ubicación, el manejador de eventos EVT_HEADER_END_REORDER debe ser usado para reaccionar a esto.

Una implementación típica en una clase derivada actualizará el orden de visualización de las columnas en el control asociado, si existe. Obsérvese que no hay necesidad de llamar a SetColumnsOrder() desde ella ya que wxHeaderCtrl lo hace por sí mismo.

La versión de la clase base no hace nada y debe ser sobreescrita si se llama a este método.

Parámetros
order
El nuevo orden de las columnas. Este array utiliza la misma convención que SetColumnsOrder().
UpdateColumnVisibility()

virtual void wxHeaderCtrl::UpdateColumnVisibility( unsigned int idx, bool show )

Método llamado cuando la visibilidad de la columna es cambiada por el usuario.

Este método se llama desde ShowColumnsMenu() o ShowCustomizeDialog() cuando el usuario oculta o muestra interactivamente una columna. Una implementación típica simplemente actualizará el estado de la columna almacenado internamente. Obsérvese que no hay necesidad de llamar a UpdateColumn() desde este método ya que lo hace el propio wxHeaderCtrl.

La versión de la clase base no hace nada y debe ser sobrescrita si se llama a este método.

Parámetros
idx
El índice de la columna cuya visibilidad se ha cambiado.
show
El nuevo valor de visibilidad, true si la columna se muestra o false si no se oculta.
UpdateColumnWidthToFit()

virtual bool wxHeaderCtrl::UpdateColumnWidthToFit( unsigned int idx, int widthTitle )

Método que puede ser implementado por las clases derivadas para permitir que al hacer doble clic en el separador de columna se redimensione la columna para ajustar su contenido.

Cuando se hace doble clic sobre un separador, el manejador por defecto del evento EVT_HEADER_SEPARATOR_DCLICK llama a esta función y refresca la columna si devuelve true, por lo que para implementar el redimensionamiento de la columna para ajustarla a su anchura al hacer doble clic sobre el encabezado es necesario implementar este método utilizando una lógica similar a la de este ejemplo:

class MyHeaderColumn : public wxHeaderColumn
{
public:
    ...
 
    void SetWidth(int width) { m_width = width; }
    virtual int GetWidth() const { return m_width; }
 
private:
    int m_width;
};
 
class MyHeaderCtrl : public wxHeaderCtrl
{
public:
protected:
    virtual wxHeaderColumn& GetColumn(unsigned int idx) const
    {
        return m_cols[idx];
    }
 
    virtual bool UpdateColumnWidthToFit(unsigned int idx, int widthTitle)
    {
        int widthContents = ... compute minimal width for column idx ...
        m_cols[idx].SetWidth(wxMax(widthContents, widthTitle));
        return true;
    }
 
    wxVector<MyHeaderColumn> m_cols;
};

La versión de la clase base simplemente devuelve false.

Parámetros
idx
El índice basado en cero de la columna a actualizar.
widthTitle
Contiene el ancho mínimo necesario para mostrar la propia cabecera de la columna y normalmente se utilizará como punto de partida para el cálculo del ancho de ajuste.
Valor de retorno

true para indicar que la columna fue redimensionada, es decir, GetColumn() devuelve ahora el nuevo valor de anchura, por lo que debe ser refrescada o false que significa que el control no llegó al doble clic separador.

Métodos y datos heredados

Esta clase hereda los métodos y datos miembro públicos y protegidos de wxControl, wxWindow, wxEvtHandler y wxObject.