Fórum Win98 e Form semi transparente #228504

28/04/2004

0

Tem como? tipo AlphaBlend que é compatível somente para o Win2000 e XP...


Nerdex

Nerdex

Responder

Posts

28/04/2004

Wolverine

tipo assim
procedure TForm1.FormShow(Sender: TObject);
begin
  Brush.Style := BsClear;

end;



Responder

Gostei + 0

28/04/2004

Nildo

Ele quer semi transparencia. O código que você mostrou é form 100¬ transparente


Responder

Gostei + 0

28/04/2004

Wolverine

entao como resolver!


Responder

Gostei + 0

28/04/2004

Nildo

Não dá, este recurso só é válido para o Windows XP em diante


Responder

Gostei + 0

28/04/2004

Cebikyn

Dá sim. É só brigar um pouco com a função Windows.AlphaBlend (notar que não se refere à propriedade do form, é uma função que funciona em Win98) e combinar com a imagem do form. Só que tem o grande problema de que o form deve ser uma única imagem (basicamente, apenas botões e imagens, e os OnClick´s devem ser recebidos no OnClick do form).


Responder

Gostei + 0

28/04/2004

Aroldo Zanela

Colegas,

O caminho mais curto para isto é com a Jedi VCL.


Responder

Gostei + 0

29/04/2004

Nildo

Poderia dar mais detalhes Aroldo?


Responder

Gostei + 0

29/04/2004

Nerdex

Cebikyn;

Pode demonstrar com código o Windows.AlfaBlend, para o caso?
Ñ entendi este aspecto: ´o form deve ser uma única imagem´

Assim evitaremos de ter que instalar um trem de componentes:
VCL Jedi já obsoleto...


Responder

Gostei + 0

29/04/2004

Nerdex

Ceby !!

Qual o valor do parâmetro _BLENDFUNCTION que vc especificou?
Estou testando assim:

windows.AlphaBlend(???????,11,12,13,14,15,16,17,19,20,1000);

Nos ???????, não acho o valor correto?!


Responder

Gostei + 0

29/04/2004

Nerdex

procedure TForm1.Button1Click(Sender: TObject);
var Blend: _BLENDFUNCTION;
begin
with Blend do
begin
BlendOp:=AC_SRC_OVER;
BlendFlags:=0;
SourceConstantAlpha:=100;
AlphaFormat:=0;
end;
Windows.AlphaBlend(Form1.Handle,0,0,20,20,Panel1.Handle,0,0,20,20,Blend);
end;

Dá uma olhada..., mas não obtive sucesso...


Responder

Gostei + 0

29/04/2004

Aroldo Zanela

Poderia dar mais detalhes Aroldo?

Nildo,

A Jedi VCL possui uma paleta de componentes (jvForms) que permite vários recursos para transparências de form, que funcionam inclusive no Windows 98.


Responder

Gostei + 0

30/04/2004

Cebikyn

Dá uma olhada..., mas não obtive sucesso...


Vc tem que obter a imagem do form (para testes, pode ser o conteúdo do canvas mesmo, fará seu form transparente, mas não os componentes) e combinar ela com a imagem do desktop (procura aqui no fórum que vc acha como obte-la) e depois desenhar a imagem obtida no Canvas do form. A noite eu coloco os códigos.


Responder

Gostei + 0

01/05/2004

Nerdex

Fiquei esperando, e já é dia Ceby... hihihi

Põem o código aí... de repente é tri...
... as taxas de atualização são consideráveis... ficam piscando? ...com a movimentação do form? Faz uma força aí e publica, aee...

valew


Responder

Gostei + 0

01/05/2004

Cebikyn

Desculpa a demora, ta aí...

Declaração de variáveis:

var
  Bmp: TBitmap;
  DC: HDC;
  dx, dy: Integer;

OnCreate do Form:

procedure TForm1.FormCreate(Sender: TObject);
begin
  Bmp := TBitmap.Create;
  Bmp.Width := GetSystemMetrics(SM_CXSCREEN);
  Bmp.Height := GetSystemMetrics(SM_CYSCREEN);

  dx := GetSystemMetrics(SM_CXFRAME);
  dy := GetSystemMetrics(SM_CYCAPTION)+GetSystemMetrics(SM_CYFRAME);
end;


OnShow do form:

procedure TForm1.FormShow(Sender: TObject);
begin
  ShowWindow(Handle, SW_HIDE);

  SetActiveWindow(0);

  Sleep(100);

  DC := GetDC(0);
  BitBlt(Bmp.Canvas.Handle, 0, 0,
    GetSystemMetrics(SM_CXSCREEN),
    GetSystemMetrics(SM_CYSCREEN),
    DC, 0, 0, SRCCOPY);
  ReleaseDC(0, DC);

  ShowWindow(Handle, SW_SHOW);
end;


Agora o principal, o OnPaint do form:

procedure TForm1.FormPaint(Sender: TObject);
var
  bf : _BLENDFUNCTION;
begin
  bf.BlendOp := AC_SRC_OVER;
  bf.BlendFlags := 0;
  bf.SourceConstantAlpha := 100;
  bf.AlphaFormat := 0;

  Windows.AlphaBlend(Canvas.Handle, 0,0,ClientWidth,
    ClientHeight,Bmp.Canvas.handle,Left+dx,Top+dy,
    ClientWidth,ClientHeight,bf);
end;


E para finalizar o OnResize e OnDestroy do form:

procedure TForm1.FormResize(Sender: TObject);
begin
  Repaint;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Bmp.Free;
end;

O código funciona, mas precisa de ajustes, tipo: qnd o form é movido, ele não atualiza o fundo (mas isso pode ser corrigido facilmente manipulando-se as mensagens q o form recebe do Windows) e ele fica com flickering (piscando) quando é redimensionado.


Responder

Gostei + 0

01/05/2004

Cebikyn

...qnd o form é movido, ele não atualiza o fundo (mas isso pode ser corrigido facilmente manipulando-se as mensagens q o form recebe do Windows)...


private
  procedure WMMove(var Msg: TWMMove); message WM_MOVE;

[...]

procedure TForm1.WMMove(var Msg: TWMMove);
begin
  inherited;
  Repaint;
end;



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar