2010-10-15 9 views
7

¿Es posible hacer ventanas flotantes en Visual Studio 2010 semitransparentes? Me gustaría poder flotar una ventana del editor y reducir el nivel alfa en ella. ¿Se podría crear esta funcionalidad con una extensión que modifique la ventana del editor de stock?Visual Studio 2010 - Ventanas flotantes semitransparentes

Si no es una extensión, ¿hay aplicaciones decentes de terceros que sean capaces de modificar las propiedades de ventanas secundarias específicas en Visual Studio 2010?

Respuesta

0

¿Has echado un vistazo Visual Studio Color Theme Editor? Si no hace lo que necesita, puede solicitar la función al autor.

+1

He usado esta extensión y no parece ofrecer nada parecido a la transparencia de lo que puedo decir. –

5

El principal problema es que depende de la ventana de la herramienta, porque Visual Studio no exige mucho sobre cómo se renderiza realmente la ventana de la herramienta.

Si la ventana de herramientas tiene un HNWD para jugar, puede establecer la transparencia con la función SetLayeredWindowAttributes. Si la ventana de la herramienta es WPF, puede usar otros trucos.

Ahora, el problema es conseguir algo útil ... Simplemente ejecute SPY ++ sobre Visual Studio 2010 y verá que no hay muchos HWND visibles. Algunos paquetes usan código no administrado, algunos paquetes usan .NET + Winforms, y cada vez más, los paquetes recientes usan .NET + WPF.

UISpy (otra herramienta de espionaje, pero basada en UI Automation) ve todas las ventanas de herramientas pero no muestra ningún identificador nativo de ventanas (una de las propiedades estándar que la automatización de la interfaz de usuario puede leer) que no es una buena noticia.

Visual Studio usa la interfaz IVsWindowPane y específicamente el método CreatePaneWindow para crear la ventana de host, pero no hay nada oficial para recuperar el control de HWND.

Hmm! Si desea modificar una ventana de herramienta específica, podemos tener una visión más profunda, pero creo que es difícil escribir una herramienta 100% genérica.

EDIT: He buscado más. Aquí es un código que enumera todos los marcos de las ventanas (fijo o flotante) de la instancia actual de Visual Studio:

// WindowFrame needs Microsoft.VisualStudio.Platform.WindowManagement.dll 
public static IEnumerable<WindowFrame> EnumWindowFrames(Microsoft.VisualStudio.OLE.Interop.IServiceProvider sp, __WindowFrameTypeFlags frameTypes) 
{ 
    if (sp == null) 
     throw new ArgumentNullException("sp"); 

    ServiceProvider serviceProvider = new ServiceProvider(sp); 
    IVsUIShell4 shell = (IVsUIShell4)serviceProvider.GetService(typeof(SVsUIShell)); // VS 2010 only 

    IEnumWindowFrames framesEnum; 
    IVsWindowFrame[] frames = new IVsWindowFrame[1]; 
    uint numFrames; 
    shell.GetWindowEnum((uint)frameTypes, out framesEnum); 
    if (framesEnum == null) 
     yield break; 

    while ((framesEnum.Next(1, frames, out numFrames) == VSConstants.S_OK) && (numFrames == 1)) 
    { 
     WindowFrame frame = frames[0] as WindowFrame; 
     if (frame != null) 
      yield return frame; 
    } 
} 

Esto le dará una lista de instancias WindowFrame. WindowFrame no está documentado pero es público (ubicado en Microsoft.VisualStudio.Platform.WindowManagement.dll), por lo que puede jugar con él. Cada instancia de WindowFrame tiene una propiedad FrameView que tiene una propiedad Content. Esta propiedad de contenido es, la mayoría de las veces de mis hallazgos, un elemento del Panel de WPF. La jerarquía debajo de ese panel dependerá de cómo se implemente realmente la ventana.

Si se trata de un Winforms o un formulario no administrado (por ejemplo, el editor .SQL), habrá un HwndHost en la colección secundaria del panel. He tratado de jugar con él (usando SetLayeredWindowAttributes), pero parece que no funciona ...

Si se trata de un WPF (por ejemplo, el nuevo editor C#/VB), habrá una enorme jerarquía de WPF, eso eventualmente se reducirá a una implementación de IWfpTextView. Puede cambiar muchas cosas en esta jerarquía, y algunas funcionarán (como la propiedad Background), pero ... con respecto a la transparencia, no creo que sea posible porque la ventana raíz no lo permite (tiene AllowTransparency establecido a falso, y no se puede cambiar una vez que se muestra). Establecer Opacidad = 0.5 por ejemplo funciona, pero como no hay transparencia, el efecto es solo ventanas atenuadas ...

+0

Como dicen las preguntas, la preocupación es sobre el documento (editor) de Windows. Esta es también la razón por la que he comenzado a recibir una recompensa, ya que resolver esto probablemente me permita resolver mi problema en http://stackoverflow.com/questions/4880186/visual-studio-2010-addin-which-makes- floating-window-no-topmost – Suma

+0

He descargado UIA Verify y lo he usado para inspeccionar las propiedades de la ventana flotante del documento. Para mi sorpresa, la herramienta muestra el WindowPattern.Current.IsTopmost como falso. En cuanto a la transparencia, no encontré nada relacionado con ella. He hecho algo de desarrollo de MFC en el pasado, pero no WPF y no sé qué buscar. – Suma

+0

@Suma - No creo que la transparencia sea posible (ver mi edición). Sin embargo, algunas cosas son posibles, como por ejemplo automatizar el posicionamiento de los marcos. –