2010-11-03 4 views
10

J'écris un petit programme pour me permettre de changer de résolution parce que mon projecteur ne peut pas gérer la même résolution que mon écran. Je sais déjà comment régler la résolution de l'écran en utilisant l'API Windows. Ainsi que lire la résolution actuelle en utilisant l'API Windows ou la boîte à outils QT4. Mon problème est que je veux un menu de toutes les différentes résolutions prises en charge par l'écran et la carte graphique. Ce programme sera distribué, j'ai donc besoin que le programme communique avec la carte graphique pour savoir ce qu'elle supporte. La seule API que je veux utiliser est l'API Windows, ou la boîte à outils QT4, mais je ne pense pas que QT4 le fasse à moins que vous n'utilisiez les widgets graphiques de façon étrange. Je suis sûr que c'est possible avec l'API WINDOWS. Je ne sais pas comment le faire. Oh et s'il vous plaît me couper un peu de mou, je suis familier avec QT4 et C++ mais je suis typiquement un programmeur Linux, j'écris ceci pour quelqu'un d'autre. La seule chose que j'ai jamais faite avec l'API Windows est de créer une boîte de message, de définir l'arrière-plan et d'utiliser les variables système. Alors s'il vous plaît expliquer le processus simplement. S'il vous plaît ne pas simplement poster un lien vers le msdn, je déteste leur documentation, et je déteste Microsoft. J'utilise Windows deux fois par an.C++ Recherche des résolutions prises en charge par la carte graphique

+0

Une raison pour laquelle vous êtes limité à l'API Win32? L'API DirectX encapsule cette fonctionnalité afin que vous n'ayez pas à traiter avec différents fournisseurs de cartes graphiques. –

+6

"S'il vous plaît ne pas simplement poster un lien vers le msdn, je déteste leur documentation, et je déteste Microsoft." Vraiment !? La documentation MSDN est généralement fantastique. – James

Répondre

17

Ce qui suit devrait probablement travailler pour vous dans le cas général

DEVMODE dm = { 0 }; 
dm.dmSize = sizeof(dm); 
for(int iModeNum = 0; EnumDisplaySettings(NULL, iModeNum, &dm) != 0; iModeNum++) { 
    cout << "Mode #" << iModeNum << " = " << dm.dmPelsWidth << "x" << dm.dmPelsHeight << endl; 
    } 

Cela devrait imprimer toutes les résolutions prises en charge sur l'écran en cours que le .exe est exécuté. En supposant que vous n'avez pas affaire à une carte graphique multi-affichage, cela devrait fonctionner. Sinon, vous devrez utiliser EnumDisplayDevices en boucle sur chaque affichage. Une fois que vous avez déterminé quelle résolution vous voulez, vous pouvez utiliser 'ChangeDisplaySettingsEx' pour changer l'affichage au mode que vous voulez. Utiliser DirectX est possible mais je ne le recommanderais pas car le code est beaucoup plus compliqué (initialiser DirectX et utiliser des pointeurs COM) à moins que vous envisagiez d'utiliser réellement DirectX pour plus que simplement déterminer des résolutions d'affichage.

+0

c'est exactement ce que je voulais, je ne comprenais pas que chaque numéro de mode était chaque support res, et que 0 était actuel, merci –

+0

n'est-ce pas intéressant que je puisse regarder un exemple de code et le comprendre mieux que info of the msdn –

+0

@TheDude Tout le monde a un style d'apprentissage différent. Le vôtre et le mien semblent être «apprendre par l'exemple». – deed02392

2

EnumDisplaySettings :)

De MSDN:

"Pour obtenir les paramètres d'affichage actuels, passer les ENUM_CURRENT_SETTINGS constantes dans le paramètre iModeNum à l'API EnumDisplaySettings, comme illustré par le code C++ suivant."

DEVMODE dm; 
// initialize the DEVMODE structure 
ZeroMemory(&dm, sizeof(dm)); 
dm.dmSize = sizeof(dm); 
if (0 != EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dm)) 
{ 
// inspect the DEVMODE structure to obtain details 
// about the display settings such as 
// - Orientation 
// - Width and Height 
// - Frequency 
// - etc. 
} 
+2

C'est drôle que le seul mot dans votre réponse soit un lien vers MSDN, que le questionneur a explicitement déclaré ne pas être intéressé par ... –

+0

@ Frédéric Hamidi. J'ai ajouté un exemple. – YWE

+0

Je ne vois pas où "The Dude" a dit cela du tout. Il a dit "API Windows", et le lien pointe vers une fonction dans GDI, qui fait partie de l'API Windows. Cela me semble être exactement ce qui a été demandé. –

Questions connexes