Прозрачность формы
Модератор: Модераторы
- GN
- новенький
- Сообщения: 67
- Зарегистрирован: 29.07.2007 07:35:56
- Откуда: Казахстан
- Контактная информация:
Прозрачность формы
Искал на форуме сабж ничего подобного не нашёл.
Гуглил "прозрачная форма Lazarus", аналогично.
Вопрос: Как в Lazarus сделать форму прозрачной?
Гуглил "прозрачная форма Lazarus", аналогично.
Вопрос: Как в Lazarus сделать форму прозрачной?
Я не думаю, что Google в этом поможет. Дело в том, что у Delphi эта функция жёстко завязана на WinAPI, а Lazarus всё же стремится быть мультиплатформенным. Если тебе нужно написать в Lazarus приложение только для Win32, то гугли просто на тему "прозрачная форма WinAPI".
Менять надо предпоследний параметр, от 0 до 255.
Код: Выделить всё
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
- Откуда: Казахстан
- Контактная информация:
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
- Откуда: Казахстан
- Контактная информация:
http://www.delphisources.ru/pages/faq/b ... n2000.html - вот способ. Только на этой строке выходит ошибка - Unit1.pas(52,36) Fatal: Syntax error, ":" expected but ";" found
У кого-нибудь есть работающий способ?
Код: Выделить всё
function SetLayeredWindowAttributes; external 'user32.dll';У кого-нибудь есть работающий способ?
- GN
- новенький
- Сообщения: 67
- Зарегистрирован: 29.07.2007 07:35:56
- Откуда: Казахстан
- Контактная информация:
Вот ещё нашёл 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
- Откуда: Казахстан
- Контактная информация:
А у меня 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
Т.к. в примере 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
- Откуда: Казахстан
- Контактная информация:
Фуф, наконец-то получилось. Просто добавил константы:
и всё заработало
Код: Выделить всё
const
LWA_ALPHA = 2;
WS_EX_LAYERED = $80000; и всё заработало
-
Vitaly1976
- незнакомец
- Сообщения: 1
- Зарегистрирован: 03.11.2007 14:27:59
- GN
- новенький
- Сообщения: 67
- Зарегистрирован: 29.07.2007 07:35:56
- Откуда: Казахстан
- Контактная информация:
Попробуй так:
Код: Выделить всё
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.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;
Код прекрасно работает но хочу кроссплатформеную программу
как мне проверить на чем запушена программа и соотвественно выполнить или нет данный кусок кода
for i:=1 to 255 do
begin
SetLayeredWindowAttributes((Self as TForm).Handle, 0, (256-i), LWA_ALPHA);
end;
Код прекрасно работает но хочу кроссплатформеную программу
как мне проверить на чем запушена программа и соотвественно выполнить или нет данный кусок кода
