Конференция "WinAPI" » Цвет фона окна [D7, WinXP]
 
  • Reqyzik (16.02.12 17:59) [0]
    Всем доброго времени) пытаюсь получать цвет фона окна по хэндлу или по DC, но все функции, которые мне посоветовали не помогают( вероятно не правильно использую или нет вовсе таких функций О_О. Пытался через GetBkColor()
    GetSysColor()
    GetDCBrushColor()
    но что то не выходит(
    дайте плиз рабочий примерчик, ато уже все волосы из головы выпали) ну и если возможно, так же присвоение цвета) заранее благодарен)

    p.s. то ж самое с цветом шрифта окна, сам шрифт получаю функцией font.Handle:=SendMessage(h, WM_GETFONT, 0, 0);, но цвет она всегда возвращает чёрный
  • Dimka Maslov © (16.02.12 18:13) [1]
    Цвет фона - это ровно тот цвет, каким его закрашивали в момент прорисовки. Существует большое кол-во способов это сделать (закрасить). А вот определить его в принципе невозможно, ибо мы не знаем ни конкретного способа закраски ни параметров контекста устройства в момент закраски. Тоже самое можно сказать и про шрифт, ибо цвет надписей это не свойство шрифта, а свойство контекста, устанавливаемое при помощи SetTextColor, которое может меняться при прорисовке. Ну а более того, если мы имеет hwnd окна, мы конечно можем для него получить DC, но это будет новый DC c набором свойств по-умолчанию, а совсем не тот DC при котором производилась отрисовка.
    Отсюда мораль - единственный способ это сделать - получит изображение окна и попиксельно его анализировать.
  • Reqyzik (16.02.12 18:17) [2]
    Уважаемый Дмитрий, судя по вашему ответу, способ есть - это послать сообщение окну о перерисовке и в этот момент отловить цвет фона) такой способ возможен? и если да, то как?)
  • brother © (16.02.12 19:18) [3]
    если фон - разноцветная картинка? тогда какой у него цвет?
  • Reqyzik (16.02.12 19:37) [4]
    Брадер, даже если на окне расположена(нарисована) картинка, то в процессе перерисовки, оно всё равно знает такой параметр, как цвт фона или браша, вот его мне поймать и нужно
  • Dimka Maslov © (16.02.12 22:15) [5]

    > Reqyzik   (16.02.12 18:17) [2]


    Нет и ещё раз нет. Если послать окну сообщение о перерисовке, оно создаст свой новый DC, который будет доступен только окну и будет существовать со всеми своими свойствами только до завершения прорисовки.  Не надо путать GDI с TCanvas, который преднаначен для хранения настроек. Можно, в принципе, послать окну сообщение WM_PRINT а потом проанализировать состояние контекста, на котором производилось рисование. Но.
    1. По уму состояние контекста после прорисовки должно быть восстановлено
    2. Я не уверен что это сработает из другого процесса

    И как сказано выше "цвета фона у окна нет"
  • Reqyzik (17.02.12 06:40) [6]
    спасибо всем за помощь, задачу решил сам)))

     Shape1.Brush.Color:=FindControl(WindowFromPoint(Mouse.CursorPos)).Brush.Color;
  • Reqyzik (17.02.12 06:53) [7]
    работает для всех окон, у которых есть это свойство) для остальных находить и не надо, вопрос: "как проверить теперь что у окна этого свойства нет?" ато ошибку выдаёт(
  • Reqyzik (17.02.12 07:15) [8]
    блин косяк( таким образом только почемуто у самой себя нормально получает цвет..
  • Dimka Maslov © (17.02.12 10:20) [9]
    Как видно из [6]..[8] задача опять была в другом... И решалась не через то место... Классический ныне случай.
  • Дмитрий С © (01.03.12 02:13) [10]

    >  Shape1.Brush.Color:=FindControl(WindowFromPoint(Mouse.CursorPos)).
    > Brush.Color;

    Ого=)

    Говорят же никак не сделать (нормальным способом), хотя бы потому что не ясно что вообще считать фоном.

    Тебе то, что ты хочешь надо определять только для своих окон или вообще для всех в винде?

    Например, у этого окна какой фон:


    unit Unit6;

    interface

    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs;

    type
     TForm6 = class(TForm)
       procedure FormResize(Sender: TObject);
     private
       procedure Erase(var M: TMessage); message WM_ERASEBKGND;
       procedure Move(var M: TMessage); message WM_MOVE;
     public
     end;

    var
     Form6: TForm6;

    implementation

    {$R *.dfm}

    procedure TForm6.Erase(var M: TMessage);
    begin
     PaintDesktop(M.WParam);
     M.Result := 1;
    end;

    procedure TForm6.FormResize(Sender: TObject);
    begin
     Repaint;
    end;

    procedure TForm6.Move(var M: TMessage);
    begin
     Repaint;
    end;

    end.


  • Дмитрий С © (01.03.12 02:14) [11]
    Оффтопик:
    А как функция PaintDesktop "догадывается" в каком месте рисовать десктоп?
 
Конференция "WinAPI" » Цвет фона окна [D7, WinXP]
Есть новые Нет новых   [134431   +6][b:0][p:0.001]