Когда Вы нажимаете на кнопку, то видите трёхмерный эффект нажатия. А как же насчёт четвёртого измерения, например звука ? Ну тогда нам понадобится звук для нажатия и звук для отпускания кнопки. Если есть желание, то можно добавить даже речевую подсказку, однако не будем сильно углубляться.

 

Компонент звуковой кнопки имеет два новых свойства:

Мастера у меня назрел еще такой вопрос! Можно ли из 3-х Image(картинок) сделать компонент-кнопку, т.е у меня есть три картинки: кнопка обычная, нажатая и активная (на ней курсор мышки)? Я конечно могу каждый раз на форму кидать по три Image, вставляя в каждый Image картинку, но это только на одну кнопку 3 image'a, а если я хочу 10 кнопок, то это будет уже 30 image'ей!!! Я представляю, что у кнопки должны быть такие свойства как у Image'a, и в свойствах этого компонета дожны быть ссылки на 3 картинки, отвечающие нужному состоянию. Сразу скажу, что BitBtn не подойдет, так как форма кнопки прямоугольником и не повторяет форму рисунка в картинки. Компонент Image он тоже прямоугольный, но если всавить в него картинку и назначить свойство Transparent, Image станет при этом позрачный и повторит форму рисунка в картинке, т.е. рисунка кнопки.

 

Автор: Maarten de Haan

 Пример показывает, как сделать кнопку с тремя состояниями. В обычном состоянии она сливается с формой. При наведении на такую кнопку курсором мышки, она становится выпуклой. Ну и, соотвественно, при нажатии, кнопка становится вогнутой.

 Также можно создать до 4-х изображений для индикации состояния кнопки

 

             <--------- Ширина --------->

 

             +------+------+-----+------+    ^

             |Курсор|Курсор|нажа-|недос-|    |

             |на кно|за пре| та  |тупна |  Высота

             | пке  |делами|     |      |    |

             +------+------+-----+------+    v

 

Code:

uses ShellApi;

 

procedure TForm1.FormShow(Sender: TObject);

var

Icon: TIcon;

begin

Icon := TIcon.Create;

Icon.Handle := ExtractIcon(0, 'C:\WINDOWS\NOTEPAD.EXE', 1);

SpeedButton1.Glyph.Width := Icon.Width;

SpeedButton1.Glyph.Height := Icon.Height;

SpeedButton1.Glyph.Canvas.Draw(0, 0, Icon);

Icon.Free;

end;

 

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

 

 

Раньше казалось, что невозможно было преодолеть нестабильность Windows-98. Но теперь мы видим, что Windows XP ее в этом преодолела.

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;