15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Рисуем на рабочем столе

Вы можете использовать поверхность рабочего стола для вывода любой графики. Этот способ может понадобится для написания различных напоминалок, показ праздников. Вы можете поселить на рабочем столе забавного персонажа из комикса и многое другое.
Осуществить это можно очень простым способом :

Напишем процедуру для рисования:

procedure TForm1.DeskTopPaint(Sender:Tobject);
var
DeskTop:TCanvas;
begin
DeskTop:=TCanvas.Create;
try
DeskTop.Handle:=GetDC(0);// Получим Handle Рабочего стола

И ВСЕ !!! Далее работаем с DeskTop как с обычным TCanvas.
Например поместим текущую дату :

DeskTop.Brush.Style:=bsClear; // Устанавливаем тип кисти
With DeskTop.Font do // Подбираем шрифт
Begin
Color:=clRed;
Size:=13;
Name:='Times New Roman';
Style:=[fsBold];
end;
DeskTop.TextOut(10,10,'Сегодня : '+DateToStr(Now));
ReleaseDC(0, DeskTop.handle);
finally
DeskTop.Free; // Уберем за собой
end;
DeskTop.Free;
end;

Единственный минус данного способа - другие формы затирают надпись. По этому есть несколько других методов. Это прозрачная форма и помещение изображения вместо бакграунда ( так делают почти все программы календари ). Для смены обоев предусмотрена функция Win32API :

SystemParametersInfo( SPI_SETDESKWALLPAPER, 0, PChar('Path'), SPIF_SENDWININICHANGE );

Где Path - путь к BMP файлу. По умолчанию устанавливает обои 'В центре', а как поставить 'Размножить' я так и не нашел. Если вы захотите убрать обои, то в параметре Path надо указать любой бред, например zzzz. / Только если у вас нет в корне файла с таким именем :) /
При работе часто требуется обновить рабочий стол. Делается это вот такой функцией:

SendMessage(FindWindow ('Progman', 'Program Manager'), WM_COMMAND, $A065, 0);

Функцией FindWindow находим, и получаем handle на нужное окно. Первый параметр - class name / название класса /, а второй - window name / название окна /
SendMessage - функция, для посылания сообщений окну или окнам, вот ее параметры :

SendMessage(
HWND hwnd, // handle на посылаемое окно, его мы нашли функцией FindWindow
UINT uMsg, // сообщение для посылки
WPARAM wParam, // первый и
LPARAM lParam // второй параметры.

В заключении : люди, по чаще смотрите Help по Delphi, особенно полезен файл Win32.hlp. Можно многому научиться :) Исходник данного незатейливого творчества.