Ограничение размера компонентов во время разработки - PullRequest
1 голос
/ 29 октября 2009

Я пытаюсь наследовать от TButton, чтобы обеспечить некоторые возможности, учитывающие размер, когда кнопки могут изменять размер самих себя и / или размер шрифта (в рамках определенных ограничений), чтобы учесть изменения в тексте

, например

| маленький |

или

| это действительно долго |
| предложение на кнопку |

может с радостью быть одной и той же кнопкой в ​​той же форме, все, что я сделал, это сбросил текст, и кнопка сама справилась с изменением размера.

Я реализовал все функции измерения текста, и эта функция работает до точки .

я создал новые свойства maxHeight, minHeight, defaultHeight и т. Д. Для ширины и шрифта.

Когда пользователь изменяет высоту по умолчанию, мой компонент времени проектирования будет меняться и отображать эту новую высоту по умолчанию.

Однако, когда пользователь использует обычные свойства высоты и ширины (или перетаскивает угол), я не знаю, как связать их с высотой и шириной по умолчанию.

Я перехватил OnCanResize и создал обработчик событий и попытался подтвердить, что новый размер находится в пределах минимального максимального значения. Если это не так, установите минимальное или максимальное значение, как требуется, но если в пределах границ, то обновите. Я могу перехватывать события изменения времени выполнения, но не время разработки.

Если есть возможность перехватить изменения времени проектирования, кто-нибудь знает как?

извините, если это немного скучно, надеюсь, это имеет смысл!

Ответы [ 2 ]

1 голос
/ 30 октября 2009

Переопределить виртуальный метод SetBounds (). Оттуда вы можете отрегулировать запрошенные пользователем размеры по мере необходимости, а затем передать их методу-предку SetBounds (). Например:

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);
}
0 голосов
/ 29 октября 2009

Имейте в виду, что кнопка все еще является окном и может (будет) отвечать на WM_GETMINAXINFO. Я полагаю, что большинство инструментов проектирования уважают ptMinTrackSize и ptMaxTrackSize (названия по крайней мере похожи на это).

...