Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi. Смена цвета фонта в disabled control / 20 сообщений из 20, страница 1 из 1
21.05.2021, 01:21
    #40071813
Galadriel75
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi. Смена цвета фонта в disabled control
Ciao a tutti!

А кто-нибудь может знает, как красиво и изящно решить скорее всего нерешаемое: изменить цвет фонта у контрола, который в состоянии Enabled := false?

1. Ни в какой контейнер (TPanel и др.) контролы не хочу помещать.
2. Ставить сторонние компоненты нежелательно, так как никто не хочет потом у себя доустанавливать. Разработка таки коллективная.
3. В крайнем случае можно переопределить метод WMPaint - видимо это самое простое. Но компонент не TEdit, а TrzNumericEdit. Первая попытка уже была, работает, но криво. А надо, чтоб не криво... Компонент наследуется от .......TMaskEdit и дальше от TWinControl.... далее методы отрисовки уходят в WinAPI....... контролы - это окна и винда их рисует, как окна...
Исходников RaizeComponent чего-то нету у меня, посмотреть, что там и как пока что не получается... А хотелось бы...

Может еще какие варианты есть?

Только желательно по делу, а не как обычно.
...
Рейтинг: 0 / 0
21.05.2021, 01:46
    #40071818
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi. Смена цвета фонта в disabled control
Вариантов два:
1. Искать исходники
2. Написать всё самим

PS:
бонусный вариант - не маяться дурью
...
Рейтинг: 0 / 0
21.05.2021, 07:40
    #40071837
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi. Смена цвета фонта в disabled control
...
Рейтинг: 0 / 0
21.05.2021, 09:35
    #40071851
Galadriel75
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi. Смена цвета фонта в disabled control
white_nigger
Вариантов два:
1. Искать исходники
2. Написать всё самим

PS:
бонусный вариант - не маяться дурью


За бонус согласен, но вот хотят именно так :(
...
Рейтинг: 0 / 0
21.05.2021, 09:40
    #40071853
Galadriel75
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi. Смена цвета фонта в disabled control


о спасибо! посмотрел втуда. Вот чего нашел втам:
"Read-only or disabled edit controls do not send the WM_CTLCOLOREDIT message; instead, they send the WM_CTLCOLORSTATIC message."
Значит надо курить в сторону WM_CTLCOLORSTATIC!

Thanks!
...
Рейтинг: 0 / 0
21.05.2021, 12:59
    #40071920
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi. Смена цвета фонта в disabled control
Galadriel75
Значит надо курить в сторону WM_CTLCOLORSTATIC!
Это если в тех компонентах используется системный подход для задания цвета. Без сырцов - игра в угадайку, но есть шанс что прокатит. Кстати, а в самих компонентах Raize нет ничего для этого, или для отрисовки?
...
Рейтинг: 0 / 0
21.05.2021, 13:23
    #40071926
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi. Смена цвета фонта в disabled control
...
Рейтинг: 0 / 0
21.05.2021, 14:26
    #40071946
kapas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi. Смена цвета фонта в disabled control
Galadriel75, см. http://delphimaster.net/view/1-1124453135/all (ого 2005 г. !)
...
Рейтинг: 0 / 0
21.05.2021, 15:58
    #40071968
Galadriel75
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi. Смена цвета фонта в disabled control
white_nigger
Galadriel75
Значит надо курить в сторону WM_CTLCOLORSTATIC!
Это если в тех компонентах используется системный подход для задания цвета. Без сырцов - игра в угадайку, но есть шанс что прокатит. Кстати, а в самих компонентах Raize нет ничего для этого, или для отрисовки?


Вроде как нету. Или я не нашел. Но скорее всего нету. До меня тоже уже искали.
...
Рейтинг: 0 / 0
21.05.2021, 16:01
    #40071970
Galadriel75
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi. Смена цвета фонта в disabled control
DimaBr


Раз сам Рэй сказал делать наследника, значит так тому и быть! Спасибо за ссылку!
...
Рейтинг: 0 / 0
21.05.2021, 16:09
    #40071975
Galadriel75
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi. Смена цвета фонта в disabled control
kapas
Galadriel75, см. http://delphimaster.net/view/1-1124453135/all (ого 2005 г. !)


Да, я видел этот пример и попробовал. Он не работает, как надо:
Затирает белым фоном все подряд вместе с бордюром.
Куча артефактов.
...
Рейтинг: 0 / 0
21.05.2021, 16:33
    #40071988
kapas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi. Смена цвета фонта в disabled control
Galadriel75, не понял. У мня такая картинка
...
Рейтинг: 0 / 0
21.05.2021, 22:02
    #40072073
Galadriel75
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi. Смена цвета фонта в disabled control
kapas
Galadriel75, не понял. У мня такая картинка


На тестовом проекте у меня тоже все отлично! Ну, прям аж на душе полегчало. Думал, решил задачу. И принялся переносить все на боевой. Создал компонентик-наследник TRzNumericEditExt, заменил им TRzNumericEdit. И получил компоненты без границ - они все склеились в один, так как между ними малое совсем расстояние. На формочке они изначально плотненько практически были - форма до меня спроектирована, менять я там ничего не могу. Цифры были смещены все влево, а должны быть справа. И это неудивительно - там есть вывод текста, начиная слева.
Тем не менее, все остальное работает! Если не выйдет сделать как-то иначе придется пилить эту версию. Текст посадить вправо таки вообще не проблема! И останется понять, почему на тестовом все хорошо, а на боевом - все плохо. На боевом еще дополнительные всякие украшательства используются, стили. Возможно, они и подмешивают артефакты. На тестовом - просто голая форма и на ней компоненты. А в реальном проекте просто лавина всяких стилей отрисовки...
...
Рейтинг: 0 / 0
22.05.2021, 03:58
    #40072122
Galadriel75
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi. Смена цвета фонта в disabled control
Таки сделал обработчик WM_CTLCOLORSTATIC
Ну, примерно вот как
Код: pascal
1.
2.
3.
4.
SetTextColor(Message.WParam, ColorToRGB(fFontColor));
SetBkColor(Message.WParam, ColorToRGB(clGrayText));
// SetBkMode(Message.WParam, TRANSPARENT);
Message.Result := LRESULT(Brush.Handle);



Ключевое здесь - костыль. Без него не будет работать!:
Код: pascal
1.
SetBkColor(Message.WParam, ColorToRGB(clGrayText));


Костыль нарисовал благодаря тому, что по исходникам винды сразу и видно, что если цвет фона совпадает с цветом задизабленного фонта, то винда только в этом случае любезно оный цвет фонтовый и позволяет изменить, а иначе и никак!
Спасибо всем добрым и умным людям за помощь!

...
Рейтинг: 0 / 0
17.06.2021, 14:41
    #40078304
Galadriel75
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi. Смена цвета фонта в disabled control
Ciao a tutti!

И вот неожиданно продолжение темы....



А на панели, как оказалось, не меняет цвет... Хотя вроде панель в окне живет... Вот облом так облом. Я не знаю, как разрулить это попроще. Нагуглил такого, что не уверен, что решение правильное...

Вот такой код

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
unit unit_Test;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Vcl.StdCtrls, Vcl.Mask, RzEdit, Vcl.ExtCtrls{, RzNumericEditExt}, TypInfo,
  ActnList, Contnrs, dxCore, dxCoreClasses, dxMessages, dxCommon, dxThemeManager,
  cxLookAndFeels, cxLookAndFeelPainters, cxControls, cxContainer, cxClasses,
  cxGraphics, cxStyles, dxFading, cxAccessibility, cxLibraryConsts, dxCustomHint,
  dxScreenTip, VCL.Themes;

type
  TForm2 = class(TForm)
    Button1: TButton;
    edt1: TRzNumericEdit;
    edt2: TRzNumericEdit;
    edt3: TRzNumericEdit;
    edt4: TRzNumericEdit;
    edt5: TRzNumericEdit;
    edt6: TRzNumericEdit;
    pnl1: TPanel;
    edt7: TRzNumericEdit;
    edt8: TRzNumericEdit;
    edt9: TRzNumericEdit;
    edt10: TRzNumericEdit;
    edt11: TRzNumericEdit;
    edt12: TRzNumericEdit;
    edt13: TRzNumericEdit;
    edt14: TRzNumericEdit;
    procedure Button1Click(Sender: TObject);
  private
    fFontColor: TColor;
    procedure WndProc(var Message: TMessage); override;
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
var
  I: Integer;
  c: TRzNumericEdit;
begin

  if fFontColor <> clRed then
    fFontColor := clRed
  else
    fFontColor := clGreen;

  for I := 0 to Pred(self.ControlCount) do
  begin

    if self.Controls[I] is TRzNumericEdit then
    begin
      c := self.Controls[I] as TRzNumericEdit;
      c.Enabled := false;
      case fFontCOlor of
        clRed:
          c.Text := 'RED RED RED!';
        clGreen:
          c.Text := 'Green Green Green!';
      end;
    end;
  end;
//  Invalidate;

end;

procedure TForm2.WndProc(var Message: TMessage);

  function FindEditControl(AHandle: HWND): TRzNumericEdit;
  var
    AEditControl: TRzNumericEdit;
    I: Integer;
  begin
    Result := nil;
    for I := 0 to self.ControlCount - 1 do
      if self.Controls[I] is TRzNumericEdit then
      begin
        AEditControl := TRzNumericEdit(self.Controls[I]);
        if AEditControl.HandleAllocated and (AEditControl.Handle = AHandle) then
        begin
          Result := AEditControl;
          Break;
        end;
      end;
  end;

var
  AEditControl: TRzNumericEdit;
begin
  case Message.Msg of
    WM_CTLCOLOREDIT, WM_CTLCOLORSTATIC: //don't use VCL-like method
      begin
        AEditControl := FindEditControl(Message.LParam);
        if AEditControl = nil then
          inherited
        else
        begin
          SetTextColor(Message.WParam, ColorToRGB(fFontColor));
          SetBkColor(Message.WParam, ColorToRGB(clGrayText));
         // SetBkMode(Message.WParam, TRANSPARENT);
          Message.Result := LRESULT(Brush.Handle);
        end;
      end;
  else
    inherited;
  end;
end;


...
Рейтинг: 0 / 0
17.06.2021, 17:42
    #40078365
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi. Смена цвета фонта в disabled control
Galadriel75,

А что непонятного во фразе:
авторA static control, or an edit control that is read-only or disabled, sends the WM_CTLCOLORSTATIC message to its parent window when the control is about to be drawn.

Как вариант - сделай глобальный обработчик в Application.OnMessage.
...
Рейтинг: 0 / 0
17.06.2021, 17:52
    #40078368
Galadriel75
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi. Смена цвета фонта в disabled control
alekcvp
Galadriel75,

А что непонятного во фразе:
авторA static control, or an edit control that is read-only or disabled, sends the WM_CTLCOLORSTATIC message to its parent window when the control is about to be drawn.


Как вариант - сделай глобальный обработчик в Application.OnMessage.


ОООООО, спасибо!!! Попробую!
Вся моя беда в том, что я НЕ ЧИТАЮ доку!
Во фразе таки понятно все до последней буквы, даже без словаря! Но я ж не читатель :(
...
Рейтинг: 0 / 0
21.06.2021, 17:13
    #40079188
Galadriel75
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi. Смена цвета фонта в disabled control
Ну вроде что-то вышло....



Немного причешу код, попробую понять, что я сделал и выложу сюда. Может кому-то пригодится, может кто замечания по делу скажет...
...
Рейтинг: 0 / 0
22.06.2021, 08:52
    #40079263
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi. Смена цвета фонта в disabled control
Galadriel75,

посмотрите TWinControl.DefaultHandler

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
      case Msg of
        WM_CTLCOLORMSGBOX..WM_CTLCOLORSTATIC:
          Result := SendMessage(LParam, CN_BASE + Msg, WParam, LParam);
        CN_CTLCOLORMSGBOX..CN_CTLCOLORSTATIC:
          begin
            SetTextColor(WParam, ColorToRGB(FFont.Color));
            SetBkColor(WParam, ColorToRGB(FBrush.Color));
            Result := LRESULT(FBrush.Handle);
          end;


он возвращает сообщение контролу как CN_CTLCOLORSTATIC = CN_BASE + WM_CTLCOLORSTATIC;

видно, что DefaultHandler с CN_CTLCOLORSTATIC делает как у вас, значит кто-то в компоненте пошаманил с CN_CTLCOLORSTATIC, либо в стилях что-то не так
...
Рейтинг: 0 / 0
22.06.2021, 12:07
    #40079304
Galadriel75
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi. Смена цвета фонта в disabled control
kealon(Ruslan)
Galadriel75,

посмотрите TWinControl.DefaultHandler

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
      case Msg of
        WM_CTLCOLORMSGBOX..WM_CTLCOLORSTATIC:
          Result := SendMessage(LParam, CN_BASE + Msg, WParam, LParam);
        CN_CTLCOLORMSGBOX..CN_CTLCOLORSTATIC:
          begin
            SetTextColor(WParam, ColorToRGB(FFont.Color));
            SetBkColor(WParam, ColorToRGB(FBrush.Color));
            Result := LRESULT(FBrush.Handle);
          end;


он возвращает сообщение контролу как CN_CTLCOLORSTATIC = CN_BASE + WM_CTLCOLORSTATIC;

видно, что DefaultHandler с CN_CTLCOLORSTATIC делает как у вас, значит кто-то в компоненте пошаманил с CN_CTLCOLORSTATIC, либо в стилях что-то не так


оки,спасибо, гляну!
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi. Смена цвета фонта в disabled control / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]