Эх
Ваня...
в общем так
за основу взял "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
те берём размер посыльного лейбла
вот и получалось, что при наведении на большой всё в порядке, а при наведении на маленький ерунда
другой пример
у меня в инсталле на одной странице есть спидбаттоны и накладывается прозрчный лейбл на участок под ними за который можно хвататься мышью
но так получалось, что он перекрывал их и них просто нельзя было нажать - они становились частью окружения не являясь больше контролами
долго не мог докумекать почему пока не записал создание лейбла до создания кнопок
я говорю это потому что мне кажется это не все знают, а это важно!