2009-05-07 11 views
28

Attualmente sto lavorando su un'applicazione MDI MFC legacy molto grande. Ha un gran numero di elementi dell'interfaccia utente: barre degli strumenti ancorabili, controlli personalizzati, menu contestuali, ecc. È un'applicazione di elaborazione delle immagini in modo che le viste principali vengano visualizzate utilizzando DirectX e OpenGL. Il prodotto ha circa 10 anni e una delle priorità qui è di aggiornarne l'aspetto grafico.Quali sono alcune tecniche per la migrazione di un'applicazione MFC di grandi dimensioni in WPF/.NET?

Sapendo che Microsoft ha svolto un buon lavoro di fornitura dell'interoperabilità tra C++/MFC e .NET ho pensato che avrebbe senso migrare il codice base in modo incrementale. Quello con cui sto combattendo ora è da dove cominciare.

Un approccio è quello di estrarre il framework MFC con WPF e riutilizzare il più possibile il codice C++. Questo ci consentirà di massimizzare i benefici dell'architettura WPF, ma significherà un lungo periodo di sviluppo finché non saremo completamente funzionanti.

Un altro approccio consiste nel sostituire i controlli MFC uno alla volta con le controparti WPF. Questo ci permetterà di lavorare in modo incrementale. La mia preoccupazione per questo approccio è che significa che ci sarà un sacco di punti di connessione tra il codice gestito e non gestito e non sono sicuro da dove iniziare con la sostituzione di cose come il menu principale e le barre degli strumenti.

Oppure c'è un'altra opzione qui che non vedo?

Qualsiasi suggerimento o collegamento a informazioni su questo argomento sarebbe apprezzato.

Aggiornamento: DavidK ha sollevato alcune domande eccellenti, quindi aggiungo le motivazioni alla base.

1) lo sviluppo futuro del prodotto

questo prodotto è ancora attivamente sviluppato con nuove caratteristiche sempre aggiunti su base regolare. Ho pensato che avrebbe molto senso provare a migrare lentamente verso C#/WPF. Nella mia limitata esperienza con C#/WPF ho riscontrato che i guadagni di produttività sono sorprendenti rispetto al lavoro in C++/MFC.

L'altra grande cosa che stiamo ottenendo con WPF è la possibilità di sfruttare i sistemi multi-testa. Le applicazioni MFC sono limitate a un singolo frame di primo livello, rendendo molto difficile sfruttare più monitor.

2) la ritenzione dei dipendenti e il reclutamento

Sta diventando sempre più difficile da trovare gli sviluppatori che sono disposti a lavorare su MFC. È anche importante per lo sviluppo della carriera degli attuali sviluppatori ottenere visibilità sulle nuove tecnologie.

+2

Darei più di un voto, se potessi. –

+1

la migrazione ideale da MFC è di andare con QT; Almeno allora i tuoi attuali sviluppatori non staranno chiedendo a gran voce di sviluppare usando la nuova tecnologia GUI che uscirà tra qualche anno :) – gbjbaanb

+2

Il problema con QT è che si tratta di un passaggio laterale da MFC piuttosto che di un balzo in avanti in termini di tecnologia e guadagni di produttività. Non vedo alcun motivo valido per passare da MFC a QT a meno che non si stia cercando una soluzione multipiattaforma. Per un negozio Windows, quella mossa non avrebbe alcun senso. –

risposta

8

Rivisitare questo perché ho sostituito con successo la nostra interfaccia utente MFC di livello superiore (il frame principale, le finestre e le barre degli strumenti) con WPF.

Come risulta, il nostro codice di disegno principale deve semplicemente essere consegnato a un HWND per il rendering. Ciò ha reso molto semplice riutilizzare la maggior parte della nostra base di codice C++ esistente.

Ecco una breve panoramica sui pezzi chiave dell'approccio ho preso:

  • usate la classe .NET HwndHost di ospitare un HWND per il codice C++ di disegno per rendere in
  • creati involucri C++/CLI per qualsiasi codice C++ nativo che doveva essere esposto al codice UI WPF/C#
  • La maggior parte delle finestre di dialogo MFC rimaneva nel codice C++ nativo. Ciò riduce al minimo la quantità di lavoro necessaria per completare l'interfaccia utente. Le finestre di dialogo MFC possono essere migrate a WPF nel tempo.

Come nota a margine, stiamo utilizzando SandDock e SandRibbon da Divelements e siamo stati molto contenti con loro finora.

2

Ho dovuto fare la stessa cosa in un progetto utilizzando WinForms prima. Avevamo bisogno di migrare il nostro progetto MFC su .NET 1.1 e abbiamo deciso di prendere tutte le funzionalità principali dell'applicazione MFC e scrivere wrapper gestiti su tutti loro. Quindi abbiamo scritto un front-end WinForms e inserito il codice C++ legacy bit per bit. Penso che abbiamo fatto la scelta giusta a lungo termine. Non riesco a immaginare come avremmo fatto se avessimo cercato di preservare il front-end MFC allo stesso tempo.

1

Penso che tu abbia una buona padronanza delle strategie. Si noti che un potenziale punto dolente nella migrazione a WPF è che non tutti i controlli hanno un handle. Questo è, purtroppo, lo scenario di interoperabilità più clamoroso. AFAIK, l'unico modo per interoperare con MFC e WPF è passare attraverso WindowsFormsHost. Il paradigma WPF è anche radicalmente diverso da MFC/WinForms, quindi potrebbero esserci dei problemi di traduzione.

Dato il vostro ampio, ma funzionale, legacy basebase, probabilmente sosterrei il vostro secondo approccio. Inizia con un controllo alla volta e fallo WPF-y. Creare un'interfaccia ben definita tra il nuovo controllo gestito e la base di codice sottostante, quindi lavorare contro tale interfaccia. Se lo fai uno alla volta, lavorerai con un profilo di rischio più basso: la curva di apprendimento del WPF (che è piuttosto ripida, imho).

Mi sembra che sia importante notare che probabilmente suggerirei il precedente approccio se si andasse a WinForms. Il paradigma più vicino e una curva di apprendimento relativamente agevole sarebbe molto più facile da lavorare attraverso tutto-una volta.

+0

Una cosa che ho capito è come ospitare il contenuto WPF in MFC: http://stackoverflow.com/questions/829952/how-do-i-host-wpf-content-in-mfc-applications –

2

FWIW, nel frattempo, è possibile utilizzare il Feature Pack MFC (disponibile con VS2008 SP1) per dare all'app un aspetto di Office 2007 abbastanza rapidamente (è anche possibile aggiungere un nastro se è qualcosa che gli utenti vorrebbero, anche se questo sarebbe più coinvolto.) Ho rinnovato l'interfaccia utente per una vecchia app MFC utilizzando queste nuove classi in un solo giorno e ora, per essere onesti, sembra fantastico, e i miei utenti sono molto contenti (puoi supportare un'intera serie di MS ha optato per il kit di strumenti BCG, ma ce ne sono altri disponibili se si desidera pagare una piccola somma di denaro (ad esempio CodeJock)

So che questo non risponde alla tua domanda ma se è solo le modifiche dell'interfaccia utente che stai cercando potrebbero valere la pena dare un'occhiata.

+0

Questo approccio potrebbe essere utile in quanto darebbe un effetto immediato e dovrebbe darti il ​​tempo di riscrivere correttamente l'app in WPF. – ChrisF

+0

Hai qualche link che spiega come è fatto? Farò qualche ricerca su google, ma sarebbe più facile se avessi un link a portata di mano :). –

+0

Ci sono alcuni esempi eccellenti disponibili qui: http://msdn.microsoft.com/en-us/library/bb983962.aspx tra cui MS Outlook 2007 UI, VS2008 UI, ecc – Rob

3

Non penso che ci sia un modo più semplice che non hai trattato, anche se probabilmente dipenderà un po 'da quanto è ben separata la logica sottostante dal livello dell'interfaccia utente.

Senza voler sembrare negativi: sei sicuro che ne varrà la pena? Se scrivessi una grande applicazione partendo da zero, non inizierei con C++ e MFC ora, ma vedendo dove sei, cosa guadagnerai davvero riscrivendolo? Questo aggiungerà una nuova funzionalità che gli utenti pagheranno? Ci sono utenti che interromperai chi non sarà in grado di eseguire la nuova versione? Non posso fare a meno di sospettare che otterrete un ritorno sull'investimento molto più consistente osservando alcune cose relativamente semplici che potreste fare per migliorare l'aspetto dell'applicazione così com'è. Ad esempio, ha un manifest in stile XP in modo che i controlli comuni abbiano l'aspetto di XP? Trascorrere alcuni giorni ad aggiornare i bit (ad esempio utilizzando le nuove finestre di dialogo dei file di stile) otterrete gran parte del vostro aspetto in un nuovo splendente aspetto? Tieni presente che anche Microsoft Office 2007, il più recente e più brillante, è stato implementato da Microsoft con i normali controlli Win32.

+0

punti eccellente tutto intorno, ho aggiornerò la mia domanda con le motivazioni alla base di questa indagine. –

Problemi correlati