Ir al contenido


Foto

Como realizar un Form con la barra de título semitransparente en Windows XP


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

#1 escafandra

escafandra

    Advanced Member

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

Escrito 29 septiembre 2011 - 06:24

A raíz de una pregunta realizada en este sentido en CD recordé un artículo que trataba de estos temas. El rendimiento grafico de los ejemplos que propone el autor no me convence, aunque los efectos son muy vistosos. Así me animé a realizar un ejemplo sencillo en delphi.

Se trata de realizar una semitransparencia en la barra de título y borde de un formulario, manteniendo opaco su contenido.

El truco comienza diseñando nuestro formulario como semitransparente con la propiedad  AlphaBlend y su valor. Luego Creamos en tiempo de  ejecución un segundo Form, sin borde, sin Caption y opaco, que colocamos enzima, ocupando  todo el área cliente. Posteriormente cambiamos el Parent de todos los  controles a este nuevo Form. Para que esto funcione debemos reescribir  parte de la función de tratamiento de mensajes del Form original.

El código que realiza el efecto:


delphi
  1. procedure TForm1.WndProc(var Message: TMessage);
  2. begin
  3.   case Message.Msg of
  4.   WM_SYSCOMMAND:
  5.     case Message.WParam of
  6.     SC_MAXIMIZE, SC_MINIMIZE, SC_RESTORE:
  7.       SetWindowPos(FForm.Handle, 0, Left + GetSystemMetrics(SM_CXFRAME),
  8.                   Top + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME),
  9.                   Width - 2*GetSystemMetrics(SM_CXFRAME),
  10.                   Height - GetSystemMetrics(SM_CYCAPTION) - 2*GetSystemMetrics(SM_CYFRAME), 0);
  11.     end;
  12.   WM_CLOSE:
  13.     FForm.Close;
  14.   WM_MOVING:
  15.     SetWindowPos(FForm.Handle, 0, PRECT(Message.lParam).left + GetSystemMetrics(SM_CXFRAME),
  16.                 PRECT(Message.lParam).top + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME), 0, 0, SWP_NOSIZE);
  17.   WM_SIZING:
  18.     SetWindowPos(FForm.Handle, 0, PRECT(Message.lParam).left + GetSystemMetrics(SM_CXFRAME),
  19.                 PRECT(Message.lParam).top + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME),
  20.                 PRECT(Message.lParam).Right - PRECT(Message.lParam).Left - 2*GetSystemMetrics(SM_CXFRAME),
  21.                 PRECT(Message.lParam).Bottom - PRECT(Message.lParam).Top - GetSystemMetrics(SM_CYCAPTION) - 2*GetSystemMetrics(SM_CYFRAME), 0);
  22.   WM_SIZE:
  23.     if FForm <> nil then
  24.       SetWindowPos(FForm.Handle, 0, Left + GetSystemMetrics(SM_CXFRAME),
  25.                     Top + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME),
  26.                     Width - 2*GetSystemMetrics(SM_CXFRAME),
  27.                     Height - GetSystemMetrics(SM_CYCAPTION) - 2*GetSystemMetrics(SM_CYFRAME), 0);
  28.   WM_SETFOCUS:
  29.     PostMessage(FForm.Handle, WM_SETFOCUS, 0, 0);
  30.   end;
  31.   inherited WndProc(Message);
  32. end;
  33.  
  34. procedure TForm1.FormCreate(Sender: TObject);
  35. begin
  36.   FForm:= TForm.Create(self);
  37.   FForm.Left:= Left + GetSystemMetrics(SM_CXFRAME);
  38.   FForm.Top:= Top + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME);
  39.   FForm.Width:= Width - 2 * GetSystemMetrics(SM_CXFRAME);
  40.   FForm.Height:= Height - GetSystemMetrics(SM_CYCAPTION) - 2*GetSystemMetrics(SM_CYFRAME);
  41.   FForm.BorderStyle:= bsNone;
  42.   FForm.Show;
  43.  
  44.   while ControlCount > 0 do
  45.     Controls[0].Parent:= FForm;
  46.  
  47. end;


 
Subo los archivos de ejemplo.

Espero que sea de utilidad y base para desarrollos mas complejos.


Saludos.

  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 29 septiembre 2011 - 06:56

Excelente maestro!!! (y)
  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.187 mensajes
  • LocationMéxico

Escrito 29 septiembre 2011 - 07:48

Muy bueno, primera vez que veo la función GetSystemMetrics

Eso me recuerda que debo estudiar más :)

SaludOS
  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.187 mensajes
  • LocationMéxico

Escrito 29 septiembre 2011 - 12:41

Caray, ya he ejecutado tu ejemplo, que buen "truco" de empalmar otro form encima y que no se note :D.

SaludOS
  • 0

#5 escafandra

escafandra

    Advanced Member

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

Escrito 29 septiembre 2011 - 01:11

Caray, ya he ejecutado tu ejemplo, que buen "truco" de empalmar otro form encima y que no se note .

SaludOS


Bueno, cuando el S.O. no te permite ciertas cosas de forma directa, pues...

Haces trampas.  :cool:



Saludos.
  • 0

#6 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.187 mensajes
  • LocationMéxico

Escrito 29 septiembre 2011 - 01:28


Caray, ya he ejecutado tu ejemplo, que buen "truco" de empalmar otro form encima y que no se note .

SaludOS


Bueno, cuando el S.O. no te permite ciertas cosas de forma directa, pues...

Haces trampas.    :cool:

Saludos.


Lo malo es que esas "trampas" no se me ocurren a mi jajajajajaja y aunque se me ocurrieran, no sabría como implementarlas. Honor a quien honor merece mi estimado escafandra. (y)

SaludOS
  • 0

#7 wilox

wilox

    Newbie

  • Miembros
  • Pip
  • 2 mensajes

Escrito 07 mayo 2012 - 10:39

:lipsrsealed: Sin comentarios, hasta ahora lo probe y maravilloso
  • 0