Самый простой способ сделать кнопку только с изображением - PullRequest
3 голосов
/ 10 марта 2011

Я использую Delphi XE, и я хотел бы сделать кнопку, которая показывает только предоставленное изображение PNG с прозрачным фоном и без каких-либо дополнительных полей.

Я пытался сделать это с TButton, но яполучить уродливый серый фон в стиле bsPushButton.Если я использую стиль bsCommandLink, то будет 10-пиксельное верхнее поле, хотя все мои настройки ImageMargins установлены на 0.

Какой самый простой способ сделать это?

РЕДАКТИРОВАТЬ: Это не должно выглядеть как кнопка.Мне просто нужно, чтобы он выглядел точно так же, как изображение, которому он назначен.Предпочтительно, он должен быть в состоянии остановки табуляции и иметь различные состояния (включено, отключено, зависание, ...), чтобы я мог назначить соответствующее изображение для каждого состояния.

Ответы [ 3 ]

6 голосов
/ 10 марта 2011

Вам нужен прозрачный элемент управления, который наследует от TWinControl, поскольку вы хотите, чтобы он мог получать фокус, это никогда не было легкой задачей. Однако, начиная с последних версий, Embarcadero предоставляет элемент управления, обеспечивающий это. TCustomTransparentControl является потомком TWinControl, который немного облегчает вам задачу.

Итак, я хотел бы создать новый компонент и унаследовать его от TCustomTransparentControl, а затем переписать метод Paint следующим образом:

procedure TMyTransparentButton.Paint;
var
  rc: TRect;
begin
  if not (csDestroying in ComponentState) then
  begin
    // Specify size and location of the image.
    rc := Rect(0, 0, pngImage.Width, pngImage.Height);

    // Draw the image on the canvas.
    pngImage.Draw(Canvas, rc);
  end;
end;

При таком подходе вы сможете получить прозрачность и прозрачность, которые вы ищете. Однако вам все равно нужно разобраться с ситуацией, когда кнопка отключена, нажата и т. Д.

5 голосов
/ 10 марта 2011

Вы можете использовать TImage и назначить событие OnClick для имитации кнопки.Это зависит от того, нужен ли вам фокус или нет.

1 голос
/ 15 июня 2011

Вы можете использовать TPanel и назначить событие OnClick для имитации кнопки.Установите границы панели на «плоский», чтобы она выглядела так, как будто панели нет.

Это похоже на решение, предложенное Stukelly, но проще реализовать включенные функции и функции наведения.Например, при наведении мыши панель может выглядеть 3D.

...