Ir al contenido


Foto

Label Transparente?


  • Por favor identifícate para responder
8 respuestas en este tema

#1 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 mensajes
  • LocationLima-Peru

Escrito 06 julio 2011 - 10:54

Bueno ahora mas sobre imagenes, ocurre que tengo mi form transparente, gracias a esta funcion o utilidad que me sirve de maravillas.


delphi
  1. procedure TForm2.MakeTransparent;
  2. var
  3.   AControl: TControl;
  4.   A, Margin, X, Y, CtlX, CtlY: Integer;
  5. begin
  6.   Margin    := (Width - ClientWidth) div 2;
  7.   FullRgn  := CreateRectRgn(0, 0, Width, Height);
  8.   X        := Margin;
  9.   Y        := Height - ClientHeight - Margin;
  10.   ClientRgn := CreateRectRgn(X, Y, X + ClientWidth, Y + ClientHeight);
  11.   CombineRgn(FullRgn, FullRgn, ClientRgn, RGN_DIFF);
  12.   for A := 0 to ControlCount - 1 do
  13.   begin
  14.     AControl := Controls[A];
  15.     if (AControl is TWinControl) or (AControl is TGraphicControl) then with AControl do
  16.       begin
  17.         if Visible then
  18.         begin
  19.           CtlX  := X + Left;
  20.           CtlY  := Y + Top;
  21.           CtlRgn := CreateRectRgn(CtlX, CtlY, CtlX + Width, CtlY + Height);
  22.           CombineRgn(FullRgn, FullRgn, CtlRgn, RGN_OR);
  23.         end;
  24.       end;
  25.   end;
  26.   SetWindowRgn(Handle, FullRgn, True);
  27. end;


Esta función que todo mi form sea transparente excepto los controles, ahora lo que quiero es poner un label sobre este form y que el label tenga un form transparente. ya que cuando introduzco el label me sale algo así

2011-07-07_000413.png

Como puedo hacer q mi componente sea transparente al igual q mi form.
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.242 mensajes
  • LocationMéxico

Escrito 06 julio 2011 - 11:09

Hola

No se que versión de Delphi tienes pero en mi Turbo Delphi (2006) el label tiene una propiedad llamada Transparent y hace lo que quieres

Salud OS

PD; Ya vi, tienes Delphi7  ^o|

Archivos adjuntos


  • 0

#3 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 mensajes
  • LocationLima-Peru

Escrito 07 julio 2011 - 01:03

Si tengo Delphi7, tambien tengo Borland Delphi2009. Probare ahi y vere si la propiedad se mantiene aun cuando haga mi form transparente y os comento.


Edit: Pase mi codigo al Delphi2009 y lamentablemente no funciona la propiedad Transparente del form en el.

:( :cry:
  • 0

#4 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.991 mensajes
  • LocationMadrid - España

Escrito 07 julio 2011 - 01:44

Si tu objetivo es adaptar un TLabel para un SkinForm, tal como parece según este hilo y la respuesta que te dí, la solución no va a pasar por la propiedad Transparent del TLabel, pues su región no va a cambiar. 

Nada te impide hacerlo a bajo nivel pintar directamente en el HDC de una ventana:

Ventana STATIC (Label) a bajo nivel con API:


delphi
  1. hFrame:= CreateWindowEx(WS_EX_LAYERED, 'UPMSG', '',WS_POPUP or WS_THICKFRAME
  2.                           ,X, Y, W, H, HWND_DESKTOP, HMENU(0), hInstance, nil);
  3.  
  4. hLabel:= CreateWindow('STATIC', '', WS_VISIBLE or WS_CHILD
  5.                         ,Margin, Margin, W-Margin*2, H-Margin*2, hFrame, HMENU(0), hInstance, nil);
  6. SetWindowText(hLabel, PCHAR(Msg));
  7. SetLayeredWindowAttributes(hFrame, 0, 200, LWA_ALPHA);
  8. [/delphi]
  9.  
  10. Dibujando Texto:
  11. [delphi]
  12. DrawText(DC, Msg, lstrlen(Msg), Rect, DT_LEFT);

Puedes tener un ejemplo completo de los dos sistemas tanto en delphi como en C/C++ usando API pura, en este hilo: Ventana desplegable translúcida, una alternativa a AnimateWindow.



Saludos.

PD: Si en realidad este hilo es una continuación de Problema con Api UpdateLayeredWindow?, tal vez sea coherente unificarlos. Por el momento lo dejo a tu criterio.


  • 0

#5 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 mensajes
  • LocationLima-Peru

Escrito 07 julio 2011 - 03:01

No entiendo bien...

Sobre los dos post si es el mismo tema, pero visto de ambos lados. Es decir, tengo mi form que es transparente utilizando la api del post anterior, Ahora estoy haciendo un form tal que sea la mascara del anterior pero q sea transparente, excepto sus componentes, pero el problema aqui es el label que quiero q sea transparente pero nose peude ya.

Ahora entiendo lo que me dices creo?



delphi
  1.   //Creamos la fuente, por detalles de lo que significa cada parámetro mira
  2.   Fuente := CreateFont(-12, 0, 0, 0, 400, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,DEFAULT_PITCH + FF_DONTCARE, 'MS Sans Serif');
  3.  
  4.   //Creamos una label
  5.   //lcPosX := CreateWindow( 'Static', 'X:', WS_VISIBLE + WS_CHILD + SS_LEFT, X, Y, W, H, Handle, 0, hInstance, nil );
  6.   lcPosX := CreateWindow( 'Static', 'aqui', WS_VISIBLE or WS_CHILD, X, Y, W, H, Handle, 0, hInstance, nil );
  7.  
  8.  
  9.   SendMessage( lcPosX      , WM_SETFONT , Fuente , lcPosX      );



Ahi tengo i label dentro de mi form, donde estan los controles, ocurre que como este label tiene el handle del form, automaticamente el form es transparente este label ya es transparente por hecho...

Ahora nose si entendi bien, pero me decias sobre dibujar, nose si se peude dibujar sobre este form... xispas o si? no pense en eso..

  • 0

#6 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 07 julio 2011 - 03:21

Yo uso simplemente Form.AlphaBlendValue:= 125; al diseñar el form, o en el form create / OnShow o donde prefieras, y todo lo que el form contiene se hace semi transparente... igual necesitas mas funcionalidad, pero en Delphi7 esto funciona perfectamente.
  • 0

#7 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.991 mensajes
  • LocationMadrid - España

Escrito 07 julio 2011 - 03:57

Ahora nose si entendi bien, pero me decias sobre dibujar, nose si se peude dibujar sobre este form... xispas o si? no pense en eso..


Entiendo que tratas de de realizar lo que te comenté en el  otro hilo, es decir colocar un Form Transparente en el que sólo se vean los controles, encima de una ventana con un bitmap que usa la API UpdateLayeredWindow. En ese caso, el label lo pintas en el DC de la ventana que tiene el Bitmap, no en la de los controles, que anulan las regiones no cubiertas por controles.  ;)



Saludos.


  • 0

#8 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.991 mensajes
  • LocationMadrid - España

Escrito 08 julio 2011 - 04:16


...no logro dibujar el label de tal forma sea transparente pero  se vean las letras y ademas tenga la propiedad de q si pase el mouse  por ahi cambie el icono del moouse y q si se clque salga una web o algo  ....


Te muestro dos ejemplos de como hacerlo usando Bitmap, Máscaras y regiones, similar al ejemplo que hice en el hilo cuya lectura te recomendé: Manejo de imágenes Bitmap estilo Winamp.

Esta vez sólo maneja un Form de forma caprichosa y un label. El Label reacciona al paso del cursor del ratón variando el mismo y al evento OnClick.

El primer ejemplo muestra un Skin para el label, es decir, está dibujado. Esto te puede permitir darle luminosidad y efectos, por ejemplo, al pasar el ratón por encima. Solo tendrías que dibujar los bitmap que te apetezcan siguiendo la filosofía expuesta en Manejo de imágenes Bitmap estilo Winamp.

El segundo ejemplo es mas simple. El label es un TLabel normal, visible, de fondo trasparente, también encastrado en un Form de forma caprichosa.


Espero que obtengas las ideas necesarias para tu proyecto.


Saludos.
  • 0

#9 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 mensajes
  • LocationLima-Peru

Escrito 08 julio 2011 - 09:49

Muchas gracias escafandra sos un grande... :D
  • 0