Limitare le dimensioni dei componenti in fase di progettazione
-
08-07-2019 - |
Domanda
Sto cercando di ereditare da TButton al fine di fornire alcune funzionalità consapevoli delle dimensioni, in cui i pulsanti sono in grado di ridimensionare se stessi e / o la dimensione del carattere (entro determinati vincoli) per consentire modifiche nel testo
per es.
| piccolo |
o
| & nbsp; & nbsp; questo è un periodo davvero lungo & nbsp; & nbsp; |
| frase su un pulsante |
potrebbe essere felicemente lo stesso pulsante nello stesso modulo, tutto ciò che ho fatto è resettare il testo e il pulsante si occupa della modifica della dimensione stessa.
Ho implementato tutte le funzioni di misurazione del testo e la funzionalità funziona fino a un punto .
quello che ho fatto è creare nuove proprietà maxHeight, minHeight, defaultHeight e così via per Larghezza e Carattere.
Quando l'utente modifica l'altezza predefinita, il mio componente del tempo di progettazione cambierà e rifletterà questa nuova altezza predefinita.
Quando l'utente utilizza la normale altezza e amp; Proprietà larghezza tuttavia (o trascina l'angolo) Non so come legarli all'altezza e alla larghezza predefinite.
Ho intercettato OnCanResize e creato un gestore eventi e ho provato a confermare che la nuova dimensione rientra nel limite massimo di min. In caso contrario, impostare su min o max come richiesto, ma se entro i limiti, aggiornare. Sono in grado di intercettare gli eventi di ridimensionamento del runtime, ma non i tempi di progettazione.
Se è possibile intercettare i ridimensionamenti dei tempi di progettazione, qualcuno sa come?
scusa se è un po 'prolisso, spero abbia senso!
Soluzione
Sostituisci il metodo SetBounds () virtuale. Da lì, è possibile regolare le dimensioni richieste dall'utente secondo necessità prima di passarle al metodo SetBounds () dell'antenato. Ad esempio:
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);
}
Altri suggerimenti
Tieni presente che un pulsante è ancora una finestra e può (risponderà) a WM_GETMINAXINFO
. Credo che la maggior parte degli strumenti di progettazione rispetti ptMinTrackSize
e ptMaxTrackSize
(i nomi sono almeno simili a quelli).