Прозрачность формы

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Прозрачность формы

Сообщение GN » 21.09.2007 15:50:51

Искал на форуме сабж ничего подобного не нашёл.
Гуглил "прозрачная форма Lazarus", аналогично.

Вопрос: Как в Lazarus сделать форму прозрачной?
Аватара пользователя
GN
новенький
 
Сообщения: 67
Зарегистрирован: 29.07.2007 07:35:56
Откуда: Казахстан

Сообщение Browny » 21.09.2007 16:47:40

Я не думаю, что Google в этом поможет. Дело в том, что у Delphi эта функция жёстко завязана на WinAPI, а Lazarus всё же стремится быть мультиплатформенным. Если тебе нужно написать в Lazarus приложение только для Win32, то гугли просто на тему "прозрачная форма WinAPI".

Код: Выделить всё
SetWindowLong((Self as TForm).Handle, GWL_EXSTYLE, GetWindowLong((Self as TForm).Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
SetLayeredWindowAttributes((Self as TForm).Handle, 0, 200, LWA_ALPHA);


Менять надо предпоследний параметр, от 0 до 255.
Аватара пользователя
Browny
новенький
 
Сообщения: 37
Зарегистрирован: 31.08.2007 10:42:55

Сообщение GN » 21.09.2007 17:35:57

Чтобы работать с WinAPI, что надо подключить в uses?
Аватара пользователя
GN
новенький
 
Сообщения: 67
Зарегистрирован: 29.07.2007 07:35:56
Откуда: Казахстан

Сообщение Browny » 21.09.2007 17:41:02

модуль Windows
Аватара пользователя
Browny
новенький
 
Сообщения: 37
Зарегистрирован: 31.08.2007 10:42:55

Сообщение GN » 21.09.2007 18:24:33

procedure TForm1.FormCreate(Sender: TObject);
begin

SetWindowLong((Self as TForm).Handle, GWL_EXSTYLE, GetWindowLong((Self as TForm).Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
SetLayeredWindowAttributes((Self as TForm).Handle, 0, 200, LWA_ALPHA);

end;


Unit1.pas(83,108) Error: Identifier not found "WS_EX_LAYERED"
Unit1.pas(84,62) Error: Identifier not found "LWA_ALPHA"
Unit1.pas(95) Fatal: There were 2 errors compiling module, stopping
Аватара пользователя
GN
новенький
 
Сообщения: 67
Зарегистрирован: 29.07.2007 07:35:56
Откуда: Казахстан

Сообщение GN » 22.09.2007 15:00:05

http://www.delphisources.ru/pages/faq/b ... n2000.html - вот способ. Только на этой строке
Код: Выделить всё
function SetLayeredWindowAttributes; external 'user32.dll';
выходит ошибка - Unit1.pas(52,36) Fatal: Syntax error, ":" expected but ";" found

У кого-нибудь есть работающий способ?
Аватара пользователя
GN
новенький
 
Сообщения: 67
Зарегистрирован: 29.07.2007 07:35:56
Откуда: Казахстан

Сообщение GN » 22.09.2007 18:22:38

Вот ещё нашёл http://www.interface.ru/borland/npf.htm очень подробно описывается функция SetLayeredWindowAttributes, но компилироваться в Lazarus не хочет, ругается на
Код: Выделить всё
  User32 := SafeLoadLibrary('user32.dll');

Помогите.

Вот что получается:
Код: Выделить всё

type
...
  TSetLayeredWindowAttributes = function (hWnd: HWND; crKey: TColorRef; bAlpha: byte; dwFlags: LongWord): LongBool; stdcall;

const
  LWA_COLORKEY = 1;
  LWA_ALPHA = 2;


procedure TForm1.FormCreate(Sender: TObject);
var
  TransparencyColor: TColorRef;
  Translucency: Byte;
  SetLayeredWindowAttributes: TSetLayeredWindowAttributes;
  USER32: HMODULE;

begin

  TransparencyColor := clBlue;
  Translucency := (255 * 50) div 100;

  User32 := SafeLoadLibrary('user32.dll');
  if User32 <> 0 then
  begin
 
    SetLayeredWindowAttributes := GetProcAddress(User32,
                                  'SetLayeredWindowAttributes');
    if @SetLayeredWindowAttributes <> nil then
      SetLayeredWindowAttributes(Handle, TransparencyColor, Translucency,
      LWA_ALPHA or LWA_COLORKEY);

    FreeLibrary(User32);
   
  end;
...
Аватара пользователя
GN
новенький
 
Сообщения: 67
Зарегистрирован: 29.07.2007 07:35:56
Откуда: Казахстан

Сообщение alexs » 22.09.2007 18:38:01

1.
Константы
WS_EX_LAYERED и LWA_ALPHA находятс в модуле windows, достаточно его просто указать в uses
2.
Функция SetLayeredWindowAttributes находтся там-же
не надо изобретать ничего с динамической загрузкойю

Приведённый Browny пример прекрасно компилируется и работает.
FPC 2.2, Lazarus 0.9.23
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение GN » 22.09.2007 18:54:54

А у меня Lazarus 0.9.22 может в этом проблема?
Т.к. в примере Browny я указывал в uses "windows" и всё равно выскакивали ошибки:
Unit1.pas(33,108) Error: Identifier not found "WS_EX_LAYERED"
Unit1.pas(34,62) Error: Identifier not found "LWA_ALPHA"
Unit1.pas(43) Fatal: There were 2 errors compiling module, stopping
Аватара пользователя
GN
новенький
 
Сообщения: 67
Зарегистрирован: 29.07.2007 07:35:56
Откуда: Казахстан

Сообщение GN » 22.09.2007 19:11:10

Фуф, наконец-то получилось. Просто добавил константы:

Код: Выделить всё
const
  LWA_ALPHA = 2;
  WS_EX_LAYERED = $80000;


и всё заработало :)
Аватара пользователя
GN
новенький
 
Сообщения: 67
Зарегистрирован: 29.07.2007 07:35:56
Откуда: Казахстан

Сообщение Vitaly1976 » 03.11.2007 15:33:00

Мужики, может кто нить помочь, перешерстил весь форум, только один способ прозрачности увидел, нашел ту же доку по функции SetLayeredWindowAttributes, пример компилиться, но форма все равно непрозрачная
Vitaly1976
незнакомец
 
Сообщения: 1
Зарегистрирован: 03.11.2007 15:27:59

Сообщение GN » 03.11.2007 16:03:35

Попробуй так:
Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
  windows;

type

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
 

implementation

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin

  SetWindowLong((Self as TForm).Handle, GWL_EXSTYLE, GetWindowLong((Self as TForm).Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
  SetLayeredWindowAttributes((Self as TForm).Handle, 0, 100, LWA_ALPHA);
  // Третий параметр отвечает за степень прозрачности. От 0 до 255

end;

initialization
  {$I unit1.lrs}

end.
Аватара пользователя
GN
новенький
 
Сообщения: 67
Зарегистрирован: 29.07.2007 07:35:56
Откуда: Казахстан

Сообщение AMD » 08.03.2008 01:04:03

SetWindowLong((Self as TForm).Handle, GWL_EXSTYLE, GetWindowLong((Self as TForm).Handle, GWL_EXSTYLE) or WS_EX_LAYERED);

for i:=1 to 255 do
begin
SetLayeredWindowAttributes((Self as TForm).Handle, 0, (256-i), LWA_ALPHA);
end;

Код прекрасно работает но хочу кроссплатформеную программу

как мне проверить на чем запушена программа и соотвественно выполнить или нет данный кусок кода
AMD
постоялец
 
Сообщения: 189
Зарегистрирован: 23.01.2008 22:25:25
Откуда: Кишинев

Сообщение B4rr4cuda » 08.03.2008 01:52:12

{$IFDEF MSWINDOWS}
Код
{$ENDIF}
{$IFDEF UNIX}
код
{$ENDIF}
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35

Сообщение AMD » 08.03.2008 14:46:35

Интересно в линуксе под GTK2 нету такой игры с прозрачностью
AMD
постоялец
 
Сообщения: 189
Зарегистрирован: 23.01.2008 22:25:25
Откуда: Кишинев

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 7

Рейтинг@Mail.ru