Поиск:

Ответ в темуСоздание новой темы Создание опроса
> "Подсветка кнопки", Как реализовать? 
:(
    Опции темы
Array
Дата 26.9.2005, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 2.8.2004

Репутация: нет
Всего: нет



Каким образом можно реализовать "подсветку"(highlighted) кнопки
( BitBtn, SpeedButton ) во время прохождения над ней курсора мыши?
Как бы для выделения.
PM MAIL   Вверх
Guest
Дата 26.9.2005, 13:36 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Можно сделать имитацию кнопки в виде двух картинок, которые сменяют друг друга.
А чем не устраивает SpeedButton->Flat=true; ?
  Вверх
mr.Anderson
Дата 26.9.2005, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



Если имеется в виду появление окантовки вокруг кнопки, то в качестве варианта могу предложить поместить сзади кнопки объект Image (контейнер для картинок), сделав границы контейнера немного больше границ кнопки, а при наведении мыши на кнопку запихивать в этот объект какой-нибудь фон.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Artemon
Дата 27.9.2005, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 7
Всего: 20



Есть еще один вариант: Когда мышь проходит над кнопкой то можно стандартными функциями WinApi рисовать на ней что угодно.


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Array
Дата 27.9.2005, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 2.8.2004

Репутация: нет
Всего: нет



Artemon Вариант с WinApi интересен, но требуется при прохождении мыши просто "подсветить" фон , а не рисовать картинки. Как это сделать?

Guest Я пробовал присваивать свойству Glyph кнопки BitBtn другую картинку при прохождении над ней мыши. Но возникает проблема с четким "переключением". Может кто посоветует как это можно решить?

PM MAIL   Вверх
Artemon
Дата 1.10.2005, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 7
Всего: 20



Просто у меня возникала такая же проблема, и я решил ее следующим способом:

По периметру кнопки выводил прямоугольник нужного мне цвета.

А что на счет :
Что ты имеешь в виду под четким переключением?


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Array
Дата 1.10.2005, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 2.8.2004

Репутация: нет
Всего: нет



Artemon Под "четким переключением" я имею в виду вот что.
Когда я пишу обработчик OnMouseMove надо задать условия смены картинки. Я применял проверку на выход координат X Y за пределы
кнопки( X<0 || X>BitBtn1-->Width), ( Y<0 || Y>BitBtn1-->Height ). Так вот такая конструкция не обеспечивает однозначности, т.е. иногда картинка меняется, а иногда нет. Как эти условия можно задать по другому, чтобы такое устранить?
А может есть другие решения?

PM MAIL   Вверх
AntonChik
Дата 4.10.2005, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 4.10.2005
Где: Красноярск

Репутация: 1
Всего: 1



во! ты подошел к главному...вобщем, я так понял, тебе теперь не хватает события OnMouseLeave (типа как у Label) ? так в чем проблема ? ... короче, как раз недавно видел я где-то что-то подобное... там чувачок элементарно предлагал создать клон класса (например TImage) и "нашпиговать" его всеми необходимыми тебе свойствами... сам я не пробовал,но выглядит все это весьма правдоподобно... удачи.
--------------------
"Человек притаился за деревом. За широким огромным деревом. Он выглядывал тихонько и прятался. Но его никто не преследовал." (с) Хорги 
PM MAIL   Вверх
AntonChik
Дата 4.10.2005, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 4.10.2005
Где: Красноярск

Репутация: 1
Всего: 1



не.я тут только что наткнулся на более простое решение - на ImageMouseMove делай картинку с подсветкой а на FormMouseMove без подсветки... прикольно будет...
--------------------
"Человек притаился за деревом. За широким огромным деревом. Он выглядывал тихонько и прятался. Но его никто не преследовал." (с) Хорги 
PM MAIL   Вверх
Гость_Simbiozis
Дата 4.10.2005, 10:47 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Был я недавно на каком-то сайте, и вот что! smile Была там библиотека компонентов и в ней был компонент Image с обработкой события MouseLeave! Если его найдеш, то можно практически заанимировать кнопку! Позже (если найду у себя) то перешлю тебе на мыло всю библиотеку! Юзай! smile
  Вверх
Dubinsky
Дата 4.10.2005, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 1.6.2005

Репутация: нет
Всего: нет



здесь на форуме есть такая кнопка , верно , сам скачал и пользую, в кнопке обязательно должен быть OnMouseLeave иначе не будет корректно работать (если на форму в обработчике OnMouseMove чистить кнопку , то если юзер мышку с кнопки двинет сразу не на форму , сами понимаете ...такое бывает очень часто , приращение мышки за кадр обработки может быть большим и курсор запросто вылетает с кнопки и формы ! плюс если компонентов много то на каждый придётся писать обработчик OnMouseMove чтобы чистить кнопку ...)
PM MAIL WWW   Вверх
Array
Дата 5.10.2005, 01:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 2.8.2004

Репутация: нет
Всего: нет



Dubinsky А ссылку на эту кнопку не подкинешь?

PM MAIL   Вверх
Artemon
Дата 5.10.2005, 06:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 7
Всего: 20



Array, зачем тебе этот компонент нужене, что будет с тобой если например он в какой-нибудь момент заглючит, а программа уже будет у заказчика или еще где-то.
лучше используй первый вариант, который предложил AntonChik.
Добавлено @ 06:14
Sorry, этот вариант предложил не AntonChik а кто-то другой (в общем я это от кого-то слышал).

в OnMouseMove формы изменяй цвет нопки на начальный, а в OnMouseMove кнопки меняй цвет на тот, который тебе нужен.


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Dubinsky
Дата 5.10.2005, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 1.6.2005

Репутация: нет
Всего: нет



это будет иногда некорректно работать ! сейчас порою форум была супер кнопка где то ...
Добавлено @ 13:33
ааа нашёл , дурак я ж её использую , а полез в форум ...
код на паскале , на Билдере пашет за милую душу без перевода ...

Код


unit SpriteBtn;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
  TSpriteButton = class(TGraphicControl)
  private
    { Private declarations }
    FPicturePressed: TPicture;
    FPictureFocused: TPicture;
    FPictureNormal: TPicture;
    FPictureDisabled: TPicture;
    FEnabled: Boolean;
    FPressed: Boolean;
    FFocused: Boolean;
    FDrawing: Boolean;
    FTransparent: Boolean;
    procedure SetPictureFocused(const Value: TPicture);
    procedure SetPicturePressed(const Value: TPicture);
    procedure SetPictureNormal(const Value: TPicture);
    procedure SetPictureDisabled(const Value: TPicture);
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
    procedure OnPictureChange(Sender: TObject);
    procedure UpdateButtonState;
    procedure SetTransparent(const Value: Boolean);

  protected
    { Protected declarations }
    procedure Paint; override;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;

  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

  published
    { Published declarations }
  property Action;
    property Anchors;
    property Caption;
    property Enabled;
    property Font;
    property ShowHint;
    property ParentShowHint;
    property OnClick;
    property OnMouseDown;
    property PictureNormal: TPicture read FPictureNormal write SetPictureNormal;
    property PictureFocused: TPicture read FPictureFocused write SetPictureFocused;
    property PicturePressed: TPicture read FPicturePressed write SetPicturePressed;
    property PictureDisabled: TPicture read FPictureDisabled write SetPictureDisabled;
    property Transparent: Boolean read FTransparent write SetTransparent;
  end;


procedure Register;

implementation
uses Consts;

procedure Register;
begin
  RegisterComponents('Custom Components', [TSpriteButton]);
end;

{ TSpriteButton }

constructor TSpriteButton.Create(AOwner: TComponent);
begin
  inherited;

  FEnabled := True;

  FPictureNormal := TPicture.Create;
  FPictureNormal.OnChange := OnPictureChange;
  FPictureFocused := TPicture.Create;
  FPicturePressed := TPicture.Create;
  FPictureDisabled := TPicture.Create;

  FPressed := False;
  FFocused := False;

  FDrawing := False;
end;

destructor TSpriteButton.Destroy;
begin
  FPictureNormal.Free;
  FPictureFocused.Free;
  FPicturePressed.Free;
  FPictureDisabled.Free;

  inherited;
end;

procedure TSpriteButton.SetPictureNormal(const Value: TPicture);
begin
  PictureNormal.Assign(Value);
  if Assigned(Value) then
  begin
    Width := Value.Width;
    Height := Value.Height;
  end;
  if not FDrawing then Invalidate;
end;

procedure TSpriteButton.SetPictureFocused(const Value: TPicture);
begin
  FPictureFocused.Assign(Value);
end;

procedure TSpriteButton.SetPicturePressed(const Value: TPicture);
begin
  FPicturePressed.Assign(Value);
end;

procedure TSpriteButton.SetPictureDisabled(const Value: TPicture);
begin
  FPictureDisabled.Assign(Value);
end;

procedure TSpriteButton.CMMouseEnter(var Message: TMessage);
begin
  if Enabled = False then Exit;

  FFocused := True;
  if not FDrawing then Invalidate;
end;

procedure TSpriteButton.CMMouseLeave(var Message: TMessage);
begin
  if Enabled = False then Exit;

  FFocused := False;
  if not FDrawing then Invalidate;
end;

procedure TSpriteButton.MouseDown(Button: TMouseButton; Shift: TShiftState;
  X, Y: Integer);
begin
  inherited;

  if Enabled = False then Exit;

  if Button = mbLeft then
  begin
    FPressed := True;
    FFocused := True;
    if not FDrawing then Invalidate;
  end;
end;

procedure TSpriteButton.MouseUp(Button: TMouseButton; Shift: TShiftState;
  X, Y: Integer);
begin
  if Enabled = False then Exit;

  if Button = mbLeft then
  begin
    FPressed := False;
    if not FDrawing then Invalidate;
  end;

  inherited;  
end;

procedure TSpriteButton.OnPictureChange(Sender: TObject);
begin
  Width := PictureNormal.Width;
  Height := PictureNormal.Height;
  if not FDrawing then Invalidate;
end;

procedure TSpriteButton.UpdateButtonState;
var
  Picture: TPicture;
begin
  if Enabled then
  begin
    if not (csDesigning in ComponentState) then
    begin
      if (FPressed and FFocused) then
        Picture := PicturePressed
      else
        if (not FPressed and FFocused) then
          Picture := PictureFocused
        else
          Picture := PictureNormal;
    end else Picture := PictureNormal;
  end else begin
    FFocused := False;
    FPressed := False;
    Picture := PictureDisabled;
  end;

  if (Picture <> PictureNormal) and ((Picture.Width = 0) or (Picture.Height = 0)) then
    Picture := PictureNormal; 

  if (csDesigning in ComponentState) and
     ((not Assigned(Picture.Graphic)) or (Picture.Width = 0) or (Picture.Height = 0)) then
  begin
    with Canvas do
    begin
      Pen.Style := psDash;
      Pen.Color := clBlack;
      Brush.Color := Color;
      Brush.Style := bsSolid;
      Rectangle(0, 0, Width, Height);
    end;
    
    Exit;
  end;

  if Assigned(Picture.Graphic) then
  begin
    if not ((Picture.Graphic is TMetaFile) or (Picture.Graphic is TIcon)) then
      Picture.Graphic.Transparent := FTransparent;

    Canvas.Draw(0, 0, Picture.Graphic);
  end;
end;

procedure TSpriteButton.Paint;
var
  R: TRect;
begin
  if FDrawing then Exit;

  FDrawing := True;
  try
    UpdateButtonState;

    if Caption <> '' then
    begin
      R := ClientRect;
      Canvas.Font.Assign(Font);
      Canvas.Brush.Style := bsClear;

      R := ClientRect;
      R.Top := 0;
      R.Bottom := 0;
      Inc(R.Left, 14);
      Dec(R.Right, 14);
      DrawText(Canvas.Handle, PChar(Caption), -1, R, DT_WORDBREAK or DT_CALCRECT);

      R.Right := ClientWidth - 14;
      R.Top := (ClientHeight - (R.Bottom - R.Top)) div 2;
      R.Bottom := ClientHeight;

      DrawText(Canvas.Handle, PChar(Caption), -1, R, DT_WORDBREAK or DT_CENTER);
    end;
  finally
    FDrawing := False;
  end;
end;

procedure TSpriteButton.SetTransparent(const Value: Boolean);
begin
  if Value <> FTransparent then
  begin
    FTransparent := Value;
    if not FDrawing then Invalidate;
  end;
end;


end.

PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0644 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.