2009-02-22 11 views
14

No estoy hablando de la función de vidrio de vista, ya sé cómo lograr eso. La característica de la que estoy hablando es agregar controles a la barra de título, como hace Office 2007 con el logotipo y la barra de herramientas.Aplicaciones Chrome Style C#?

Respuesta

22

Necesita hacer algo de interoperabilidad de Win32 para lograr ese efecto. Dependiendo de si está utilizando Winforms o WPF, la forma en que se conecta al procesamiento del mensaje difiere (no recuerdo las formas de Winforms, así que daré todos los ejemplos para WPF). Pero en ambos casos, necesita:

  1. Interceptar la creación de la ventana y modificar los estilos de ventana y estilos extendidos. En WPF necesita heredar desde HwndSource y modificar el HwndSourceParameters para lograr esto. Necesita WS_OVERLAPPEDWINDOW, WS_CLIPSIBLINGS y WS_VISIBLE para el estilo normal y estilos extendidos WS_EX_WINDOWEDGE y WS_EX_APPWINDOW.

  2. Agregue un controlador de mensajes a través de los parámetros de HwndSource HwndSourceHook.

  3. En el proc mensaje añade a través del gancho en el paso dos, es necesario procesar varios mensajes:

    • WM_NCACTIVATE - para cambiar el cuadro del título cuando se activa la aplicación o no
    • WM_NCCALCSIZE - para volver al sistema operativo que no tiene áreas que no son clientes
    • WM_NCPAINT - en general que necesita para invaldate la rect ventana sólo aquí, el WPF se hará cargo de la pintura real)
    • WM_NCHITTEST - para procesar el movimiento de la ventana, minimizando y maximizando.
  4. Una vez que haga lo anterior, su área de cliente donde WPF va a pintar su árbol visual abarcará toda el área de la ventana. Tendrá que agregar las imágenes "no cliet" para que su aplicación se vea como una aplicación normal para el usuario.

  5. Es posible que tenga varios más mensajes:

    • WM_THEMECHANGED si desea cambiar su pintura zona de "no cliente" para ser coherente con el tema OS
    • WM_DWMCOMPOSITIONCHANGED si desea ampliar el vidrio y obtenga la pintura de vidrio NC estándar del sistema operativo cuando el vidrio esté habilitado y cambie a su lógica personalizada cuando el vidrio no lo esté.
  6. Es posible que desee mirar a las API de Win32 del tema si se quiere ir a buscar los activos Win32 estándar para las fronteras, subtítulo, cierre, mininmize y maximizar botones para utilizar en su área 'no cliente".

  7. Si desea ampliar de cristal en la ventana, se puede ver en:

    • DwmExtendFrameIntoClientArea - para obtener el vidrio estándar NC-área
    • DwmDefWindowProc - para obtener el gestor de escritorio para pintar Vidrio y los controles NC estándar
    • DwmIsCompositionEnabled - para determinar si Glass está habilitado; puede usar las dos API anteriores solo cuando Glass esté habilitado. Si Glass no está habilitado, debe hacer su propio dibujo del área NC.

Puede encontrar las definiciones adecuadas de C# de todos los mensajes, estilos y correspondientes API de Win32 que necesita en P/Invoke.

También podría lograr un efecto similar mediante el uso de la ventana estándar de WPF con un WindowStyle=none. Sin embargo, habrá algunas diferencias entre el comportamiento del escritorio hacia su aplicación y otras aplicaciones; Lo más obvio de ellos es que no podrás apilar ni colocar mosaicos en tu ventana haciendo clic con el botón derecho en la barra de tareas.

También puede buscar en algunos componentes de terceros que permiten algunas de estas funcionalidades. No he usado ninguno (como puede ver, no le tengo miedo a la interoperabilidad de Win32 :-)), así que no puedo recomendarlo en particular.

+0

Not really. Estaba pensando en escribir uno, pero nunca lo hice, con el bebé de 5 meses en la casa y todo eso ... :-) –

2

He utilizado el conjunto de control DotNetBar con mucho éxito.

8

Como menciona Franci, lo que quiere es DwmExtendFrameIntoClientArea. Aquí hay un ejemplo de Codeproject que muestra cómo hacerlo.

http://www.codeproject.com/KB/dialog/AeroNonClientAreaButtons.aspx

+1

Tenga en cuenta que cuando Glass está apagado, por ejemplo, bajo TS o cuando el usuario cambia a Vista básica, DwmExtendFrameIntoClientAre no va a funcionar. –

8

Joe Castro, un desarrollador de equipo de producto WPF, tiene una galería de código de proyecto de MSDN llamado "WPF Chrome" que se puede utilizar para crear una oficina 2007-como interfaz de usuario (por ejemplo: controles que abarcan tanto el cliente y áreas no cliente de una ventana).

Encuéntrelo aquí: http://code.msdn.microsoft.com/chrome

+0

impresionante ~~~~~~~~~~~~~~! –

Cuestiones relacionadas