Pregunta

Estoy tratando de heredar de TButton para proporcionar algunas capacidades de tamaño, donde los botones pueden cambiar su tamaño y / o su tamaño de fuente (dentro de ciertas restricciones) para permitir cambios en el texto

por ejemplo

| pequeño |

or

| & nbsp; & nbsp; esta es una muy larga & nbsp; & nbsp; |
El | oración en un botón |

felizmente podría ser el mismo botón en el mismo formulario, todo lo que he hecho es restablecer el texto y el botón hace frente al cambio de tamaño en sí mismo.

He implementado todas las funciones de medición de texto, y la funcionalidad funciona hasta cierto punto .

lo que he hecho es crear nuevas propiedades maxHeight, minHeight, defaultHeight, etc. para Width y Font.

Cuando el usuario cambia la altura predeterminada, mi componente de tiempo de diseño cambiará y reflejará esta nueva altura predeterminada.

Cuando el usuario usa la altura normal & amp; Sin embargo, las propiedades de ancho (o arrastra la esquina) no sé cómo vincularlas con la altura y el ancho predeterminados.

Intercepté OnCanResize y creé un controlador de eventos e intenté confirmar que el nuevo tamaño está dentro del mínimo máximo. Si no es así, establezca el valor mínimo o máximo según sea necesario, pero si está dentro de los límites, actualice. Puedo interceptar eventos de cambio de tamaño en tiempo de ejecución, pero no el tiempo de diseño.

Si es posible interceptar el tamaño del tiempo de diseño, ¿alguien sabe cómo?

lo siento si eso es un poco largo, ¡espero que tenga sentido!

¿Fue útil?

Solución

Reemplazar el método virtual SetBounds (). A partir de ahí, puede ajustar las dimensiones solicitadas por el usuario según sea necesario antes de pasarlas al método SetBounds () ancestro. Por ejemplo:

class TMyButton : public TButton
{
    typedef TButton inherited;

public:
    ...
    virtual void __fastcall SetBounds(int ALeft, int ATop, int AWidth, int AHeight);

__published:
    __property int MaxHeight = ...;
    __property int MinHeight = ...;
    ...
};

virtual void __fastcall SetBounds(int ALeft, int ATop, int AWidth, int AHeight)
{
    if (AHeight > MaxHeight) AHeight = MaxHeight;
    if (AHeight < MinHeight) AHeight = MinHeight;
    ...
    inherited::SetBounds(ALeft, ATop, AWidth, AHeight);
}

Otros consejos

Tenga en cuenta que un botón sigue siendo una ventana y puede (responderá) a WM_GETMINAXINFO . Creo que la mayoría de las herramientas de diseño respetan ptMinTrackSize y ptMaxTrackSize (los nombres son al menos similares a eso).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top