Win98 e Form semi transparente

Delphi

28/04/2004

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


Nerdex

Nerdex

Curtidas 0

Respostas

Wolverine

Wolverine

28/04/2004

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

end;



GOSTEI 0
Nildo

Nildo

28/04/2004

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


GOSTEI 0
Wolverine

Wolverine

28/04/2004

entao como resolver!


GOSTEI 0
Nildo

Nildo

28/04/2004

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


GOSTEI 0
Cebikyn

Cebikyn

28/04/2004

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).


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

28/04/2004

Colegas,

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


GOSTEI 0
Nildo

Nildo

28/04/2004

Poderia dar mais detalhes Aroldo?


GOSTEI 0
Nerdex

Nerdex

28/04/2004

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...


GOSTEI 0
Nerdex

Nerdex

28/04/2004

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?!


GOSTEI 0
Nerdex

Nerdex

28/04/2004

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...


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

28/04/2004

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.


GOSTEI 0
Cebikyn

Cebikyn

28/04/2004

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.


GOSTEI 0
Nerdex

Nerdex

28/04/2004

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


GOSTEI 0
Cebikyn

Cebikyn

28/04/2004

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.


GOSTEI 0
Cebikyn

Cebikyn

28/04/2004

...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;



GOSTEI 0
Nerdex

Nerdex

28/04/2004

Valew Ceby !!

Funcionou que é uma beleza...

(mas isso pode ser corrigido facilmente manipulando-se as mensagens q o form recebe do Windows)

Dá um look... fiz isto, mas ñ ficou tri... ñ tá repintando(atualizando)

procedure TForm1.Proc(var Msg: TMessage);
begin
Msg.Result:=CallWindowProc(Pointer(GetWindowLong(Form1.Handle, GWL_WNDPROC)),Form1.Handle,Msg.Msg,Msg.WParam,Msg.LParam);
if Msg.Msg=wm_Move then
Form1.Paint;
end;
end;


GOSTEI 0
Chico Gois

Chico Gois

28/04/2004

Veja se isto pode te ajudar


http://www.delphi32.com/vcl/5535/


T+


GOSTEI 0
Nerdex

Nerdex

28/04/2004

Olá FGOIS;

Amigo, ñ é bem este o motivo demonstrado neste projeto que tu me indicou. No caso proposto, o meu objetivo é a semi transparência da janela...
Mas, valeu a tentativa de ajuda....

Agora !!!! CEBY !!!!

Ficou 100¬ ... show mesmo cara !!!, parabéns pela implementação....
Uma vez eu te disse... que tu é fera mesmo cara !!!

valew


GOSTEI 0
POSTAR