Domanda

Abbiamo alcune applicazioni in-house costruita in MFC, con disegno OpenGL routine.Tutti usano lo stesso codice per disegnare sullo schermo e la stampa della schermata o salvarlo in un file JPEG.Tutto è lavorato bene in Windows XP, e ho bisogno di trovare un modo per farlo funzionare su Vista.

In tre delle nostre applicazioni, tutto funziona.Nel rimanente, posso ottenere il bordo della finestra, la barra del titolo, i menu e la barra delle applicazioni, ma l'interno non si presenta.Come ho detto, queste applicazioni è possibile utilizzare lo stesso codice per scrivere sullo schermo e catturare l'immagine della finestra, e l'unica differenza che vedo che sembra che potrebbe essere rilevante è che il problema applicazione utilizza MFC interfaccia a documenti multipli, mentre quelli che lavorano utilizzare l'interfaccia a documento singolo.

La risposta non è in rete, o io sono peggio di Google che ho pensato.Ho chiesto sul forum di MSDN, e in pratica l'unico suggerimento che ho avuto è stato quello di utilizzare GDI+, piuttosto che GDI, e che non ha fatto nulla di diverso.Ho provato diverse cose con ogni parte del codice che cattura e stampa o salva, dato un puntatore alla finestra, quindi a quanto pare è una questione di finestra stessa.Non ho ricostruito offendere applicazione che utilizza SDI di sicurezza, e io davvero non ho altre idee.

Qualcuno ha mai visto nulla di simile?


Quello che ho ottenuto è di quattro applicazioni.Usano un sacco di codice comune, e condividere il reale .h e .i file cpp, di cui conosco il disegno e la cattura schermo codice è identico.

C'è un WindowtoDIB() di routine che vuole *pWnd, e un rettangolo di origine e di destinazione e dimensione.Sembra molto leggermente adattato il codice di Microsoft, e ho trovato altre funzioni in questo file sul sito web Microsoft.Dei miei quattro applicazioni, tre di gestire questo bene, ma uno non.La differenza più evidente è che il problema è MDI.

Mi sembra che l' *pWnd è il problema.Io non sono un MFC guru da un lungo tiro, e mi sembra che il problema potrebbe essere che abbiamo una finestra di installazione nel SDIs, e più in MDI.Mi può essere di passaggio sbagliato *pWnd per la funzione.

Nel frattempo, ha iniziato a lavorare correttamente su Vista a 64 bit macchina di prova, anche se ancora non funziona su Vista 32-bit macchina.Non ho idea del perché.Non ho cambiato nulla dopo l'ultimo test, e io non credo che chiunque altro aveva.(La versione a 32 bit, il tasto Print Screen funziona come previsto, ma non salvare la schermata come JPEG.)

È stato utile?

Soluzione 5

Alla fine abbiamo risolto con la creazione di un diverso contesto OpenGL, e il disegno di tutto per che.Abbiamo rinunciato alla cattura dello schermo.

Altri suggerimenti

Il titolo della domanda menziona cattura schermo, ma la tua domanda non.Si prega di elaborare in modo più chiaro.Il problema è che si può fare di cattura dello schermo di tre delle applicazioni, ma non la quarta?È possibile utilizzare diversi software di cattura schermo che consente di acquisire le OpenGL/DirectX di windows.Queste superfici sono gestiti direttamente dal Gestore della Finestra e non vedi con un semplice 'Stamp'.

Di commutazione per GDI+ non risolve, né il passaggio a SDI.

Se il contenuto di CView che si desidera, allora sì, che dovrebbe essere di destra.Se il contenuto di tutto lo schermo (almeno il contenuto, senza la barra degli strumenti(s) e la barra di stato), allora si dovrebbe passare CMainFrame (che è il nome di default che potrebbe essere stato modificato, che è derivato da CMDIFrameWnd).

Puoi postare il codice di WindowToDIB()?Ho appena provato e a Me Funziona (TM), ma senza OpenGL codice della vista.Prova a passare il seguito di windows per la vostra WindowToDIB() funzione:

CMainFrame* mainfrm = static_cast<CMainFrame*>(::AfxGetMainWnd());

- mainfrm

- mainfrm->MDIGetActive()

- mainfrm->MDIGetActive()->GetActiveView()

e vedere di cosa si tratta.

Il contenuto di ogni finestra sono directX superfici e vengono solo assemblati dalla finestra di gestione della scheda grafica.Si sarebbe non essere in grado di catturare questo a meno che non si spegne la nuova interfaccia (DWM) o il codice specifico per la cattura dello schermo da DWM.

Wikipedia ha una buona descrizione del Desktop Window Manager (DWM)

Scusate, non ho ancora capito.Si sta cercando di ottenere il tasto " Stampa Schermo per lavorare su tutte e quattro le applicazioni?O stai cercando di ottenere il WindowtoDIB() funzione che prende un 'schermata' (dall'interno dell'applicazione) dell'applicazione stessa, in modo che può essere salvato come un file di immagine?

Inoltre, cosa si intende con 'egli tasto Print Screen funziona come previsto, ma non salvare la schermata come JPEG.'?Stampa Schermo solo copie di appunti, cosa succede quando si incolla in Paint?

Se il tuo WindowtoDIB() la sola funzione di 'cattura' la finestra si passa, quindi sì, le finestre figlio MDI non sono andando a vedere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top