Изменяем вид кнопок на форме 1С 7.7

Опубликовал Аркадий Кучер (Abadonna) в раздел Программирование - Практика программирования

Изменяем вид кнопок на форме 1С 7.7. Статья для разработчиков ВК (Delphi)
Реализовано в http://infostart.ru/public/59436/?PAGEN_1=22#comm

Обратились ко мне любители "попугайских" форм с просьбой изменить вид (цвет) кнопок на форме, не прибегая к наложению картинки на кнопку.

Первое (и абсолютно неправильное!), что пришло в голову: наложить на кнопку что-то вроде 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;

 

 

 

 

 

См. также

Добавить вознаграждение
Комментарии
1. Vasily Kushnir (vasilykushnir) 62 20.08.10 14:31 Сейчас в теме
Я просто в шорохе от реализации. Оказывается все гениальное - просто. ;)
2. Аркадий Кучер (Abadonna) 3648 20.08.10 14:32 Сейчас в теме
(1) Но не все простое гениально :D
3. Ёпрст Биомать, а? Верните бесплатный доступ к файлам! (Ёпрст) 1010 20.08.10 15:05 Сейчас в теме
А можно просто натянуть активикс на кнопку и привет, будет хоть круглая:
4. Аркадий Кучер (Abadonna) 3648 20.08.10 15:31 Сейчас в теме
(3)Угу. Но актив-икс на кнопочку все равно ж dll-кой натягивать (в 7.7)
5. Ёпрст Биомать, а? Верните бесплатный доступ к файлам! (Ёпрст) 1010 20.08.10 15:43 Сейчас в теме
(4) ну да..
эт просто к тому, что способы есть разные :)

Можно еще тупо картинку на форму кинуть.. типо "псевдо кнопка". Тогда вообще без ВК можно обойтись.
6. Аркадий Кучер (Abadonna) 3648 20.08.10 15:46 Сейчас в теме
(5) Кушнир у меня счастлив и ладно ;) Это ему хотелось.
О чем я теперь искренне сожалею :cry:
Я вообще терпеть всяких "гламуров" не могу, как-то строгий стиль больше по душе.
На вкус и цвет...
7. WEB (WEB) 26.08.10 09:53 Сейчас в теме
У меня есть один вопрос: В методе TMiracleClass.hButton фигурирует переменная hReportDialog, но она нигде не объявлена. Если она является свойством класса TMiracleClass, то надо бы показать описание (секцию type) для этого класса, или просто писать self.hReportDialog ...
8. Boxa (Boxa) 2 26.08.10 11:25 Сейчас в теме
9. Аркадий Кучер (Abadonna) 3648 26.08.10 13:27 Сейчас в теме
(7)
В методе TMiracleClass.hButton фигурирует переменная hReportDialog

Эта статья является продолжением статьи http://infostart.ru/public/73902/ , а там написано:
В статьях "Создание внешних компонент 1С для начинающих" (http://www.infostart.ru/public/14551/) и "Создание внешних компонент 1С для начинающих, часть 2" (http://www.infostart.ru/public/14556/) были рассмотрены методы внедрения визуальных компонент Дельфи на активную форму 1С (отчет, обработка, документ, справочник, журнал). В частности, там же рассмотрены методы получения хэндла "подложки" (hReportDialog), которая используется как родительское окно при внедрении компонента Дельфи

Каюсь, тут поленился дописать:(
10. Аркадий Кучер (Abadonna) 3648 26.08.10 15:22 Сейчас в теме
12. bugmeoncemore (maxdot) 15.12.10 23:31 Сейчас в теме