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:
procedure TForm1.WndProc(var Message: TMessage); begin case Message.Msg of WM_SYSCOMMAND: case Message.WParam of SC_MAXIMIZE, SC_MINIMIZE, SC_RESTORE: SetWindowPos(FForm.Handle, 0, Left + GetSystemMetrics(SM_CXFRAME), Top + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME), Width - 2*GetSystemMetrics(SM_CXFRAME), Height - GetSystemMetrics(SM_CYCAPTION) - 2*GetSystemMetrics(SM_CYFRAME), 0); end; WM_CLOSE: FForm.Close; WM_MOVING: SetWindowPos(FForm.Handle, 0, PRECT(Message.lParam).left + GetSystemMetrics(SM_CXFRAME), PRECT(Message.lParam).top + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME), 0, 0, SWP_NOSIZE); WM_SIZING: SetWindowPos(FForm.Handle, 0, PRECT(Message.lParam).left + GetSystemMetrics(SM_CXFRAME), PRECT(Message.lParam).top + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME), PRECT(Message.lParam).Right - PRECT(Message.lParam).Left - 2*GetSystemMetrics(SM_CXFRAME), PRECT(Message.lParam).Bottom - PRECT(Message.lParam).Top - GetSystemMetrics(SM_CYCAPTION) - 2*GetSystemMetrics(SM_CYFRAME), 0); WM_SIZE: if FForm <> nil then SetWindowPos(FForm.Handle, 0, Left + GetSystemMetrics(SM_CXFRAME), Top + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME), Width - 2*GetSystemMetrics(SM_CXFRAME), Height - GetSystemMetrics(SM_CYCAPTION) - 2*GetSystemMetrics(SM_CYFRAME), 0); WM_SETFOCUS: PostMessage(FForm.Handle, WM_SETFOCUS, 0, 0); end; inherited WndProc(Message); end; procedure TForm1.FormCreate(Sender: TObject); begin FForm:= TForm.Create(self); FForm.Left:= Left + GetSystemMetrics(SM_CXFRAME); FForm.Top:= Top + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME); FForm.Width:= Width - 2 * GetSystemMetrics(SM_CXFRAME); FForm.Height:= Height - GetSystemMetrics(SM_CYCAPTION) - 2*GetSystemMetrics(SM_CYFRAME); FForm.BorderStyle:= bsNone; FForm.Show; while ControlCount > 0 do Controls[0].Parent:= FForm; end;
Subo los archivos de ejemplo.
Espero que sea de utilidad y base para desarrollos mas complejos.
Saludos.