Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-11-2005
orodruin orodruin is offline
Registrado
 
Registrado: jun 2005
Posts: 3
Poder: 0
orodruin Va por buen camino
Question 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.

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

Última edición por orodruin fecha: 11-11-2005 a las 08:22:08.
Responder Con Cita
  #2  
Antiguo 11-11-2005
elcigarra elcigarra is offline
Miembro
 
Registrado: may 2005
Posts: 269
Poder: 19
elcigarra Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 11-11-2005
Avatar de yusnerqui
yusnerqui yusnerqui is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuba
Posts: 679
Poder: 21
yusnerqui Va por buen camino
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
__________________
Lo importante no es llegar primero, sino saber llegar.

Para que puedas llegar mejor lee la Guia de Estilo

Responder Con Cita
  #4  
Antiguo 11-11-2005
elcigarra elcigarra is offline
Miembro
 
Registrado: may 2005
Posts: 269
Poder: 19
elcigarra Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 14-11-2005
orodruin orodruin is offline
Registrado
 
Registrado: jun 2005
Posts: 3
Poder: 0
orodruin Va por buen camino
Thumbs up 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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 12:04:47.


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
Copyright 1996-2007 Club Delphi