Tengo un formulario que tiene algunos controles en sí mismo (btnCreateReport, pnlDarkLayer) .Tengo un panel que se ajusta para formar (Dock = Fill) y está en la parte posterior de todos los controles. Cuando el usuario hace clic en el botón btnCreateReport, llamo al método pnlDarkLayer BringToFront y después de algunos cálculos llamo al método SendToBack() del botón. Quiero dibujar una capa oscura en los controles de formulario y desactivar todos los controles en el formulario. ¿Es posible? Gracias.WinForm Control with Opacity
Tal vez este código u ayuda a entender mi propósito:
private void btnCreateReport_Click(object sender, EventArgs e)
{
pnlDarkLayer.BackColor = Color.FromArgb(100, Color.Gray);
pnlDarkLayer.BringToFront();
btnCreateReport.Enabled = false;
Thread ProcessReport = new Thread(new ThreadStart(ProcessingReport));
ProcessReport.Start();
while (ProcessReport.IsAlive)
{
Application.DoEvents();
}
pnlDarkLayer.SendToBack();
btnCreateReport.Enabled = true;
}
Este código ocultar todos los controles, pero yo no quiero ocultar los controles de la form.I quieren dibujar una capa oscura sobre ellos. Y el usuario debe poder ver los controles. Necesito algo así como la propiedad de opacidad de los formularios para sus controles.
tengo prueba de esto:
pnlDarkLayer.CreateGraphics().CompositingMode=System.Drawing.Drawing2D.CompositingMode.SourceOver;
actualización: Tengo prueba de éste: (utilizar un formulario en lugar de Panel)
private void btnCreateReport_Click(object sender, EventArgs e)
{
btnCreateReport.Enabled = false;
frmProgress ProgressForm = new frmProgress();
ProgressForm.TopLevel = false;
ProgressForm.Parent = this;
ProgressForm.BringToFront();
this.Controls.Add(ProgressForm);
ProgressForm.Show();
Thread ProcessReport = new Thread(new ThreadStart(ProcessingReport));
ProcessReport.Start();
while (ProcessReport.IsAlive)
{
Application.DoEvents();
}
ProgressForm.Close();
btnCreateReport.Enabled = true;
}
pero no puedo ver el ProgressForm en mi forma.
Aparte de todo lo que tenga que ver con la opacidad, * por favor * no utilice ese tipo de bucle llamando a 'DoEvents'. O bien, dale a 'ProcessingReport' algún tipo de gancho para usar para llamar a algún código cuando está terminado, o simplemente coloca el último bit de código al final del método 'ProcessingReport', recordando usar' BeginInvoke' para asegurarte de que se ejecuta en el Hilo de interfaz de usuario. Debería evitar 'Application.DoEvents' en casi todos los casos. –
Entonces, ¿cómo puedo hacer algo después de que el hilo terminó su trabajo? – Saleh
para deshabilitar todos los controles, también puede intentar hacer esto: foreach (elemento de Control en Controles) {item.Enabled = false;} – Reniuz