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

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

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

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

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

Сообщение GN »

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

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

Сообщение Browny »

Я не думаю, что 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.
Аватара пользователя
GN
новенький
Сообщения: 67
Зарегистрирован: 29.07.2007 07:35:56
Откуда: Казахстан
Контактная информация:

Сообщение GN »

Чтобы работать с WinAPI, что надо подключить в uses?
Аватара пользователя
Browny
новенький
Сообщения: 37
Зарегистрирован: 31.08.2007 10:42:55

Сообщение Browny »

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

Сообщение GN »

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 »

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 »

Вот ещё нашёл 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;
...
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

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

Приведённый Browny пример прекрасно компилируется и работает.
FPC 2.2, Lazarus 0.9.23
Аватара пользователя
GN
новенький
Сообщения: 67
Зарегистрирован: 29.07.2007 07:35:56
Откуда: Казахстан
Контактная информация:

Сообщение GN »

А у меня 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 »

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

Код: Выделить всё

const
  LWA_ALPHA = 2;
  WS_EX_LAYERED = $80000;


и всё заработало :)
Vitaly1976
незнакомец
Сообщения: 1
Зарегистрирован: 03.11.2007 14:27:59

Сообщение Vitaly1976 »

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

Сообщение GN »

Попробуй так:

Код: Выделить всё

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.
AMD
постоялец
Сообщения: 189
Зарегистрирован: 23.01.2008 21:25:25
Откуда: Кишинев

Сообщение AMD »

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;

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

как мне проверить на чем запушена программа и соотвественно выполнить или нет данный кусок кода
Аватара пользователя
B4rr4cuda
энтузиаст
Сообщения: 693
Зарегистрирован: 28.12.2007 06:48:35

Сообщение B4rr4cuda »

{$IFDEF MSWINDOWS}
Код
{$ENDIF}
{$IFDEF UNIX}
код
{$ENDIF}
AMD
постоялец
Сообщения: 189
Зарегистрирован: 23.01.2008 21:25:25
Откуда: Кишинев

Сообщение AMD »

Интересно в линуксе под GTK2 нету такой игры с прозрачностью
Ответить