C++ Resolução de tela

18 respostas
K

Olá!!

Alguém sabe como faço para obter a resolução da tela usando C++ ?

Obrigada!

18 Respostas

E

Depende da biblioteca que você está usando para seus gráficos. Sem saber que biblioteca, sistema operacional, marca do compilador etc. é meio complicado responder alguma coisa.

K

Bom…o sistema operacional…Windows… agora quanto a biblioteca…aceito sugetões de qual eu poderia estar usando…a IDE é o Visual Studio 2008…

V

Que tipo de aplicação você vai fazer?

Para ambientes de janelas, eu sugeriria o QT: http://qt.digia.com/
Que tem inclusive plugin para desenvolvimento em Visual Studio.

Outra possibilidade é recorrer diretamente a MFC, se você precisar de um binário pequeno.

Há outras alternativas como a wxWidgets e a GTK.

Se for para games, o ideal é pegar uma biblioteca mais leve. Seja usando WinAPI para abrir a janela e DirectX direto a partir daí, ou uma biblioteca como STL ou FTGL.

Agora, por que está usando o Visual 2008? O 2010 e o 2012 são gratuitos. Sem falar no QT Creator, que é excelente.
É uma boa se atualizar até para poder usar recursos do C++11.

E

Bom, eu recomendaria instalar o QtSDK, porque:
a) O método padrão de criar programas gráficos em C++ (que é o MFC) é de difícil aprendizado, e além disso é muito complicado fazer coisas muito básicas - como alterar o fonte de um label em um Dialog, só para ter uma idéia.
b) Escrevendo um programa com o QtCreator e o QtSDK, você pode reaproveitá-lo para rodar em Linux e MacOSX.
Você não precisa abandonar o Visual Studio, porque há um plugin do Qt para o Visual Studio.
Outra coisa interessante é que você também pode escrever programas em Qt para rodarem naqueles celulares Nokia mais antigos (que rodam Symbian) ou então em alguns celulares que rodam algumas versões do Linux como o Maemo. Atenção: daqui a algum tempo, o pessoal da Qt vai criar uma versão do QtSDK que roda sob Android e iOS.

http://www.developer.nokia.com/Develop/Qt/Tools/

Atenção

K

A aplicação se trata do seguinte: ao clicar em um botão de uma aplicação feita em java é acionada uma aplicação em C++ (a que eu estou fazendo), essa aplicação em C++ matará alguns processos, acontece que a posição x,y deste botão varia de acordo com a resolução da tela, por isso preciso obter a largura e altura da tela, para poder sabe quando é clicado no x,y do botão…

K

Alguém pode dar mais alguma dica?

V

Você está tentando ir por um caminho longo e tortuoso. Por que a aplicação Java não dispara sua aplicação C++ via linha de comando? Para isso, bastaria programar um Runtime.exec no lado do Java.

K

E porque essa aplicacao em C++ devera matar alguns processos entre eles o do java…e deve ser feito em outra linguagem para poder abranger o caso da JVM travar…

V

Ué, como ele vai clicar o botão na aplicação Java se ela estiver travada? É uma péssima idéia tirar screenshots da tela do usuário e tentar descobrir que o sujeito clicou no botão por processamento de imagens. O ideal mesmo é fazer o botão na aplicação c++ mesmo.

Nesse caso, vc também poderia deixar a aplicação sem interface gráfica e criar só um atalho para ela.

K

Qual seria desvantagem de se fazer isso…tentar descobrir onde o cara clicou…se foi mesmo na posicao que fica o botao…?

Obrigada pelas dicas…e desculpe qualquer falha…e que sou iniciante rs

V

A desvantagem é que não existe uma maneira fácil de um processo interceptar eventos no outro. E ainda fica mais difícil se o aplicativo for em Java, pois ele não usa exatamente o sistema de eventos do sistema operacional. Além disso, um aplicativo travado pode congelar a tela, o que impediria o desenho do botão.

Agora, vc tem que decidir. Ou você:
a) Parte do pressuposto que a aplicação Java estará travada e, nesse caso, ele também não conseguiria clicar nesse tal botão. Nesse caso, o ideal seria ele disparar sua aplicação por um meio externo, como um atalho.
b) Parte do pressuposto que pelo menos clicar o botão ele consegue, e então, programa no botão para ele disparar sua aplicação C++. Assim você poderia fazer uma chamada ao Runtime.exec.

PS: Não há a possibilidade de corrigir as aplicações para que elas não travem mais?

E

Uma coisa que é ruim no Java é que todos os botões, menus etc. são desenhados pelo próprio Java, em vez de serem desenhados pelo sistema operacional (ok, estou simplificando um pouco a teoria). Portanto, é difícil fazer um programa que analise a janela de outro e localize elementos como botões e menus.

Antigamente isso era muito comum (e provavelmente é por isso que lhe mandaram fazer tal coisa complicada) porque os programas eram escritos em C ou C++ no Windows e usavam os componentes padrão do Windows, que podem ser inspecionados por outros programas de forma relativamente simples. Portanto, você podia escrever com relativa facilidade um programa em C++ que pudesse clicar em um botão de outro programa em C++ ou até VB 6.

Hoje em dia não dá mais para fazer isso direito - programas em Java desenham quase todos os elementos da tela e não permitem ser inspecionados com facilidade. Acho que programas em .NET também fazem isso.

K

Ainda continuo precisando saber como pegar a resolução da tela em C++…alguém sabe?

Vlw!

E

Para saber a resolução do monitor principal usando as APIs do Windows, você pode usar:

V

http://support.microsoft.com/kb/210106

K

Teria um exemplo de como usar a função EnumDisplaySettings?

Obrigada!!

E
#include <windows.h>
#include <iostream>
using namespace std;
/*
BOOL EnumDisplaySettings(
  _In_   LPCTSTR lpszDeviceName,
  _In_   DWORD iModeNum,
  _Out_  DEVMODE *lpDevMode
);
*/
int main (int argc, char *argv[]) {
	DEVMODE devMode;
	if (SUCCEEDED (::EnumDisplaySettings (NULL, ENUM_CURRENT_SETTINGS, &devMode))) {
		cout << "width = " << devMode.dmPelsWidth << endl;
		cout << "height = " << devMode.dmPelsHeight << endl;
	}
}

Note que se você precisar da resolução de outros monitores, você terá também de estudar:

K

entanglement:
#include <windows.h> #include <iostream> using namespace std; /* BOOL EnumDisplaySettings( _In_ LPCTSTR lpszDeviceName, _In_ DWORD iModeNum, _Out_ DEVMODE *lpDevMode ); */ int main (int argc, char *argv[]) { DEVMODE devMode; if (SUCCEEDED (::EnumDisplaySettings (NULL, ENUM_CURRENT_SETTINGS, &devMode))) { cout << "width = " << devMode.dmPelsWidth << endl; cout << "height = " << devMode.dmPelsHeight << endl; } }

Note que se você precisar da resolução de outros monitores, você terá também de estudar:


Muito obrigada pela ajuda valeu!

Criado 11 de janeiro de 2013
Ultima resposta 22 de jan. de 2013
Respostas 18
Participantes 3