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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.04.2012, 23:17   #1
Dancewithevil
Пользователь
 
Регистрация: 14.03.2010
Сообщений: 18
По умолчанию Как скрыть форму, но оставить компоненты на PNG-рисунке?

Доброго времени суток, ребята. У меня есть один вопрос к вам, знаю что на форуме это неоднократно обсуждалось, но нужного я так не нашёл. Вообщем, у меня есть исходный код, который вместо формы грузит png с поддержкой альфа-каналов, всё было бы замечательно, если бы компоненты(едиты,батоны) с формы были видимы и поверх рисунка. Привожу вам код:
Код:
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.
Прошу вас помочь с тем, чтобы появилась возможность добавлять компоненты на чудную png с тенью. Заранее спасибо вам за ответы, я надеюсь, что правильно изъяснил свой вопрос.

Последний раз редактировалось Dancewithevil; 30.04.2012 в 23:20.
Dancewithevil вне форума Ответить с цитированием
Старый 08.04.2016, 21:41   #2
ibn sinab
 
Регистрация: 16.01.2012
Сообщений: 5
Радость когдато делал похожее

используй pngbutton
Вложения
Тип файла: zip 123.zip (740.0 Кб, 15 просмотров)
ibn sinab вне форума Ответить с цитированием
Старый 08.04.2016, 22:06   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

ibn sinab, Что за ехе в архиве и с какой целью выложили?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 10.04.2016, 14:53   #4
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Цитата:
Сообщение от Dancewithevil Посмотреть сообщение
Доброго времени суток, ребята. У меня есть один вопрос к вам, знаю что на форуме это неоднократно обсуждалось, но нужного я так не нашёл. Вообщем, у меня есть исходный код, который вместо формы грузит png с поддержкой альфа-каналов, всё было бы замечательно, если бы компоненты(едиты,батоны) с формы были видимы и поверх рисунка.
Типа такого?
Вложения
Тип файла: zip Project3.zip (549.1 Кб, 15 просмотров)
kropotkina-alice вне форума Ответить с цитированием
Старый 10.04.2016, 14:55   #5
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Цитата:
Сообщение от Dancewithevil Посмотреть сообщение
Прошу вас помочь с тем, чтобы появилась возможность добавлять компоненты на чудную png с тенью. Заранее спасибо вам за ответы, я надеюсь, что правильно изъяснил свой вопрос.
Отрисовка теней у компонентов в целом:
Код:
procedure ShadeIt(f: TForm; c: TControl; Width: Integer; Color: TColor);
var
rect: TRect;
old: TColor;
begin
if (c.Visible) then
begin
rect := c.BoundsRect; 
rect.Left := rect.Left + Width;
rect.Top := rect.Top + Width; 
rect.Right := rect.Right + Width;
rect.Bottom := rect.Bottom + Width;
old := f.Canvas.Brush.Color;
f.Canvas.Brush.Color := Color;
f.Canvas.fillrect(rect);
f.Canvas.Brush.Color := old;
end;
end;

procedure TForm1.FormPaint(Sender: TObject);
var
i: Integer;
begin
for i := 0 to Self.ControlCount - 1 do
ShadeIt(Self, Self.Controls[i], 5, clBlack);
end;
kropotkina-alice вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как скрыть форму в иконку около часов? juan666777 Общие вопросы Delphi 4 18.04.2010 13:50
Можно ли оставить компоненты на форме не прозраными, если форма прозрачна? pro100-delphi Общие вопросы Delphi 3 27.12.2009 13:42
Как скрыть главную форму сразу при запуске программы SibBear Общие вопросы Delphi 15 19.03.2009 23:50
как скрыть форму? kos1nus Помощь студентам 4 08.12.2008 22:46
Как скрыть форму Михаил Юрьевич Общие вопросы Delphi 2 01.06.2008 15:37