Я знаю как нажать кнопку через keypress, но хотя пользователь определил действие в обработчике события OnClick, сама кнопка не отражает видимых изменений, происходящих при ее нажатии мышью. Кто-нибудь может мне помочь?

 

Вы можете сделать кнопку "нажатой" или "ненажатой", посылая ей сообщение BM_SETSTATE. Определить ее текущее состояние можно, послав ей сообщение BM_GETSTATE.

 

Для нажатия кнопки:

Автор: Dennis Passmore

 

Могу ли я из ресурсов поочередно загружать глифы для кнопок speedbutton и, если да, то как это сделать?

 

Например, если в вашем проекте используется TDBGrid, то иконки кнопок компонента DBNavigator могут линковаться вашей программой, и их можно загрузить для использования в ваших speedbutton следующим образом:

 

 

 

Code:

unit RVButton;

 

interface

 

uses

  SysUtils, Classes, Controls, Messages, Graphics, Windows;

 

const

  iOffset = 3;

 

type

  TRVButton = class(TGraphicControl)

  private

    FCaption : string;

    FButtonColor: TColor;

    FLButtonDown: boolean;

    FBtnPoints : array[1..2] of TPoint;

    FKRgn : HRgn;

    procedure SetCaption(Value: string);

    procedure SetButtonColor(Value: TColor);

    procedure FreeRegion;

  protected

    procedure Paint; override;

    procedure DrawCircle;

    procedure MoveButton;

    procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;

    procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;

  public

    constructor Create(AOwner: TComponent); override;

    destructor Destroy; override;

  published

    property ButtonColor: TColor read FButtonColor write SetButtonColor;

    property Caption: string read FCaption write SetCaption;

    property Enabled;

    property Font;

    property ParentFont;

    property ParentShowHint;

    property ShowHint;

    property Visible;

    property OnClick;

  end;

 

procedure Register;

 

implementation

 

procedure Register;

begin

  RegisterComponents('Samples', [TRVButton]);

end;

 

{ TRVButton }

 

constructor TRVButton.Create(AOwner: TComponent);

begin

  inherited Create(AOwner);

  ControlStyle := [csClickEvents,csCaptureMouse];

  Width := 50;

  Height := 50;

  FButtonColor := clBtnFace;

  FKRgn := 0;

  FLButtonDown := False;

end;

 

destructor TRVButton.Destroy;

begin

  if FKRgn <> 0 then FreeRegion;

  inherited Destroy;

end;

 

procedure TRVButton.DrawCircle;

begin

  FBtnPoints[1] := Point(iOffset,iOffset);

  FBtnPoints[2] := Point(Width - iOffset,Height - iOffset);

  FKRgn := CreateEllipticRgn(FBtnPoints[1].x,FBtnPoints[1].y,FBtnPoints[2].x,FBtnPoints[2].y);

  Canvas.Brush.Color := FButtonColor;

  FillRgn(Canvas.Handle,FKRgn,Canvas.Brush.Handle);

  MoveButton;

end;

 

procedure TRVButton.FreeRegion;

begin

  if FKRgn <> 0 then DeleteObject(FKRgn);

  FKRgn := 0;

end;

 

procedure TRVButton.MoveButton;

var

  Color1: TColor;

  Color2: TColor;

begin

  with Canvas do

    begin

    if not FLButtonDown then

      begin

      Color1 := clBtnHighlight;

      Color2 := clBtnShadow;

      end

    else

      begin

      Color1 := clBtnShadow;

      Color2 := clBtnHighLight;

      end;

 

      Pen.Width := 1;

 

      if FLButtonDown then Pen.Color := clBlack

      else                 Pen.Color := Color2;

 

      Ellipse(FBtnPoints[1].x - 2,FBtnPoints[1].y - 2,FBtnPoints[2].x + 2,FBtnPoints[2].y + 2);

 

      if not FLButtonDown then Pen.Width := 2

      else                     Pen.Width := 1;

 

      Pen.Color := Color1;

 

      Arc(FBtnPoints[1].x,FBtnPoints[1].y,FBtnPoints[2].x,FBtnPoints[2].y,

          FBtnPoints[2].x,FBtnPoints[1].y,FBtnPoints[1].x,FBtnPoints[2].y);

 

      Pen.Color := Color2;

 

      Arc(FBtnPoints[1].x,FBtnPoints[1].y,FBtnPoints[2].x,FBtnPoints[2].y,

          FBtnPoints[1].x,FBtnPoints[2].y,FBtnPoints[2].x,FBtnPoints[1].y);

      end;

 

  SetCaption('');

end;

 

procedure TRVButton.Paint;

begin

  inherited Paint;

  FreeRegion;

  DrawCircle;

end;

 

procedure TRVButton.SetButtonColor(Value: TColor);

begin

  if Value <> FButtonColor then

    begin

    FButtonColor := Value;

    Invalidate;

    end;

end;

 

procedure TRVButton.SetCaption(Value: string);

var

  X: Integer;

  Y: Integer;

begin

  if ((Value <> FCaption) and (Value <> '')) then

  begin

    FCaption := Value;

  end;

 

  with Canvas.Font do

  begin

    Name := Font.Name;

    Size  := Font.Size;

    Style := Font.Style;

    if Self.Enabled then Color := Font.Color

    else

      Color := clDkGray;

  end;

 

  X := (Width div 2) - (Canvas.TextWidth(FCaption) div 2);

  Y := (Height div 2) - (Canvas.TextHeight(FCaption) div 2);

  Canvas.TextOut(X, Y, FCaption);

  //  Invalidate;

end;

 

 

procedure TRVButton.WMLButtonDown(var Message: TWMLButtonDown);

begin

  if not PtInRegion(FKRgn,Message.xPos,Message.yPos) then exit;

  FLButtonDown := True;

  MoveButton;

  inherited;

end;

 

procedure TRVButton.WMLButtonUp(var Message: TWMLButtonUp);

begin

  if not FLButtonDown then exit;

  FLButtonDown := False;

  MoveButton;

  inherited;

end;

 

 

end.

Как выдать текст под наклоном?

 

Чтобы вывести под любым углом текст необходимо использовать TrueType Fonts (например «Arial»). Например:

 

Иконка компонента является инкапсулированным объектом, требующим для хранения изображения некоторый участок памяти. Следовательно, при замене иконки, память, связанная с первоначальной иконкой, должна возвратиться в кучу, а для новой иконки требуется новое распределение памяти. По правилам Delphi, этим должен заниматься метод "Assign". Ниже приведен код всей процедуры замены иконки.

 

 

Code:

procedure TForm1.Button1Click(Sender: TObject);

var

i: Integer;

begin

i := GetWindowLong(Button1.Handle, GWL_STYLE);

SetWindowLong(Button1.Handle, GWL_STYLE, i or BS_MULTILINE);

Button1.Caption := 'Delphi World - ' + #13#10 + 'лучше не бывает!';

end;

 

 

Code:

procedure AddDisableBMP(SB : array of TObject);

var

   BM, SBM : TBitmap;

  w, x, y, NewColor, i : integer;

  PixelColor : TColor;

begin

  BM := TBitmap.Create;

  SBM := TBitmap.Create;

  try

    for i := 0 to High(SB) do

     begin

      if (SB[i] is TSpeedButton) then

        BM.Assign((SB[i] as TSpeedButton).Glyph)

      else if (SB[i] is TBitBtn) then

        BM.Assign((SB[i] as TBitBtn).Glyph)

      else

         Exit;

 

      if not Assigned(BM) or (BM.Width <> BM.Height) then Exit;

 

      w := BM.Width;

      SBM.Width := w * 2;

      SBM.Height := w;

      SBM.Canvas.Draw(0, 0, BM);

 

      for x := 0 to w - 1 do

        for y := 0 to w - 1 do

         begin

          PixelColor := ColorToRGB(BM.Canvas.Pixels[x, y]);

          NewColor := Round((((PixelColor shr 16) + ((PixelColor shr 8) and $00FF) +

            (PixelColor and $0000FF)) div 3)) div 2 + 96;

          BM.Canvas.Pixels[x, y] := RGB(NewColor, NewColor, NewColor);

        end;

 

 

      SBM.Canvas.Draw(w, 0, BM);

 

      if (SB[i] is TSpeedButton) then with (SB[i] as TSpeedButton) do

         begin

          Glyph.Assign(SBM);

          NumGlyphs := 2;

        end

      else

         with (SB[i] as TBitBtn) do

         begin

          Glyph.Assign(SBM);

          NumGlyphs := 2;

        end;

      BM := TBitmap.Create;

      SBM := TBitmap.Create;

    end;

  finally

    BM.Free;

    SBM.Free;

  end;

end;