Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Imagen encima de todo (https://www.clubdelphi.com/foros/showthread.php?t=27064)

orodruin 10-11-2005 18:52:47

Imagen encima de todo
 
Hola, a ver si alguien me puede ayudar. Trabajo sobre Delphi 6.

Tengo un formulario lleno de componentes (Paneles, PageControls, Grids, Edits, etc...) y ahora mi jefe quiere que aparezca encima de todo una imagen con transparencias, tipo cuño. És decir que se vea lo que hay debajo a través de las transparencias de la imagen. Mi problema es situar esta imagen sobre el resto de componentes, ya que poniendola colgando del formulario y haciendo un bringtofront se queda detrás de todo.:rolleyes:

He probado a ponerla en un panel, poniendo éste sobre el resto de componentes y poniéndole el color que tiene el formulario en TransparentColor, pero no funciona.

A ver que se os ocurre. Muchas Gracias

elcigarra 11-11-2005 12:14:05

Porqué no usar regiones
 
Yo que vos pondría el gráfico sobre un panel, crearía una región según este gráfico y se lo asignaría al panel con SetWindowRgn(Panel1.Handle, PanelRegion,False).

Si no se entiende o no sabés como hacer algún paso, avisame que, abundo con algo de código.

yusnerqui 11-11-2005 13:30:52

Me he visto tentado a poner este trozo de código aquí, con él puedo pintar una imágen en cualquir parte de la pantalla encima de cualquier cosa.
Código Delphi [-]
 Var
   A : TCanvas;
begin
  A:= TCanvas.Create;
  A.Handle := GetDC(0);
  A.Draw(Image1.ClientOrigin.X,Image1.ClientOrigin.Y,Image1.Picture.Bitmap);
  A.Free;
end;
No creo que sea la solución pero quizas te de una idea para que sigas investigando, el mayor problema que le veo es que me trabaja bien desde el clic de un boton por ejemplo, pero no he logrado hacer que lo haga automáticamente en un evento del Form.

Claro esta sugerencia es válida si no vas a optar por lo comentado anteriormente, que posiblemente si sea una solución completa, dependiendo de lo complicada que pueda ser la imágen para formar su region correspondiente.
Saludos Yusnerqui

elcigarra 11-11-2005 17:12:06

código
 
No importa demasiado la complejidad excepto que te cree conflictos emocionales torturar un poco al windows;) . Aunque sí utiliza recursos, no me parece que sea demasiado para los PC de hoy. Yo he combinado cientos de transparencias de hasta 1 pixel (para hacer sombras sobre lo de atrás).

Por ejemplo, y ya que estamos y hablando de regiones y transparencias, ¿vieron que espectacular el "spash screen" del acrobat reader 6.0? Ese es un ejemplo de lo astutamente que puede diseñarse un gráfico con regiones transparentes. Bueno, te incluyo algo de código útil para generar una región a partir de cualquier gráfico: Podes sacar la variable de Transparent color y pasarlo en el enunciado de la función si querés que no sea necesariamente el pixel de abajo a la izquierda.

Código Delphi [-]
 
function CreateBmpRgn(ABitmap : TBitmap): HRGN;
var
  TransparentColor : TColor;
  X, Y, W, H : Integer;
  Temp : HRGN;
begin
  W := ABitmap.Width;
  H := ABitmap.Height;
  TransparentColor := ABitmap.Canvas.Pixels[0, H - 1];
  Result := 0;
  for X := 0 To W - 1 do begin
    for Y := 0 To H - 1 do begin
      if ABitmap.Canvas.Pixels[X, Y] <> TransparentColor then begin
        if Result = 0 then 
          Result := CreateRectRgn(X, Y, X + 1, Y + 1) 
        else begin
          Temp := CreateRectRgn(X, Y, X + 1, Y + 1);
          CombineRgn(Result, Result, Temp, RGN_OR);
          DeleteObject(Temp);
        end;
      end;
    end;
  end;
end;

Deberías definirte una variable (Xej PanelRegion) de tipo THandle y luego de:
Código Delphi [-]
 
PanelRegion := CreateBmpRgn(miDibujo);
utilizar la función SetWindowRgn para el panel.

orodruin 14-11-2005 09:32:55

Gracias
 
Muchas gracias por las respuestas. He encontrado un componente que es un panel transparente, pero no acaba de pintar bien sobre los dbgrids. Voy a ver si pruebo vuestras soluciones. Si tuviera algún problema os digo algo.

Gracias de nuevo.


La franja horaria es GMT +2. Ahora son las 15:50:20.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi