Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2010, 18:28   #1
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
Печаль Корректное перетаскивание прозрачной формы

Итак суть вопроса такая:
Для того что бы сделать форму прозрачной я использовал:

Form2.Brush.Style := bsClear;
Form2.BorderStyle := bsNone;

Сверху наложил png с альфа каналом, пристроил процедуру перепешения мышью и опробовал на практике... И все бы хорошо если бы не то что форма при перемещении копирует фон под собой и получается вот так:



Вот и возникает вопрос, как от этого избавится? Молю, помогите!
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 25.03.2010, 19:44   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Используйте UpdateLayeredWindows, а не просто накладывайте изображение на окно.
BOBAH13 вне форума Ответить с цитированием
Старый 25.03.2010, 19:51   #3
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Используйте UpdateLayeredWindows, а не просто накладывайте изображение на окно.
а можно поподробнее?

PS и помоему проблема всетаки в форме...
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 25.03.2010, 20:01   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

1. Ваше окно - прямоугольное, что доказывает что канвас не прорисовывается, и копирует то что на HDC экрана.
2. Следуя из первого пункта, вы должны использовать Layered Windows.
3. Поподробнее смотрите MSDN и соответствующую функцию.
BOBAH13 вне форума Ответить с цитированием
Старый 25.03.2010, 20:31   #5
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

Подмогите примером, пожалуйста, не могу я что то заюзать эту функцию...
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 25.03.2010, 20:47   #6
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

BOBAH13, присоединяюсь к просьбе ...
Потрать немного своего времени - дай пример. Ты ведь как-то говорил в этом направлении.
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 27.03.2010, 17:36   #7
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

невероятно, но я смог сам разобраться!

Код:
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('s.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.
вылаживаю код может кому нибуть поможет...
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перетаскивание формы без бордюров dr.Chas Общие вопросы Delphi 4 10.02.2010 23:19
Ограниченное перетаскивание формы Maxs Общие вопросы Delphi 1 24.10.2009 21:05
Перетаскивание формы Nester Общие вопросы Delphi 2 24.07.2009 12:35
Перетаскивание формы. IVANSour Общие вопросы Delphi 2 03.02.2009 22:06
Перетаскивание формы s-force Общие вопросы Delphi 13 07.09.2007 15:38