-
Как заменить значения системных цветовых констант, только для своего приложения? Как я понял, подобно DecimalSeparator'у переопределить их значения не получится. Единственый способ их определения GetSysСolor и SetSyscolor http://msdn.microsoft.com/en-us/library/ms724208%28v=VS.85%29.aspxНо эти функции устанавливают системные цвета и посылают WM_SYSCOLORCHANGE message to all windows А как бы мне переопределить их только для своего приложения? Может кто делал? Возможно ли решение этой проблемы, если на WM_DEACTIVATE возвращать, а на WM_ACTIVATE снова устанавливать свои цвета?
-
Написал нехитрый тест:
procedure TForm1.DoAct(Sender: TObject);
var
cl: TColor;
El: TColor;
begin
cl := clRed;
El := COLOR_HIGHLIGHT;
SetSysColors(1, El, cl);
end;
procedure TForm1.DoDeAct(Sender: TObject);
var
cl: TColor;
El: TColor;
begin
El := COLOR_HIGHLIGHT;
SetSysColors(1, El, oldColor);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnActivate := DoAct;
Application.OnDeActivate := DoDeAct;
end;
initialization
oldColor := GetSysColor(COLOR_HIGHLIGHT);
finalization
El := COLOR_HIGHLIGHT;
SetSysColors(1, El, OldColor);
end.
Оказалось возможно. Правда, терзают смутные сомнения, может какие-то еще WM'ы помониторить, дабы не избезобразить случайно системную палитру. (Вся эта фигня была нужна для того, чтобы на темных скинах изменить clHighlight, так как стандартный цвет там совсем-совсем не хайлайтит.)
-
> А как бы мне переопределить их только для своего приложения?
никак
-
> никак
Не верю.
-
ZeroDivide © (07.04.10 08:50) [3]
Ты же не в церкви, верно ?
Системные цвета хранятся в разделяемой области памяти, которая одним концом отображается на user32, который ее читает, а другим - в ядерную часть, Win32k.sys, который может туда писать. Нету никакой области, где системные цвета хранятся только для твоего процесса.
-
> Системные цвета хранятся в разделяемой области памяти, которая > одним концом отображается на user32, который ее читает, > а другим - в ядерную часть, Win32k.sys, который может туда > писать. > Нету никакой области, где системные цвета хранятся только > для твоего процесса.
Ну а что мне мешает изменять эту область памяти при активации приложения и восстанавливать при деактивации? Вопрос в том, хватит ли этого? Иначе какой смысл тогда в SetSysColors, ведь эта функция устанавливает цвета только на период действия сессии.
-
> Ну а что мне мешает изменять эту область памяти при активации > приложения и восстанавливать при деактивации?
То, что твои изменения отразятся на всех приложениях. А так конечно ничего не мешает, можешь и через панель управления менять.
"The SetSysColors function sends a WM_SYSCOLORCHANGE message to all windows to inform them of the change in color. It also directs the system to repaint the affected portions of all currently visible windows."
-
-
|