powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Можно ли переопределить clBtnFace ?
24 сообщений из 24, страница 1 из 1
Можно ли переопределить clBtnFace ?
    #39544259
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как известно clBtnFace определяется текущей цветовой гаммой винды.
Существует ли возможность его переопределить в конкретной программе не трогая цветовую гамму ОС ?
Проблема часто обсуждается на разных форумах, но без к-л эффекта.
...
Рейтинг: 0 / 0
Можно ли переопределить clBtnFace ?
    #39544273
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LSV,
Ну разве что хакнуть GetSysColor()
...
Рейтинг: 0 / 0
Можно ли переопределить clBtnFace ?
    #39544278
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LSVПроблема часто обсуждается на разных форумах, но без к-л эффекта.Потому как бред. Раз это системный цвет - то все вопросы к системе
...
Рейтинг: 0 / 0
Можно ли переопределить clBtnFace ?
    #39544288
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerLSVПроблема часто обсуждается на разных форумах, но без к-л эффекта.Потому как бред. Раз это системный цвет - то все вопросы к системеНу почему же бред ? Многие проги имеют нестандартные цвета. Та же 1С :)
Нет ничего плохого, если такая возможность будет.
...
Рейтинг: 0 / 0
Можно ли переопределить clBtnFace ?
    #39544301
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
30.10.2017 11:54, LSV пишет:
> Ну почему же бред ? Многие проги имеют нестандартные цвета. Та же 1С :)

Дык они и не пользуют предопределённые системные "константы".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Можно ли переопределить clBtnFace ?
    #39544308
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы очень удивился, если какая то прога поменяла системный цвет. Вирус ?
...
Рейтинг: 0 / 0
Можно ли переопределить clBtnFace ?
    #39544314
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBrЯ бы очень удивился, если какая то прога поменяла системный цвет. Вирус ?Речь не о смене системного цвета, а о его подмене в конкретном приложении.
...
Рейтинг: 0 / 0
Можно ли переопределить clBtnFace ?
    #39544328
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LSVНу почему же бред ? Многие проги имеют нестандартные цвета. Та же 1С :)
Нет ничего плохого, если такая возможность будет.Да потому. Кто нашептал тебе на ухо, что эти программы подменяют системные цвета? Пристрели его. Для этого есть кастомная отрисовка и скины
...
Рейтинг: 0 / 0
Можно ли переопределить clBtnFace ?
    #39544340
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LSVКак известно clBtnFace определяется текущей цветовой гаммой винды.
Существует ли возможность его переопределить в конкретной программе не трогая цветовую гамму ОС ?
Проблема часто обсуждается на разных форумах, но без к-л эффекта.
А в чем проблема не использовать clBtnFace, а использовать вместо него числовую константу с нулем в старшем байте?
...
Рейтинг: 0 / 0
Можно ли переопределить clBtnFace ?
    #39544351
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockLSVКак известно clBtnFace определяется текущей цветовой гаммой винды.
Существует ли возможность его переопределить в конкретной программе не трогая цветовую гамму ОС ?
Проблема часто обсуждается на разных форумах, но без к-л эффекта.
А в чем проблема не использовать clBtnFace, а использовать вместо него числовую константу с нулем в старшем байте?Продемонстрируй на примере ярлычка акладок у ПейджКонтрола. Или кнопочек у Комбобокса. :)
...
Рейтинг: 0 / 0
Можно ли переопределить clBtnFace ?
    #39544368
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так Delphi не рисует кнопочку ComboBox-а
...
Рейтинг: 0 / 0
Можно ли переопределить clBtnFace ?
    #39544375
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LSVПродемонстрируй на примере ярлычка акладок у ПейджКонтрола. Или кнопочек у Комбобокса. :)
Не, ну их вручную придется рисовать))

Или использовать SetSysColors, но она для всех процессов поменяет цвет, и тогда только ребут спасёт)
...
Рейтинг: 0 / 0
Можно ли переопределить clBtnFace ?
    #39544808
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Боюсь, что странные хотелки закончатся сменой набора компонент. Если действительно сильно нужно. А если сильно не нужно - то и незачем.
...
Рейтинг: 0 / 0
Можно ли переопределить clBtnFace ?
    #39545067
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonБоюсь, что странные хотелки закончатся сменой набора компонент. Если действительно сильно нужно. А если сильно не нужно - то и незачем.Все (вообще все) компоненты практически невозможно и поменять. И нецелесообразно.
А насчет нужно...... Без этого жить конеш можно. Но было бы неплохо, если бы такая возможность появилась.

Я так понимаю все цвета постоянно зачитываются из GetSysColor, т.е. нет зачитанной единожды константы в памяти программы. :(
...
Рейтинг: 0 / 0
Можно ли переопределить clBtnFace ?
    #39545070
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LSVЯ так понимаю все цвета постоянно зачитываются из GetSysColor, т.е. нет зачитанной единожды константы в памяти программы. :(Конечно. Ведь цвет может измениться и надо будет перерисоваться.
Перекрывай GetSysColor и будет то, что ты хочешь, скорее всего.
...
Рейтинг: 0 / 0
Можно ли переопределить clBtnFace ?
    #39545082
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LSVЯ так понимаю все цвета постоянно зачитываются из GetSysColor, т.е. нет зачитанной единожды константы в памяти программы. :(

Все цвета постоянно находятся в ядерной части Win32, спроецированной на пользовательское пространство процесса
...
Рейтинг: 0 / 0
Можно ли переопределить clBtnFace ?
    #39545091
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiLSVЯ так понимаю все цвета постоянно зачитываются из GetSysColor, т.е. нет зачитанной единожды константы в памяти программы. :(

Все цвета постоянно находятся в ядерной части Win32, спроецированной на пользовательское пространство процесса Ну и что. Винда, когда рисует свои контролы, всё равно вызывает эту ф-цию. Ну, скорее всего :)
...
Рейтинг: 0 / 0
Можно ли переопределить clBtnFace ?
    #39545118
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Винда внутри отрисовки контролов не вызывает функцию, а берет цвет в таблице по нужному адресу. Функция GetSysColor берет цвет в таблице по тому же адресу. Я к тому, что перехват не гарантирует корректную отрисовку всех стандартных контролов.
...
Рейтинг: 0 / 0
Можно ли переопределить clBtnFace ?
    #39545141
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schi Я к тому, что перехват не гарантирует корректную отрисовку всех стандартных контролов. Не гарантирует, но с большой вероятностью так и будет. Ибо таблица может меняться по ходу пьесы и вряд ли разработчики винды реализовывали разные механизмы доступа к ней.
...
Рейтинг: 0 / 0
Можно ли переопределить clBtnFace ?
    #39545166
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LSV,

Вообще, считаю логичным, когда цвета настраиваются в том же механизме, что и рисует контролы.
Рисует контролы винда - вот и настраивать их надо в винде.

Ты рисуешь свои контролы - сделай свою настройку.

1С тут, как раз, антипример. Какого хрена у меня вдруг цвета в одной из программ не такие, как лично я настроил для всех? Я что, кайфовать должен от того, что на мой вкус наплевали?
Это от лица благодарных пользователей :)
...
Рейтинг: 0 / 0
Можно ли переопределить clBtnFace ?
    #39545262
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1С тут, как раз, антипример. Какого хрена у меня вдруг цвета в одной из программ не такие, как лично я настроил для всех?Неужели там нельзя выбрать дефолтные цвета ???
...
Рейтинг: 0 / 0
Можно ли переопределить clBtnFace ?
    #39545287
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LSV1С тут, как раз, антипример. Какого хрена у меня вдруг цвета в одной из программ не такие, как лично я настроил для всех?Неужели там нельзя выбрать дефолтные цвета ???
Не знаю :). Но если да - то смысл менять на не-дефолтные, если можно в винде поменять, чтоб для всех программ применилась настройка?
А если по-умолчанию не дефолтные стоят - это издевательство над пользователем.
...
Рейтинг: 0 / 0
Можно ли переопределить clBtnFace ?
    #39545290
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борисschi Я к тому, что перехват не гарантирует корректную отрисовку всех стандартных контролов. Не гарантирует, но с большой вероятностью так и будет. Ибо таблица может меняться по ходу пьесы и вряд ли разработчики винды реализовывали разные механизмы доступа к ней.

Посмотри в исходниках :)
...
Рейтинг: 0 / 0
Можно ли переопределить clBtnFace ?
    #39545511
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код ниже включает для приложения палитру WinXP classic mode.
Приложения должно быть скомпилировано без XP-манифеста, включающего поддержку тем.
Нужно просто подключить SysPaletteInterceptor первым модулем в dpr.
Код: 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.
unit DllFuncReplace;

interface

uses
  WinApi.Windows;

procedure ReplaceDllFunc(const InModule: string; const AOldFuncAddr, ANewFuncAddr: FARPROC; const AhModule: HMODULE);

implementation

uses
  System.SysUtils, WinApi.ImageHlp;

function SameTextUnicode(const S1, S2: UnicodeString): Boolean;
begin
  Result := WinApi.Windows.CompareStringW(WinApi.Windows.LOCALE_INVARIANT, WinApi.Windows.NORM_IGNORECASE, PWideChar(S1),
    Length(S1), PWideChar(S2), Length(S2)) = CSTR_EQUAL;
end;

procedure ReplaceDllFunc(const InModule: string; const AOldFuncAddr, ANewFuncAddr: FARPROC; const AhModule: HMODULE);
var
  ASize: ULONG;
  lpflProtect: DWORD;
  AThunk: PPointer;
  AImportEntry: PImageImportDescriptor;
  ModuleName: string;
begin
  try
    AImportEntry := ImageDirectoryEntryToData(Pointer(AhModule), ByteBool(1), IMAGE_DIRECTORY_ENTRY_IMPORT, ASize);
    while Assigned(AImportEntry) and (AImportEntry^.Name <> 0) do
    begin
      ModuleName := UnicodeString(PAnsiChar(AhModule + AImportEntry.name));
      AThunk := Pointer(NativeUInt(AhModule) + AImportEntry^.FirstThunk);
      while Assigned(AThunk) and Assigned(AThunk^) do
      begin
        if SameTextUnicode(ModuleName, InModule) then
        begin
          if (AThunk^ = Pointer(AOldFuncAddr)) then
          begin
            if not IsBadWritePtr(AThunk, SizeOf(NativeUInt)) then
            begin
              AThunk^ := ANewFuncAddr;
            end
            else
            begin
              {$WARN SYMBOL_PLATFORM OFF}
              Win32Check(
                VirtualProtect(AThunk, SizeOf(NativeUInt), PAGE_EXECUTE_READWRITE, lpflProtect)
              );
              AThunk^ := ANewFuncAddr;
              Win32Check(
                VirtualProtect(AThunk, SizeOf(NativeUInt), lpflProtect, lpflProtect)
              );
              {$WARN SYMBOL_PLATFORM ON}
            end;
            OutputDebugString(PChar(Format('[0x%s]@ReplaceIATEntry: address=0x%s -> address=0x%s',
              [IntToHex(NativeUInt(AThunk), 2 * SizeOf(NativeUInt)), IntToHex(NativeUInt(AOldFuncAddr), 2 * SizeOf(NativeUInt)), IntToHex(NativeUInt(ANewFuncAddr), 2 * SizeOf(NativeUInt))])));
          end;
        end;
        Inc(AThunk);
      end;
      AImportEntry  := Pointer(NativeUInt(AImportEntry) + SizeOf(TImageImportDescriptor));
    end;
  except
    on E: Exception do
    begin
      // Win32Check Error
      OutputDebugString(PChar('ReplaceIATEntry@' + E.ClassName + ': ' + E.Message));
    end;
  end;
end;

end.



Код: 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.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
unit SysPaletteInterceptor;

interface

procedure InterceptPalette;

implementation

uses
  Winapi.Windows, DllFuncReplace,
  Winapi.UxTheme;

type
  TSystemPalette = packed array[0..31] of COLORREF;
  TSystemBrushes = packed array[0..31] of HBRUSH;

const
  // from 0 to 31
  FSysPaletteHex: AnsiString =
  'D4D0C8003A6EA5000A246A0080808000D4D0C800FFFFFF00000000000000000000000000FFFFFF00D4D0C800D4D0C800808080000A246A00FFFFFF00D4D0C800' +
  '808080008080800000000000D4D0C800FFFFFF0040404000D4D0C80000000000FFFFE100B5B5B50000008000A6CAF000C0C0C0000A246A00D4D0C80000000000';
  // in 32..255 there are zeroes


var
  FSystemPalette: TSystemPalette;
  FSystemBrushes: TSystemBrushes;

procedure BinToHex(Buffer: PAnsiChar; Text: PAnsiChar; BufSize: Integer);
const
  Convert: array[0..15] of AnsiChar = AnsiString('0123456789ABCDEF');
var
  I: Integer;
begin
  for I := 0 to BufSize - 1 do
  begin
    Text[0] := Convert[Byte(Buffer[I]) shr 4];
    Text[1] := Convert[Byte(Buffer[I]) and $F];
    Inc(Text, 2);
  end;
end;

function HexToBin(Text : PAnsiChar; Buffer: PAnsiChar; BufSize: Integer): Integer;
const
  Convert: array['0'..'f'] of SmallInt =
    ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1,
     -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,
     -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
     -1,10,11,12,13,14,15);
var
  I: Integer;
begin
  I := BufSize;
  while I > 0 do
  begin
    if not (Text[0] in ['0'..'f']) or not (Text[1] in ['0'..'f']) then Break;
    Buffer[0] := AnsiChar((Convert[Text[0]] shl 4) + Convert[Text[1]]);
    Inc(Buffer);
    Inc(Text, 2);
    Dec(I);
  end;
  Result := BufSize - I;
end;


function AnsiHex2Bin(const HexSource: AnsiString): AnsiString;
begin
  SetLength(Result, Length(HexSource) div 2);
  if Length(Result) > 0 then
    HexToBin(PAnsiChar(HexSource), PAnsiChar(Result), Length(Result))
end;

function AnsiBin2Hex(const Source: AnsiString): AnsiString;
begin
  SetLength(Result, Length(Source) * 2);
  if Length(Source) > 0 then
    BinToHex(PAnsiChar(Source), PAnsiChar(Result), Length(Source));
end;

function GetSystemPalette: TSystemPalette;
var
  I: Byte;
begin
  for I := 0 to High(TSystemPalette) do
    Result[I] := GetSysColor(I);
end;

var
  FSafeGetSysColor: function(nIndex: Integer): DWORD; stdcall;
  FSafeGetThemeSysColor: function(hTheme: HTHEME; iColorId: Integer): COLORREF; stdcall;
  FSafeGetSysColorBrush: function(nIndex: Integer): HBRUSH; stdcall;

function InterceptGetSysColor(nIndex: Integer): DWORD; stdcall;
begin
  if (nIndex >= 0) and (nIndex < 256) then
  begin
    if (nIndex >= 0) and (nIndex < 32) then
      Result := FSystemPalette[nIndex]
    else
      Result := 0;
  end
  else
    Result := FSafeGetSysColor(nIndex);
end;

function InterceptGetThemeSysColor(hTheme: HTHEME; iColorId: Integer): COLORREF; stdcall;
begin
  if (iColorId >= 0) and (iColorId < 32) then
  begin
    Result := FSystemPalette[iColorId]
  end
  else
    Result := FSafeGetThemeSysColor(hTheme, iColorId);
end;

function InterceptGetSysColorBrush(nIndex: Integer): HBRUSH; stdcall;
begin
  if (nIndex >= 0) and (nIndex < 32) then
    Result := FSystemBrushes[nIndex]
  else
    Result := FSafeGetSysColorBrush(nIndex);
end;

procedure InterceptPalette;
var
  SysPaletteBin: AnsiString;
  I: Integer;
begin
  SysPaletteBin := AnsiHex2Bin(FSysPaletteHex);
  Move(Pointer(SysPaletteBin)^, FSystemPalette, SizeOf(FSystemPalette));
  FSafeGetSysColor := @GetSysColor;
  ReplaceDllFunc(
    Winapi.Windows.user32,
    GetProcAddress(GetModuleHandle(Winapi.Windows.user32), 'GetSysColor'),
    @InterceptGetSysColor,
    GetModuleHandle(nil));

  if InitThemeLibrary then
  begin
    FSafeGetThemeSysColor := GetThemeSysColor;
    GetThemeSysColor := InterceptGetThemeSysColor;
  end;

  for I := 0 to High(FSystemBrushes) do
    FSystemBrushes[I] := CreateSolidBrush(FSystemPalette[I]);
  ReplaceDllFunc(
    Winapi.Windows.user32,
    GetProcAddress(GetModuleHandle(Winapi.Windows.user32), 'GetSysColorBrush'),
    @InterceptGetSysColorBrush,
    GetModuleHandle(nil));

end;

function GetSystemPaletteAsHex: AnsiString;
var
  SystemPalette: TSystemPalette;
begin
  SystemPalette := GetSystemPalette;
  SetLength(Result, SizeOf(SystemPalette));
  Move(SystemPalette, Pointer(Result)^, SizeOf(SystemPalette));
  Result := AnsiBin2Hex(Result);
end;

initialization
  InterceptPalette;
end.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Можно ли переопределить clBtnFace ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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