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

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

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

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

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

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

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

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

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

Посмотри в исходниках :)
...
Рейтинг: 0 / 0
31.10.2017, 18:36:50
    #39545511
NickDee
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли переопределить clBtnFace ?
Код ниже включает для приложения палитру 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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Можно ли переопределить clBtnFace ? / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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