Конференция "Media" » Как заменить значения системных цветовых констант
 
  • ZeroDivide © (06.04.10 08:43) [0]
    Как заменить значения системных цветовых констант, только для своего приложения?

    Как я понял, подобно 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 снова устанавливать свои цвета?
  • ZeroDivide © (06.04.10 09:26) [1]
    Написал нехитрый тест:


    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, так как стандартный цвет там совсем-совсем не хайлайтит.)
  • Игорь Шевченко © (06.04.10 14:10) [2]

    > А как бы мне переопределить их только для своего приложения?


    никак
  • ZeroDivide © (07.04.10 08:50) [3]

    > никак


    Не верю.
  • Игорь Шевченко © (08.04.10 00:23) [4]
    ZeroDivide ©   (07.04.10 08:50) [3]

    Ты же не в церкви, верно ?

    Системные цвета хранятся в разделяемой области памяти, которая одним концом отображается на user32, который ее читает, а другим - в ядерную часть, Win32k.sys, который может туда писать.
    Нету никакой области, где системные цвета хранятся только для твоего процесса.
  • ZeroDivide © (08.04.10 14:55) [5]

    > Системные цвета хранятся в разделяемой области памяти, которая
    > одним концом отображается на user32, который ее читает,
    > а другим - в ядерную часть, Win32k.sys, который может туда
    > писать.
    > Нету никакой области, где системные цвета хранятся только
    > для твоего процесса.


    Ну а что мне мешает изменять эту область памяти при активации приложения и восстанавливать при деактивации? Вопрос в том, хватит ли этого?
    Иначе какой смысл тогда в SetSysColors, ведь эта функция устанавливает цвета только на период действия сессии.
  • Игорь Шевченко © (08.04.10 20:30) [6]

    > Ну а что мне мешает изменять эту область памяти при активации
    > приложения и восстанавливать при деактивации?


    То, что твои изменения отразятся на всех приложениях. А так конечно ничего не мешает, можешь и через панель управления менять.

    "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."
  • Игорь Шевченко © (08.04.10 20:33) [7]
    Вникать в заголовок до полного и окончательного просветления

    http://transl-gunsmoker.blogspot.com/2009/02/blog-post_14.html
  • ZeroDivide © (15.04.10 13:36) [8]

    > Вникать в заголовок до полного и окончательного просветления
    >
    > http://transl-gunsmoker.blogspot.com/2009/02/blog-post_14.
    > html


    Все бы ничего, но на темных скинах clNavy смотрится крайне отвратительно :(
 
Конференция "Media" » Как заменить значения системных цветовых констант
Есть новые Нет новых   [134430   +4][b:0][p:0.001]