2009-02-22 11 views
14

Non sto parlando della funzione del vetro panoramico, so già come ottenerlo. La funzione di cui sto parlando è aggiungere controlli alla barra del titolo, come Office 2007 fa con il logo e la barra degli strumenti.Applicazioni di stile C# in Chrome?

risposta

22

È necessario eseguire un po 'di interoperabilità Win32 per ottenere questo effetto. A seconda che tu stia utilizzando Winforms o WPF, il modo in cui ti colleghi all'elaborazione dei messaggi è diverso (non ricordo Winforms, quindi fornirò tutti gli esempi per WPF). Ma in entrambi i casi, è necessario:

  1. Intercettare la creazione della finestra e modificare gli stili di finestra e gli stili estesi. In WPF è necessario ereditare da HwndSource e modificare lo HwndSourceParameters per raggiungere questo obiettivo. Sono necessari WS_OVERLAPPEDWINDOW, WS_CLIPSIBLINGS e WS_VISIBLE per gli stili estesi stile standard e WS_EX_WINDOWEDGE e WS_EX_APPWINDOW.

  2. Aggiungere un gestore di messaggi tramite i parametri HwndSource HwndSourceHook.

  3. Nel proc messaggio aggiunto attraverso il gancio nella fase due, è necessario elaborare diversi messaggi:

    • WM_NCACTIVATE - per cambiare il quadro del titolo quando l'applicazione è attiva o meno
    • WM_NCCALCSIZE - per tornare al sistema operativo che non si dispone di aree non-client
    • WM_NCPAINT - in generale, è necessario invaldate rECT finestra solo qui, il WPF si prenderà cura della pittura reale)
    • WM_NCHITTEST - per elaborare lo spostamento della finestra, riducendo al minimo e massimizzando.
  4. Una volta eseguito quanto sopra, l'area client in cui WPF sta per dipingere l'albero visivo coprirà l'intera area della finestra. Sarà necessario aggiungere le immagini "non-cliet" in modo che l'applicazione assomigli a un'applicazione normale per l'utente.

  5. Potrebbe essere necessario molti più messaggi:

    • WM_THEMECHANGED se si desidera modificare il "non-client" pittura zona di essere coerente con il tema del sistema operativo
    • WM_DWMCOMPOSITIONCHANGED se si desidera estendere vetro e ottenere la verniciatura a vetro standard OS OS quando il vetro è abilitato e passare alla logica personalizzata quando il vetro non lo è.
  6. Si potrebbe desiderare di guardare le API Win32 a tema se si vuole andare a prendere i beni Win32 standard per le frontiere, caption, stretta, mininmize e massimizzare i pulsanti da utilizzare nel settore 'non-client".

  7. Se si desidera estendere Glass nella finestra, si può guardare:

    • DwmExtendFrameIntoClientArea - per ottenere il vetro standard NC-zona
    • DwmDefWindowProc - per ottenere il desktop manager per dipingere Vetro e i comandi NC standard
    • DwmIsCompositionEnabled - per determinare se Glass è abilitato; puoi utilizzare le due API precedenti solo quando Glass è abilitato. Se Glass non è abilitato, è necessario eseguire il proprio disegno dell'area NC.

Si possono trovare delle definizioni appropriate C# di tutti i messaggi, stili e corrispondenti API Win32 che vi serve sul P/Invoke.

È inoltre possibile ottenere risultati simili utilizzando la finestra standard WPF con WindowStyle=none. Tuttavia, ci saranno alcune differenze tra il comportamento del desktop verso la tua app e altre app; il più ovvio è che non sarà possibile impilare o affiancare la finestra facendo clic con il tasto destro sulla barra delle applicazioni.

È anche possibile esaminare alcuni componenti di terze parti che abilitano alcune di queste funzionalità. Non ne ho usato nessuno (come potete vedere, non ho paura dell'interop di Win32 :-)), quindi non posso raccomandarvi alcun particolare.

+0

Non proprio. Stavo pensando di scriverne uno, ma non ci sono mai riuscito, cosa con il bambino di 5 mesi in casa e quant'altro ... :-) –

2

Ho usato con successo la suite di controllo DotNetBar.

8

Come Franci menziona, quello che vuoi è DwmExtendFrameIntoClientArea. Ecco un esempio di Codeproject che mostra come farlo.

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

+1

Si noti che quando Glass viene spento, ad esempio sotto TS o quando l'utente passa a Vista basic, DwmExtendFrameIntoClientAre non funzionerà. –

8

Joe Castro, un WPF team di prodotto di sviluppo, ha un progetto galleria codice di MSDN chiamato "WPF Chrome" che può essere utilizzato per creare un ufficio 2007 come interfaccia utente (ad esempio: i controlli che abbracciano sia il cliente e aree non client di una finestra).

Trova qui: http://code.msdn.microsoft.com/chrome

+0

fantastico ~~~~~~~~~~~~~~! –

Problemi correlati