Я создал новый компонент, который наследуется от TCornerButton, чтобы добавить опцию раскрывающегося меню.
Первый вопрос ...
Почему мне нужно переопределить метод «AfterPaint», а не метод «Paint», как описано в документации. Переопределение «Paint» не привело ни к какому рисунку.
Второй вопрос ...
Когда я использую метод AfterPaint, чтобы нарисовать маленькую стрелку, указывающую вниз, ее смещение вправо примерно на 5 пикселей, пока кнопка не получит фокус. Простое наведение на кнопку не решает проблему (как и следовало ожидать, перекрасить). Я связал это с и без "ScalePoint" в коде, и каждый раз, когда это неправильно.
Это также показывает в неправильном положении во время разработки. Как только кнопка получает фокус во время выполнения, стрелка перемещается в ожидаемую позицию. Когда он теряет фокус, он возвращается в неправильное положение.
FYI. «Ширина» не меняется - я проверял это.
procedure TLFButton.AfterPaint;
var
down_arrow: TPolygon;
x, y: Extended;
begin
inherited;
if FDropDownButton then
begin
Canvas.Fill := TText(FindStyleResource('text')).Fill;
x := Width - 12;
y := (Height / 2) - 3;
SetLength(down_arrow, 3);
down_arrow[0] := ScalePoint(PointF(x, y), Scale.X, Scale.Y);
down_arrow[1] := ScalePoint(PointF(x+8,y), Scale.X, Scale.Y);
down_arrow[2] := ScalePoint(PointF(x+4,y+6), Scale.X, Scale.Y);
Canvas.FillPolygon(down_arrow, 255);
end;
end;