Una solución que viene a la mente es usar dos ventanas superpuestas una encima de la otra. Renderice la ventana "inferior" al 50% de opacidad y luego el propietario dibuje su texto en una ventana superpuesta encima de la otra. Si está haciendo pantallas de tipo lable, esto puede ser simple, pero puede complicarse rápidamente si necesita mucha información del usuario que luego podría filtrarse a través de la ventana "principal" o "inferior".
Por lo tanto, tengo que funcionar, pero es un poco ardilla. La solución de dos ventanas parecía prometedora hasta que descubrí que .Net o Win32 hacen alguna crianza auto parental extraña incluso cuando se refieren implícitamente a ella. Probablemente tiene que ver con la forma en que se bombean los mensajes. El padre principal contiene el mensaje de la aplicación pump y el int guess es implícitamente el padre ...
intenté un montón de soluciones provisionales pero esta cosa del temporizador de abajo funcionó mejor. En cualquier caso, podría ser una pista en cuanto a hacerlo mejor ...
// the "main" or transparent window. Notice it just sets and runs the timer
using System;
using System.Windows.Forms;
namespace TransparencyPlusNottransparentTest
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void timer1_Tick(object sender, EventArgs e)
{
Program.ShowNontransparency();
}
}
}
// la ventana transparente "arriba" o no. Observe que el propietario dibuja en
// fondo transparente. Los ajustes de tiempo de diseño también están sin borde, etc.
usando System.Drawing;
usando System.Windows.Forms;
espacio de nombres TransparencyPlusNottransparentTest
{
FormTop clase parcial pública: Formulario
{
FormTop pública() {
InitializeComponent();
BackColor = Color.Firebrick;
TransparencyKey = Color.Firebrick;
}
private void FormTop_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawString("Hello Whirrled!", new Font("Tahoma", 14f), Brushes.Black, 10f, 10f);
}
}
}
// El control de todo este rollo. Crea una instancia de ambas ventanas,
// establece la principal como la ventana principal de la aplicación y aloja el
// método hacky público para forzar que la ventana no transparente aparezca en la parte superior
// y offset para que no oscurezca la parte superior de la ventana principal.
usando el sistema;
usando System.Drawing;
usando System.Windows.Formularios;
espacio de nombres TransparencyPlusNottransparentTest
{
Programa de clase estática
{
privada estática FormMain _formMain;
private static FormTop _formTop;
const int privado XY_OFFSET = 30;
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
_formTop = new FormTop();
_formTop.Show(null);
_formMain = new FormMain();
Application.Run(_formMain);
}
public static void ShowNontransparency()
{
_formTop.Location =
new Point(
_formMain.Location.X + XY_OFFSET,
_formMain.Location.Y + XY_OFFSET);
_formTop.BringToFront();
}
}
}
Este no es el mismo, lo que dice es que cuando se dibuja cualquier color que esta clave se establece, se mostrará lo más transparente, lo que significa 0% Opaco (o totalmente transparente dependiendo de si eres un tipo medio lleno). No le permite configurarlo con un 50% de transparencia. – esac
OK. Gracias por la actualización. Tienes razón, por supuesto. TransparencyKey solo funcionará si desea que sea 100% transparente. (Soy un tipo medio lleno). – David