Имеется функция GetDesktopWindow, позволяющая получить дескриптор окна рабочего стола. Она объявлена в модуле Windows следующим образом:

function GetDesktopWindow: HWND;
stdcall;

Полученный с помощью этой функции дескриптор можно далее использовать в любых функциях API Windows. Если вы хотите что-то рисовать или писать непосредственно на поверхности рабочего стола, то предварительно надо получить дескриптор его контекста. Получение дескриптора контекста обеспечивает функция GetWindowDC:

function GetWindowDC(hWnd: HWND): HDC;
stdcall;

А далее для вывода текста вы можете использовать такие функции API Windows, как DrawText, DrawTextEx, ExtTextOut, ExtTextOut, TabbedTextOut.

Для рисования фигур вы также можете использовать целый ряд функций API Windows. Ниже приведен пример, демонстрирующий вывод текста и изображения на рабочий стол:

var HD: HDC;
S: string;
R: TRect;
HD := GetWindowDC(GetDesktopWindow);
S := 'Идет реорганизация базы данных. Будьте осторожны!';
R := Rect (200, 200, 300, 300) ;
FillRect(HD,R,GetStockObject(WHITE_BRUSH));
DrawText(HD,PChar(S) ,Length (S) , R, DT_CENTER or DT_WORDBREAK) ;
Ellipse (HD, 200,300,300,400);
ReleaseDC(GetDesktopWindow, HD);

Дескриптор контекста рабочего стола HD получен функцией GetWindowDC, в которую в качестве аргумента передан дескриптор окна рабочего стола, возвращаемый функцией GetDesktopWindow. Переменная S содержит выводимый текст, а запись R определяет область, в которую этот текст выводится. Эта область очищается функцией FillRect, в которую в качестве кисти передается кисть, возвращаемая функцией GetStockObject с аргументом WHITE__BRUSH. Функция GetStock-Object возвращает дескриптор одного из предопределенных в Windows инструментов, используемых для изображений: пера, кисти, шрифта. В данном случае для заполнения области требуется кисть. Константа WHITE_BRUSH определяет кисть белого цвета. Посмотрите в справке другие возможные варианты.

Текст в данном примере выводится функцией DrawText. В числе ее флагов заданы DT_CENTER - выравнивание по центру области, и DT_WORDBREAK - перенос длинных текстов на несколько строк. Следующий оператор вызывает функцию Ellipse, рисующую круг. Это сделано просто для демонстрации возможностей рисования. Последний оператор приведенного кода освобождает дескриптор контекста окна рабочего стола.

Приведенный код рассчитан на использование VCL Win32. В приложении VCL .NET он должен быть немного изменен:

var HD: HDC;
S: string;
R: TRect;
HD := GetWindowDC(GetDesktopWindow);
S := 'Идет реорганизация базы данных. Будьте осторожны!';
R := Borland.Vcl.Types.Rect(200,200,300,300);
FillRect(HD,R,GetStockObject(WHITE_BRUSH));
DrawText(HD, S, Length(S), R, DT_CENTER or DT__WORDBREAK);
Ellipse(HD, 2 00,300,300,4 00);
ReleaseDC(GetDesktopWindow, HD);

Первое изменение связано с тем, что без ссылки на пространство имен Borland.Vcl.Types компилятор не найдет функцию Rect. А второе изменение связано с тем, что в VCL .NET функция DrawText принимает не указатель на строку текста, а саму строку.

Если вы реализуете подобные примеры, то увидите, что текст и круг будут нарисованы на поверхности стола. Впрочем, рисование произойдет именно на поверхности стола, если указанная в коде область не закрыта какими-то окнами. А если она закрыта, то текст и фигура будут выведены прямо поверх окна верхнего уровня.

В данном случае для рисования использовались перо, кисть, и шрифт, установленные в Windows. Вы можете изменять эти установки. Например, если в приведенном выше коде вы вставите объявление еще двух переменных:

Pen, PenPrev: HPEN; а перед рисованием круга выполните операторы

Pen := CreatePen(PS_SOLID,4,clRed);
PenPrev := SelectObject(HD,Pen);

то граница круга будет нарисована красной толстой линией. Первый из приведенный операторов создает функцией CreatePen новое перо и задает его характеристики: сплошная линия красного цвета с толщиной 4. Второй оператор активизирует функцией SelectObject это перо и заносит в переменную PenPrev ранее использовавшееся перо. Если вы затем захотите восстановить прежнее перо, то сможете сделать это оператором

SelectObject(HD,PenPrev);

При рисовании и выводе текста рассмотренными способами надо иметь в виду, что ваше изображение исчезнет при любой перерисовке окна.

11.4 Обои рабочего стола || Оглавление || 11.6 Кнопка и меню "Пуск"


Приемы программирования в Delphi на основе VCL



Новости за месяц

  • Апрель
    2020
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 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