2011-12-28 11 views
5

Ho una libreria che si basa su dati HDC usando le API GDI +. Voglio usarlo in un'applicazione WPF. Ho provato a prendere l'handle dalla classe WindowInteropHelper e passarlo al metodo di libreria che esegue il disegno. Tuttavia fallisce semplicemente perché non è possibile creare Gdi + Graphics da quell'handle.Posso ottenere HDC dalla finestra WPF in modo che possa disegnare con l'API Gdi +?

Ho quindi provato a utilizzare un elemento WinForm nel controllo WindowsFormsHost e utilizzare l'HDC disponibile nell'evento paint del controllo WinForm e ha funzionato correttamente. Quello che voglio sapere è che la stessa cosa può essere fatta per funzionare direttamente su WPF control \ window? C'è un altro modo per ottenere l'HDC dagli elementi WPF su cui è possibile utilizzare le API di disegno GDI?

risposta

6

Se avete la maniglia della finestra (HWND) della finestra del WPF, presumibilmente ottenuto utilizzando la classe WindowInteropHelper, allora si può facilmente ottenere un handle per un contesto di periferica (HDC) per quella finestra.

Ci sono due modi per arrivarci, anche se entrambi alla fine fanno la stessa cosa. Il primo è quello di P/Richiamare le funzioni API GDI + necessarie, ma possiamo escluderlo abbastanza rapidamente perché richiede un inutile dispendio di tempo. Ricorda che .NET Framework racchiude già tutte queste risorse per lo sviluppo di WinForms nello System.Drawing namespace e, in particolare, nello Graphics class. Quindi tutto ciò che devi fare è aggiungere un riferimento a System.Drawing alla tua applicazione WPF, e avrai tutte queste funzionalità avvolte gratuitamente.

La parte che ti interessa è la Graphics.FromHwnd method, che crea un nuovo oggetto Graphics dall'handle della finestra specificata (HWND).

Una volta che hai questo, si può ottenere un handle per un contesto di periferica (HDC) chiamando il Graphics.GetHdc method, che restituisce esattamente quello che stai dopo-un valore IntPtr che rappresenta un handle per un contesto di periferica.

Ricordare che è necessario chiamare lo Dispose method sull'oggetto Graphics dopo averlo terminato per rilasciare le risorse associate.

+0

Purtroppo questo ora funziona per me – Andreas

Problemi correlati