6 Controles spin

Para introducir valores numéricos a menudo es interesante usar controles spin que se componen de dos botones adosados a un control de edición. Uno de ellos para incrementar el valor y el otro para decrementarlo.
Aunque existe una clase independiente wxSpinButton para manejar esos dos botones, que podemos unir a un control de edición, la documentación no aconseja usarla, ya que esos controles no son nativos en todos los sistemas operativos, y esa clase no está implementada en todas las plataformas.
En su lugar usaremos las clases wxSpinCtrl y wxSpinCtrlDouble, para introducir valores enteros o en coma flotante de doble precisión, respectivamente.
En las plataformas en la que no existen los controles spin, estos dos controles se convertirán a wxTextCtrl.
Hay que tener en cuenta que estas clases no permiten usar validadores, por lo que tendremos que recuperar los valores explícitamente.
Leer números enteros
A la hora de crear un control de la clase wxSpinCtrl, además de los parámetros habituales del constructor: ventana padre, identificador, posición, tamaño y estilos, necesitaremos especificar también el rango de valores mínimo y máximo, min y max.
Además, se puede establecer el valor inicial en el constructor de dos modos: mediante una cadena en el tercer parámetro value o mediante un valor entero en el noveno parámetro, initial.
El tercer parámetro tiene prioridad, siempre que contenga una cadena que se pueda convertir en un número. Solo en el caso de que este parámetro contenga una cadena vacía o una cadena que no se pueda convertir en un número, se usará el valor del noveno parámetro.
wxSpinCtrl* m_spinCtrl; int entero = 10; m_spinCtrl = new wxSpinCtrl(this, idSpinCtrl, wxEmptyString, wxDefaultPosition, wxSize(200, wxDefaultCoord), 0, 0, 100, entero);
Esta clase de controles tiene otras opciones interesantes.
Incrementos
Se puede ajustar el valor que se sumará o restará del control mediante los botones usando el método GetIncrement, y recuperarlo mediante GetIncrement. El valor por defecto es 1.
Este valor se usará para pulsaciones individuales, pero si se mantiene pulsado uno de los botones, el valor del incremento crecerá cada cierto tiempo con el fin de acelerar el proceso, aunque volverá al valor preestablecido al soltar el botón.
m_spinCtrl->SetIncrement(2);
Base de numeración
También se puede elegir la base de numeración de los valores del control, aunque sólo están soportadas las bases 10 y 16, para decimal o hexadecimal, usando el método SetBase. Para recuperar el valor actual de la base de numeración usada en el control disponemos del método GetBase.
m_spinCtrlHexadecimal->SetBase(16);
Establecer rangos
Aunque podemos establecer el rango de valores válidos del control en el constructor, también se puede establecer dinámicamente después de creado usando el método SetRange.
Para recuperar el rango actual de un control disponemos de la pareja de métodos GetMin y GetMax, para obtener el valor mínimo y máximo del rango, respectivamente.
m_spinCtrl->SetRange(6, 90);
Establecer y recuperar valores
De nuevo, además del constructor, tenemos dos formas de establecer el valor del control. Usando una cadena o un valor entero. El método SetValue está sobrecargado para usar tanto un valor entero como una cadena wxString.
m_spinCtrl->SetValue(45); m_spinCtrl->SetValue("45");
De igual modo, podemos recuperar el contenido del control en un valor entero, usando el método GetValue o en forma de cadena, mediante GetTextValue.
int v = m_spinCtrl->GetValue();
Leer números en coma flotante
La clase wxSpinCtrlDouble está diseñada para obtener valores en coma flotante de doble precisión. El constructor pide los mismos nueve primeros parámetros que wxSpinCtrl: ventana padre, identificador, valor en forma de cadena, posición, tamaño, estilos, el rango de valores mínimo y máximo, min y max y valor inicial en forma de double. Además de un décimo parámetro inc que indica el valor de cada incremento o decremento del valor del control.
También se puede establecer el valor inicial en el constructor de dos formas: mediante una cadena en el tercer parámetro value o mediante un valor en coma flotante en el noveno parámetro, initial.
El tercer parámetro tiene prioridad, siempre que contenga una cadena que se pueda convertir en un número. Solo en el caso de que este parámetro contenga una cadena vacía o una cadena que no se pueda convertir en un número, se usará el valor del noveno parámetro.
El valor del parámetro inc establece la precisión de la cadena que representa el número. Es decir, si establecemos un valor con n decimales para inc, la cadena que representa el número en el control tendrá n decimales.
wxSpinCtrl* m_spinCtrl; double doble = 10; m_spinCtrlDouble = new wxSpinCtrlDouble(this, idSpinCtrlDouble, wxEmptyString, wxDefaultPosition, wxSize(200, wxDefaultCoord), 0, 0.0, 5.0, doble, 0.001);
Otras opciones de este control.
Incrementos
Además de en el constructor, es posible modificar el valor del incremento mediante el método SetIncrement. Este método modifica también la precisión del número mostrado, es decir, el número de decimales que se muestran, siempre que el nuevo valor del incremento requiera más decimales. Si no, mantiene los decimales mostrados anteriormente.
m_spinCtrlDouble->SetIncrement(0.01);
Para obtener el valor del incremento se puede usar el método GetIncrement
Precisión
La precisión establece el número de decimales que se mostrarán en el control. Se puede establecer indirectamente mediante el valor del incremento, pero también se puede modificar mediante el método SetDigits indicando como parámetro en número dígitos después del punto decimal. Para recuperar el valor de la precisión se usa GetDigits.
m_spinCtrlDouble->SetDigits(4);
Establecer rangos
Los rangos de estos controles funcionan igual que los de wxTextCtrl. Podemos establecer el rango de valores válidos del control dinámicamente después de creado usando el método SetRange.
Del mismo modo, para recuperar el rango actual de un control disponemos de la pareja de métodos GetMin y GetMax, para obtener el valor mínimo y máximo del rango, respectivamente.
m_spinCtrlDouble->SetRange(0.015, 0.095);
Establecer y recuperar valores
En este caso también podemos establecer valores usando una cadena o un valor en coma flotante de doble precisión. El método SetValue está sobrecargado para usar tanto un valor numérico como una cadena wxString.
m_spinCtrlDouble->SetValue(1.0003); m_spinCtrlDouble->SetValue("2.023");
Para recuperar el contenido del control en un valor double, usaremos el método GetValue o en forma de cadena, mediante GetTextValue.
double v = m_spinCtrlDouble->GetValue();
Ejemplo 6
Nombre | Fichero | Fecha | Tamaño | Contador | Descarga |
---|---|---|---|---|---|
Ejemplo 6 | wx006.zip | 2024-12-02 | 5012 bytes | 7 |