Win98 e Form semi transparente
Tem como? tipo AlphaBlend que é compatível somente para o Win2000 e XP...
Nerdex
Curtidas 0
Respostas
Wolverine
28/04/2004
tipo assim
procedure TForm1.FormShow(Sender: TObject); begin Brush.Style := BsClear; end;
GOSTEI 0
Nildo
28/04/2004
Ele quer semi transparencia. O código que você mostrou é form 100¬ transparente
GOSTEI 0
Wolverine
28/04/2004
entao como resolver!
GOSTEI 0
Nildo
28/04/2004
Não dá, este recurso só é válido para o Windows XP em diante
GOSTEI 0
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
28/04/2004
Colegas,
O caminho mais curto para isto é com a Jedi VCL.
O caminho mais curto para isto é com a Jedi VCL.
GOSTEI 0
Nildo
28/04/2004
Poderia dar mais detalhes Aroldo?
GOSTEI 0
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...
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
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?!
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
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...
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
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
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
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
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
28/04/2004
Desculpa a demora, ta aí...
Declaração de variáveis:
OnCreate do Form:
OnShow do form:
Agora o principal, o OnPaint do form:
E para finalizar o OnResize e OnDestroy do form:
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.
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
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
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;
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
28/04/2004
Veja se isto pode te ajudar
http://www.delphi32.com/vcl/5535/
T+
http://www.delphi32.com/vcl/5535/
T+
GOSTEI 0
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
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