С подсветкой цветом все как бы просто и понятно.
С рамкой немного намучился...
Оказалось все просто как "два пальца обасфальт"
Помещаем за активным контролом любой другой на несколько пикселей больше, закрашиваем нужным цветом и рамка готова.
Для такой цели наилучшим образом подходит PaintBox. А тут (PaintBox) есть поле для дальнейшего творчества.
Я воспользовался предложением nesco про оба варианта.
И решил сразу "пилить" Win.pas, чтобы в визуальных компонентах по умолчанию были такие свойства.
Доработки в Win.pas
#pas
THIWin = class(TDebug)
protected
//после fOnMouseLeave:THI_Event;
BacklightBorder:PControl; //добавлена переменная для PaintBox
public
//после _prop_WinStyle:byte;
//Property BlackLight
_prop_BackLightStyle:byte; //Добавлено свойство "стиль подсветки"
_prop_ColorFill:TColor; //Добавлено свойство "цвет заливки"
_prop_ColorFrameLine:TColor; //Добавлено свойство "цвет линии рамки"
_prop_FrameLineWidth:Integer; //Добавлено свойство "толщина линии рамки"
//после procedure _work_doHint(var Data:TData; Index:word);
procedure SetBacklight; //Добавлена процедура установки подсветки
procedure ResetBacklight; //Добавлена процедура снятия подсветки
-----------------------------------------------------------------
implementation
//добавлено после destructor THIWin.Destroy; begin ... end;
procedure THIWin.SetBacklight; //Процедура установки подсветки
begin
if (_prop_BackLightStyle = 1) or (_prop_BackLightStyle = 3) then Control.Color:= _prop_ColorFill;
if (_prop_BackLightStyle = 2) or (_prop_BackLightStyle = 3) then
begin
BacklightBorder:= NewPaintBox(Control.Parent);
with BacklightBorder{$ifndef F_P}^{$endif} do begin
Left:= Control.Left - _prop_FrameLineWidth;
Top:=Control.Top - _prop_FrameLineWidth;
Width:=Control.Width + (2 * _prop_FrameLineWidth);
Height:=Control.Height + (2 * _prop_FrameLineWidth);
Color:=_prop_ColorFrameLine;
BringToFront; //Важно
end;
Control.BringToFront; //Важно
end;
end;
procedure THIWin.ResetBacklight; //Процедура снятия подсветки
begin
Control.Color:= _prop_Color;
BacklightBorder.Free;
end;
-----------------------------------------------------------------
//проведены изменения в function THIWin._onMessage;
function THIWin._onMessage;
var P:PWindowPos; dt:TData; sz:integer;
begin
case Msg.message of
WM_WINDOWPOSCHANGING: begin
P := Pointer(Msg.lParam);
if (P.flags and SWP_NOSIZE)=0 then begin
sz := Control.Height;
if P.cy<>sz then begin
dtInteger(dt, P.cy - sz);
_ReadData(dt,_data_HeightControls);
if _isInteger(dt) then P.cy := sz + ToInteger(dt);
end;
sz := Control.Width;
if P.cx<>sz then begin
dtInteger(dt, P.cx - sz);
_ReadData(dt,_data_WidthControls);
if _isInteger(dt) then P.cx := sz + ToInteger(dt);
end;
end;
end;
WM_SETFOCUS : begin
if _prop_BackLightStyle <> 0 then SetBacklight; //Вызов процедуры установки подсветки
_hi_OnEvent(_event_onSetFocus);
end;
WM_KILLFOCUS: begin
if _prop_BackLightStyle <> 0 then ResetBacklight; //Вызов процедуры снятия подсветки
_hi_OnEvent(_event_onKillFocus);
end;
WM_MOVE: _hi_OnEvent(_event_onMove);
end;
Result := _hi_OnMessage(OldMes,Msg,Rslt);
end;
Доработки в WinControl.ini
#ini
;добавлено в конце секции [Property]
##Backlight=Подсветка при получении фокуса
BackLightStyle=Стиль подсветки: None - нет подсветки, FillColor - изменить цвет заливки, FrameColor - изменить цвет рамки, BothVariants - оба варианта|4|0|None,FillColor,FrameColor,BothVariants
ColorFill=Цвет заливки|8|clYellow
ColorFrameLine=Цвет рамки|8|clRed
FrameLineWidth=Ширина линии рамки|1|1
##
Вот мои WinControl.ini и Win.pas
------------ Дoбавленo в 09.59:
"Подводные камни..."
Компонент ComboBox - в режиме ReadOnly=False получает и сразу теряет фокус (подсветка как-бы не происходит)
Компонент TrackBarRush - при переходе по TAB не получает фокус, хотя при клыке мышкой рамка рисуется.
Компонент UpDown - при переходе по TAB не получает фокус и скорее не обрабатывает SetFocus,KillFocus.