Обратились ко мне любители "попугайских" форм с просьбой изменить вид (цвет) кнопок на форме, не прибегая к наложению картинки на кнопку.
Первое (и абсолютно неправильное!), что пришло в голову: наложить на кнопку что-то вроде TLabel, у которого есть возможность поменять цвета фона и шрифта. Однако, родная кнопка 1С в таком случае полностью перекрывается компонентом и, естественно, перестает реагировать на клик. В результате получаем цветную, но абсолютно нерабочую кнопку.
Второй вариант: создать динамически свою кнопку, но тогда события ее нажатия придется обрабатывать в форме в процедуре ОбработкаВнешнегоСобытия(), что не совсем комильфо.
Третий вариант: Оба! А что если перекрыть родную кнопку другой кнопкой от Delphi, которая имеет возможность изменения цветов? И заставить нашу новую кнопку посылать при ее нажатии
сообщение родной (которая под ней), что она (родная) нажата?!
Реализация:
Добавляем в основной модуль нашей ВК код
//определим свой тип на основе кнопки TJvNavPanelButton
// из замечательного набора компонент JEDI - рекомендую
type
TBtn = class(TJvNavPanelButton)
private
procedure BtnClick(Sender: TObject);
end;
// переопределяем родной OnClick TJvNavPanelButton
// на свою обработку - жмем родную 1С-кнопку на форме
procedure TBtn.BtnClick(Sender: TObject);
var bt1C:hwnd;
begin
// хэндл кнопки 1С, которую будем перекрывать нашей кнопкой
bt1C:=GetParent((Sender as TJvNavPanelButton).Parent.Handle);
// посылаем сообщение нажали/отпустили левую кнопку мыши - клик
SendMessage(bt1C,WM_LBUTTONDOWN,0,0);
SendMessage(bt1C,WM_LBUTTONUP,0,0);
end;
Прописываем нашу процедуру в ВК
// хэндл 1С-кнопки по её заголовку
function TMiracleClass.hButton(const Capt: WideString): Integer;
var a: array [0..254] of ansichar;
begin
StrPCopy(@a,capt);
RESULT:=FindWindowEx(hReportDialog,0,'Button',a);
end;
procedure TMiracleClass.SetButtonCaption(const Capt: WideString; ColorFrom,
ColorTo, FontColor: Integer);
var TWC:TWinControl;
var NewBt: TBtn;
var r:TRect;
var hB:hwnd;
begin
hB:=hButton(Capt);
// строим TWinControl на весь размер 1С-кнопки
TWC:=TWinControl.CreateParented(hB);
GetWindowRect(hB,r);
TWC.UpdateControlState;
TWC.Top:=0;
TWC.Left:=0;
TWC.Width:=r.Right-r.Left;
TWC.Height:=r.Bottom-r.Top;
// строим нашу новую кнопку на весь TWinControl
NewBt:=TBtn.Create(TWC);
NewBt.Parent:=TWC;
NewBt.Top:=0;
NewBt.Left:=0;
NewBt.Width:=TWC.Width;
NewBt.Height:=TWC.Height;
NewBt.Caption:=' '+Capt;
NewBt.Colors.ButtonColorFrom:=TColor(ColorFrom);
NewBt.Colors.ButtonHotColorFrom:=TColor(ColorFrom);
NewBt.Colors.ButtonSelectedColorFrom:=TColor(ColorFrom);
NewBt.Colors.ButtonColorTo:=TColor(ColorTo);
NewBt.Colors.ButtonHotColorTo:=TColor(ColorTo);
NewBt.Colors.ButtonSelectedColorTo:=TColor(ColorTo);
NewBt.Visible:=true;
NewBt.Font.Color:=TColor(FontColor);
// переопределям OnClick новой кнопки на "нажатие" 1С-кнопки
NewBt.OnClick:=NewBt.BtnClick;
end;