Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Рабочий стол
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.07.2007, 19:21
hackan hackan вне форума
Прохожий
 
Регистрация: 17.07.2007
Сообщения: 1
Репутация: 10
Вопрос Объект на рабочем столе на основе PNG

Нужна помощь, подскажите как создать на рабочем столе объект (форму)
на основе PNG файла.
Наподобие того как это реализовано в AveDesk или Rainmeter (нифига непонял в его исходниках).

Нужно отобразить PNG так чтобы его можно было перемещать и создавать на нем индикаторы.

пробовал делать так, но немогу отобразить отдельно TImage.

var h : HWND;
begin h := GetDesktopWindow(); Windows.SetParent(Panel1.Handle, h);
..

Да, желательно чтоб приложение вообще не имело форм, для уменьшения размера.


Заранее спасибо всем кто поможет.
Ответить с цитированием
  #2  
Старый 01.02.2008, 18:58
Dorian Dorian вне форума
Прохожий
 
Регистрация: 26.09.2007
Сообщения: 4
Репутация: 10
По умолчанию

В этом примере показано, как сделать окно с переменной прозрачностью. Для этого понадобится картинка с 32-битным цветом (с альфа-каналом) в формате PNG. Эту картинку загружаю в память и копирую ее в совместимый с экраном контекст. Функция UpdateLayeredWindow будет прорисовывать окно на основе этого контекста.

Совсем необязательно использовать для загрузки картинки сторонние компоненты. Вполне можно попользовать GDI+. Заголовочные файлы GDI+ можно cкачать здесь. Кроме всего прочего GDI+ при загрузке по умолчанию преобразует цветовые компоненты каждого пиксела для работы с прозрачностью и не надо вычислять их ручками по формулам. А размер файла вырастает не сильно - примерно на 25кб (минимум).
Вот примитивный код который выводит на экран окошко с переменной прозрачностью на основе PNG-картинки (32 бит с альфа каналом):

Код:
unit Unit1; 

interface 

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

type 
  TForm1 = class(TForm) 
    procedure FormCreate(Sender: TObject); 
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, 
      Y: Integer); 
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton; 
      Shift: TShiftState; X, Y: Integer); 
    procedure FormDblClick(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
  end; 

var 
  Form1: TForm1; 
  last_pos: TPoint; 
  hbmp: HBITMAP; // Прозрачная картинка 
  backdc: HDC; // Контекст для прозрачной картинки 

implementation 

{$R *.dfm} 

uses GDIPAPI, GDIPOBJ; // Юзаем GDI+ !!! 

procedure TForm1.FormCreate(Sender: TObject); 
var 
  img: TGPBitmap; 
  screendc: HDC; 
  pt1, pt2 : TPoint; 
  sz : TSize; 
  bf : TBlendFunction; 
begin 
  // Убираем рамку окна. Иначе ничего не выйдет. 
  Self.BorderStyle := bsNone; 
  // Делаем окно многослойным 
  if SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or 
  WS_EX_LAYERED) = 0 then ShowMessage(SysErrorMessage(GetLastError)); 
  // Загружаем 32-битный PNG с альфа каналом и получаем его HBITMAP 
  img := TGPBitmap.Create('bluesquare.png',True); 
  with img do begin 
    GetHBITMAP(0,hbmp); 
    Width := GetWidth; 
    Height := GetHeight; 
    Free; 
  end; 
  // Получаем контекст экрана  
  screendc := GetDC(0); 
  // Создаем контекст, совместимый с экраном 
  backdc := CreateCompatibleDC(screendc); 
  // Загружаем в него картинку 
  SelectObject(backdc, hbmp); 
  // Вызываем UpdateLayeredWindow 
  pt1 := Point(Left, Top); 
  pt2 := Point(0,0); 
  sz.cx := Width; 
  sz.cy := Height; 
  with bf do begin 
    BlendOp := AC_SRC_OVER; 
    BlendFlags := 0; 
    SourceConstantAlpha := $FF; // Можно ставить общую прозрачность 
    AlphaFormat := AC_SRC_ALPHA; 
  end; 
  UpdateLayeredWindow(Handle, screendc, @pt1, @sz, backdc, @pt2,0, @bf,ULW_ALPHA); 
  // Освобождаем контекст экрана 
  ReleaseDC(0,screendc); 
end; 

procedure TForm1.FormDestroy(Sender: TObject); 
begin 
  // Освобождаем ресурсы 
  DeleteObject(hbmp); 
  DeleteDC(backdc); 
end; 

// Дальше 2 обработчика нужны, чтобы двигать мышкой форму без заголовка 
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, 
  Y: Integer); 
var 
  cur_pos: TPoint; 
begin 
  if ssLeft in Shift then 
  begin 
    GetCursorPos(cur_pos); 
    Left := cur_pos.X - last_pos.X; 
    Top := cur_pos.Y - last_pos.Y; 
  end; 
end; 

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; 
  Shift: TShiftState; X, Y: Integer); 
begin 
  last_pos.X := X; 
  last_pos.Y := Y; 
end; 

// Закрываем прогу по двойному клику в окошке 
procedure TForm1.FormDblClick(Sender: TObject); 
begin 
  Close; 
end; 

end.

Окошко можно таскать мышой за шиворот. Компоненты на этой форме естественно не прорисуются. Это надо делать по другому.
Ответить с цитированием
  #3  
Старый 02.09.2008, 11:36
Пилот Пилот вне форума
Прохожий
 
Регистрация: 02.09.2008
Сообщения: 1
Репутация: 10
По умолчанию

всем привет, скажите, а как сделать чтобы в на экране висела анимашка? такое возможно?
Ответить с цитированием
  #4  
Старый 27.11.2008, 16:47
Аватар для pas
pas pas вне форума
Прохожий
 
Регистрация: 05.10.2008
Адрес: Узбекистан
Сообщения: 21
Репутация: 10
По умолчанию

А по другому это как??????
__________________
Все пpогpаммы являются веpсиями пеpвой и сохpаняют глюки в
целях совместимости.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:27.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter