Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


Эх Ваня...

в общем так
за основу взял "4 состояния"
1. Используется текстура размером 320х23, где размер одной кнопки 80х23
Теперь пофиг какая, тк картинка растягивается (только растягивать нужно в разумных пределах).
Главное чтоб были 4 кнопки одинакового размера с таким вот расположением картинок-состояний:
;обычное состояние - при наведении - при нажатии - заблокировано

2. тк картинка растягивается размеры кнопок больше не привязаны к константам
const
ButtonWidth = 80;
ButtonHeight = 23;
а это занчит, что кнопки могут быть отличными по размеру от ширины и высоты раздела тектстуры и друг от друга

3. сильно оптимизировал код:
убрал лишнее
переписал грамотнее
заменил процедуры наведения и "уведения" курсора мыши с кнопки (стали быстрее на глаз)

4. две текстуры для кнопок на месте как были

Результат:
читать дальше »
Код: Выделить весь код
;обычное состояние - при наведении - при нажатии - заблокировано
[Setup]
AppName=Test
AppVerName=Test
DefaultDirName={pf}\Test
OutputDir=.
BitmapResource=button1:buttonA.bmp|button2:buttonB.bmp
LicenseFile=compiler:License.txt


[   Code]
var
  WizardLabel: TLabel;
  ButtonPanel: array of TPanel;
  ButtonImage: array of TBitmapImage;
  ButtonLabel: array of TLabel;
  UsedButtons: array of TButton;
  ButtonsCount: Integer;

procedure ButtonLabelClick(Sender: TObject);
var
  Button: TButton;
  n, i: Integer;
begin
  i:= TLabel(Sender).Tag;
  ButtonImage[i].Left := 0;
  for n:=0 to (ButtonsCount-1) do if i = n then Button:= UsedButtons[n];
  Button.OnClick(Button);
end;

procedure ButtonLabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if ButtonLabel[TLabel(Sender).Tag].Enabled then ButtonImage[TLabel(Sender).Tag].Left:=-TLabel(Sender).Width*2
end;

procedure ButtonLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if ButtonLabel[TLabel(Sender).Tag].Enabled then ButtonImage[TLabel(Sender).Tag].Left:=0
end;

procedure ButtonLabelOnEnter(Sender: TObject);
var
  i: Integer;
begin
  i := TLabel(Sender).Tag;
  if (ButtonLabel[i].Enabled) then ButtonImage[i].Left:= -TLabel(Sender).Width;
end;

procedure ButtonLabelOnLeave(Sender: TObject);
var
  i: Integer;
begin
  i := TLabel(Sender).Tag;
  if (ButtonLabel[i].Enabled) then ButtonImage[i].Left := 0;
end;


procedure LoadButtonImage(AButton: TButton; Texture: Integer);
var
  n: Integer;
begin
  n := ButtonsCount;
  SetArrayLength(ButtonPanel, n+1);
  SetArrayLength(ButtonImage, n+1);
  SetArrayLength(ButtonLabel, n+1);
  SetArrayLength(UsedButtons, n+1);
  UsedButtons[n] := AButton;

  ButtonPanel[n]:=TPanel.Create(nil)
  with ButtonPanel[n] do
  begin
    SetBounds(AButton.Left, AButton.Top, AButton.Width, AButton.Height);
    Tag := n;
    Enabled := AButton.Enabled;
    Parent := AButton.Parent;
  end;

  ButtonImage[n]:=TBitmapImage.Create(nil)
  with ButtonImage[n] do
  begin
    SetBounds(ScaleX(0), ScaleY(0), AButton.Width*4, AButton.Height);
    Enabled:=False;
    Stretch := True;
    Parent:=ButtonPanel[n];
    if Texture = 1 then ButtonImage[n].Bitmap.LoadFromResourceName(HInstance, '_IS_BUTTON1');
    if Texture = 2 then ButtonImage[n].Bitmap.LoadFromResourceName(HInstance, '_IS_BUTTON2');
  end;

  ButtonLabel[n]:=TLabel.Create(nil)
  with ButtonLabel[n] do
  begin
    Autosize := True;
    Alignment := taCenter;
    Tag := n;
    Enabled := AButton.Enabled;
    Transparent := True;
    Font.Color := clBlack;
    Caption := AButton.Caption;
    Parent := ButtonPanel[n];
  end;

  with TLabel.Create(nil) do
  begin
    Tag := n;
    Parent := ButtonPanel[n];
    Width := AButton.Width;
    Height := AButton.Height;
    Transparent := True;
    OnClick := @ButtonLabelClick;
    OnDblClick := @ButtonLabelClick;
    OnMouseEnter := @ButtonLabelOnEnter;
    OnMouseLeave := @ButtonLabelOnLeave;
    OnMouseDown := @ButtonLabelMouseDown;
    OnMouseUp := @ButtonLabelMouseUp;
  end;

  ButtonsCount := ButtonsCount + 1;
end;

procedure UpdateButtons();
var
  n: Integer;
begin
    for n:=0 to ButtonsCount-1 do
    begin
      with ButtonPanel[n] do
      begin
        Visible := UsedButtons[n].Visible;
        Enabled := UsedButtons[n].Enabled;
        Left:= UsedButtons[n].Left;
        Top:= UsedButtons[n].Top;
      end;
      
      with ButtonLabel[n] do
      begin
        Caption := UsedButtons[n].Caption;
        Enabled := UsedButtons[n].Enabled;
        Left := ButtonPanel[n].Width div 2 - ButtonLabel[n].Width div 2;
        Top := ButtonPanel[n].Height div 2 - ButtonLabel[n].Height div 2;
      end;
      
      if not UsedButtons[n].Enabled then ButtonImage[n].Left := - UsedButtons[n].Width*3 else ButtonImage[n].Left := 0;
    end;
end;

procedure LicenceAcceptedRadioOnClick(Sender: TObject);
begin
  WizardForm.NextButton.Enabled:= True;
  UpdateButtons();
end;

procedure LicenceNotAcceptedRadioOnClick(Sender: TObject);
begin
  WizardForm.NextButton.Enabled:= False;
  UpdateButtons()
end;

procedure InitializeWizard();
begin
  with WizardForm do
  begin
    Color := clWhite;
    LicenseAcceptedRadio.OnClick := @LicenceAcceptedRadioOnClick;
    LicenseNotAcceptedRadio.OnClick := @LicenceNotAcceptedRadioOnClick;
    
    NextButton.Width := ScaleX(60);
  end;

  LoadButtonImage(WizardForm.BackButton, 1)
  LoadButtonImage(WizardForm.NextButton, 1)
  LoadButtonImage(WizardForm.CancelButton, 2)
  LoadButtonImage(WizardForm.DirBrowseButton, 1)
  LoadButtonImage(WizardForm.GroupBrowseButton, 2)
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  UpdateButtons();
  
  if CurPageID = wpFinished then
  begin
    ButtonPanel[1].Hide;
    WizardForm.NextButton.Left := ScaleX(60);
    LoadButtonImage(WizardForm.NextButton, 2);
    UpdateButtons;
  end;
end;


скрин:


архив со всем необходимым:
http://sendfile.su/650210

==================== Важно!
читать дальше »

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

так вот у двух последних лейблов и были эвенты : нажимаем, наводим, уводим
Почему?
да потому то что сначала создавался тот что на всю панель, а потом надпись и надпись ложилась сверху
у меня в коде этого нет, тк согдание идёт по порядку от begin до end;
те у меня сначала создаётся лейбл с надписью а потом другой - на всю панель - и он перекрывает тот
Если б не это то код выше был бы невозможен тк используется TLabel(Sender).Width
те берём размер посыльного лейбла
вот и получалось, что при наведении на большой всё в порядке, а при наведении на маленький ерунда

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

долго не мог докумекать почему пока не записал создание лейбла до создания кнопок

я говорю это потому что мне кажется это не все знают, а это важно!

Последний раз редактировалось Johny777, 16-08-2012 в 14:21.

Это сообщение посчитали полезным следующие участники:

Отправлено: 05:06, 16-08-2012 | #631