Pergunta

Temos algumas aplicações internas construídas em MFC, com OpenGL rotinas de desenho. Todos eles usam o mesmo código para desenhar na tela e quer imprimir a tela ou guardá-lo para um arquivo JPEG. Tudo foi muito bem trabalhando no Windows XP, e eu preciso encontrar uma maneira de fazê-los trabalhar em Vista.

Em três dos nossos aplicativos, tudo funciona. No único remanescente, posso obter fronteira da janela, barra de título, menus e barra de tarefas, mas o interior nunca aparece. Como eu disse, esses aplicativos usam exatamente o mesmo código para escrever para a tela e capturar a imagem da janela, ea única diferença que vejo que parece que pode ser relevante é que a aplicação problema usa a interface de múltiplos documentos MFC, enquanto os que o trabalho use a interface de documento único.

Ou a resposta não está na rede, ou Sou pior no Googling do que eu pensava. Eu perguntei sobre os fóruns do MSDN, ea única sugestão prática que recebi foi usar GDI + em vez de GDI, e que não fez nada diferente. Eu tentei coisas diferentes com cada parte do código que captura e impressões ou salvar, dado um ponteiro para a janela, de modo que, aparentemente, é uma questão da própria janela. Eu não reconstruiu a aplicação ofender usando SDI ainda, e eu realmente não tem outras ideias.

Alguém viu nada parecido com isso?


O que eu tenho é de quatro aplicações. Eles usam um monte de código comum, e compartilhar os arquivos e.cpp reais, então eu sei o código de desenho e captura de tela é idêntica.

Existe uma rotina WindowtoDIB () que leva a * pWnd e um retângulo de origem eo tamanho de destino. Parece que o código Microsoft muito ligeiramente adaptada, e eu encontrei outras funções neste arquivo no site da Microsoft. Dos meus quatro aplicações, três lidar com isso muito bem, mas não faz. A diferença mais óbvia é que o problema é MDI.

Parece-me que o * pWnd é o problema. Eu não sou um guru MFC por um tiro longo, e parece-me que o problema pode ser que nós temos uma janela de configuração nos IDS, e mais de um em MDI. Posso estar passando o errado * pWnd para a função.

Nesse meio tempo, ele começou a trabalhar corretamente na máquina de teste Vista 64-bit, embora ainda não funciona na máquina de 32 bits Vista. Eu não tenho ideia do porquê. Eu não mudei nada desde os últimos testes, e eu não acho que ninguém mais tinha. (Na versão de 32 bits, a tecla Print Screen funciona como esperado, mas ele não salva a tela como um JPEG.)

Foi útil?

Solução 5

Nós finalmente resolvido isso criando um contexto OpenGL diferente, e desenhar tudo para isso. Nós desistiu da captura de tela.

Outras dicas

Seu título questão menciona captura de tela, mas sua pergunta real não. Por favor explique mais claramente. O problema é que você pode fazer captura de tela de três de suas aplicações, mas não o quarto? Você pode usar software de captura de tela diferente, que pode capturar janelas OpenGL / DirectX. Essas superfícies são tratados diretamente pelo Window Manager e não vai aparecer com um simples 'PrtScn'.

Mudar para GDI + não vai resolvê-lo, nem vai mudar para SDI.

Se é o conteúdo do CView que você quer, então sim, que deve ser um direito. Se é o conteúdo da tela inteira (pelo menos o conteúdo, sem a barra de ferramentas (s) ea barra de status), então você deve passá-lo a CMainFrame (que é o nome padrão que pode ter sido alterado, o que é derivado de CMDIFrameWnd ).

Você pode postar o código de WindowToDIB ()? Eu apenas tentei isso e ele trabalha para mim (TM), mas sem código OpenGL na vista. Tente passar os seguintes janelas para o seu WindowToDIB () função:

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

- mainfrm

- mainfrm->MDIGetActive()

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

e ver o que você recebe.

O conteúdo de cada janela são superfícies DirectX e só são montados pelo gerenciador de janelas na placa gráfica. Você não seria capaz de capturar a menos que você desligue a nova interface (DWM) ou código especificamente para captura de tela do DWM.

Wikipedia tem uma boa descrição do Desktop Window Manager (DWM)

Desculpe, eu ainda não entendo. Você está tentando obter a tecla Print Screen para o trabalho em todos os quatro aplicações? Ou você está tentando obter o WindowtoDIB () para o trabalho, o que leva a 'imagem' (de dentro do seu próprio aplicativo) do próprio aplicativo, de modo que ele pode ser salvo como um arquivo de imagem?

Além disso, o que você quer dizer com 'ele Imprimir obras fundamentais tela como esperado, mas ele não salva a tela como um JPEG.'? Print Screen apenas copia para a área de transferência, o que acontece quando você cola em pintura?

Se a sua função WindowtoDIB () apenas 'capturas' da janela você passar para ele, então sim, suas janelas filho MDI não vão aparecer.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top