2008-12-08 9 views
5

He creado un clon de exposición para Vista que algunas veces necesita restaurar una ventana minimizada. He logrado hacer esto con la función SetWindowPlacement. El problema es que esto también repinta la ventana que se ve como basura después de que la ventana se deslizó suavemente en la pantalla.Cómo restablecer la ventana minimizada sin parpadeo

Este es el código que utilizo para traer una ventana a la parte superior y darle el foco:

private static void ActivateWindow(IntPtr windowToShow) 
    { 
     RectAPI r = new RectAPI(); 
     Win32.GetWindowRect(windowToShow, ref r); 

     if (r.top == -32000) //r.top is -32000 if the window is in minimized state 
     { 
      WINDOWPLACEMENT wp = new WINDOWPLACEMENT(); 
      Win32.GetWindowPlacement(windowToShow, ref wp); 

      if (wp.flags == WindowPlacementFlags.WPF_RESTORETOMAXIMIZED) 
       wp.showCmd = cmdShow.SW_SHOWMAXIMIZED; 
      else 
       wp.showCmd = cmdShow.SW_RESTORE; 

      Win32.SetWindowPlacement(windowToShow, ref wp); 
     } 

     Win32.SetForegroundWindow(windowToShow); 
    } 

si lo uso en una ventana que ya está restaurado sólo llamará SetForegroundWindow y la ventana obtendrá a la parte superior del orden z y obtén el foco sin ningún parpadeo.

Pero si lo llamo en una ventana minimizada también tengo que usar SetWindowPlacement para traer de vuelta la ventana al estado restaurado. Esto es lo que hace que la ventana se repinte y parpadee:/

Tiene que haber una manera de restaurar una ventana minimizada sin el parpadeo porque el administrador de ventanas incorporado hace esto.

Respuesta

2

Una forma de hacerlo es usar la técnica de doble amortiguación: pintar en un mapa de bits fuera de la pantalla, luego restaurar y luego ajustar el mapa de bits a la pantalla. Pero parece exagerado si la restauración de una ventana minimizada es el único escenario donde se necesita. ¿Quizás otros tendrán mejores ideas? ...

Además, si pinta toda el área del cliente de la ventana, puede deshabilitar WM_ERASEBKGND (o más bien, digamos que lo procesó pero no hacer nada) para evitar rellenar innecesariamente secuencia de fondo-luego-redibujar.

1

This link en MSDN explicarán cómo le gustaría manejar la pintura de ventana en su caso. Los eventos de ventana como la actualización de la ventana o minimizar/maximizar requerirán el repintado de su ventana o una región de la ventana.

Happy Coding !!

0

Soy OP ... accidentalmente comí mi galleta.

Estudié cómo Windows flip3d y la barra de tareas logran esto un poco más cerca y en realidad vuelven a pintar la ventana antes de comienzan la animación del pulgar. Intenta minimizar una ventana y luego restaurarla con flip3d, verás un pequeño parpadeo en la ventana 3d antes de que se restaure.

Probé lo mismo con mi aplicación y se ve mucho mejor, no perfecto pero aceptable:/

Cuestiones relacionadas