Problème de changement de résolution écran [Résolu]

md21 - 24 nov. 2016 à 10:32 - Dernière réponse :  md21
- 5 déc. 2016 à 11:10
Bonjour,
j'usqu'à présent j'utilisais un code afin de changer à la volée la résolution de l'écran.
Ce code est le suivant et fonctionne très bien dans Delphi 6:
function TMainFiche.ChangerResolution(Largeur, Hauteur: Word; BitsCouleur, Frequence: Byte): Integer;
var
  Retour: LongInt;
  DevModeChanger: TDeviceMode;
begin
  DevModeChanger.dmSize := SizeOf(DevModeChanger);
  With DevModeChanger do
    Begin
      dmPelsWidth        := Largeur;
      dmPelsHeight       := Hauteur;
      dmBitsPerPel       := BitsCouleur;
      dmDisplayFrequency := Frequence;
      dmFields := DM_PELSWIDTH + DM_PELSHEIGHT + DM_BITSPERPEL + DM_DISPLAYFREQUENCY; //indique ce que l'on veut modifier.
    end;
  Retour := ChangeDisplaySettingsA(DevModeChanger,CDS_TEST); // test
  if Retour = DISP_CHANGE_SUCCESSFUL then ChangeDisplaySettingsA(DevModeChanger,0);
  Result := Retour;
end;

Le problème c'est qu'il ne fionctionne plus avec les version récentes de Delphi !
J'ai fait un essais avec Delphi XE5 et la commande "ChangeDisplaySettingsA(DevModeChanger,...)"" génère une erreur. J'ai essayé des trucs mais j'avoue que je patauge et une aide serai bienvenue.
Merci par avance
Afficher la suite 

4 réponses

Répondre au sujet
cs_eli42 103 Messages postés mardi 24 décembre 2002Date d'inscription 6 décembre 2016 Dernière intervention - 24 nov. 2016 à 13:44
0
Utile
Salut

Tester sur Delphi 7, pour faire tourner un programme qui ne marche qu'en 1024*768 puis revenir a la resolution normale

var
MemWidth, MemHeight: integer; // taile d'écran

function ChangeResolution(Width, Height: integer): Longint;
var
  Affich: TDeviceMode;
begin
  Affich.dmSize := SizeOf(TDeviceMode); //Paramètres
  Affich.dmPelsWidth := Width;
  Affich.dmPelsHeight := Height;
  Affich.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT;
  Result := ChangeDisplaySettings(Affich, CDS_UPDATEREGISTRY);
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
//Memorise la resolutio d'ecran actuelle
  MemWidth := GetSystemMetrics(SM_CXSCREEN);
  MemHeight := GetSystemMetrics(SM_CYSCREEN);

ChangeResolution(1024, 768);
end; 

procedure TForm1.Bounton1Click(Sender: TObject);
begin
// Parametre affichage par defaut
  ChangeResolution(MemWidth, MemHeight);
Application.Terminate;
end;


Jorgio
Beau Temps Belle Mer
--
Commenter la réponse de cs_eli42
0
Utile
Bonjour,

merci de cette réponse rapide, ça fait plaisir.

J'ai essayé cette solution et elle ne marche pas non plus avec Delphi XE5. En fait, les fonctions ChangeDisplaySettings et ChangeDisplaySettingsA sont relativement similaires.

Par contre, de mon coté, je viens d'essayer avec la fonction ChangeDisplaySettingsEx et ça fonctionne. La différence est, entre autre, que cette fonction prend en compte le moniteur utilisé (en cas d'écran multiple).

Voilà le code:

  Retour := ChangeDisplaySettingsEx(0,DevModeChanger,0,CDS_TEST,Nil); // test (0, pour le premier index de moniteur
  if Retour = DISP_CHANGE_SUCCESSFUL then ChangeDisplaySettingsEx(0,DevModeChanger,0,0,Nil);


Le premier "0" correspond à l'écran par défaut, 1 serai le 2ème moniteur pour les machines à écrans multiples, ...

J'ai testé avec Delphi XE5 sous Seven et avec Delphi 6 sous XP et Seven, donc 32 et 64 bits, et cela fonctionne ...

Si quelqu'un a une meilleure solution je reste preneur
Commenter la réponse de md21
Cirec 4191 Messages postés vendredi 23 juillet 2004Date d'inscriptionModérateurStatut 12 décembre 2017 Dernière intervention - Modifié par Cirec le 26/11/2016 à 19:26
0
Utile
Salut,

essaye avec:
function TMainFiche.ChangerResolution(Largeur, Hauteur: Word; BitsCouleur, Frequence: Byte): Integer;
const
  ENUM_CURRENT_SETTINGS = Cardinal(-1);
  ENUM_REGISTRY_SETTINGS = Cardinal(-2);
var
  Retour: LongInt;
  DevModeChanger: TDeviceMode;
begin
  DevModeChanger.dmSize := SizeOf(DevModeChanger);
  EnumDisplaySettings(nil, ENUM_CURRENT_SETTINGS, DevModeChanger);
  With DevModeChanger do
    Begin
      dmPelsWidth        := Largeur;
      dmPelsHeight       := Hauteur;
      dmBitsPerPel       := BitsCouleur;
      dmDisplayFrequency := Frequence;
      dmFields := DM_PELSWIDTH + DM_PELSHEIGHT + DM_BITSPERPEL + DM_DISPLAYFREQUENCY; //indique ce que l'on veut modifier.
    end;
  Retour := ChangeDisplaySettings(DevModeChanger,CDS_TEST); // test
  if Retour = DISP_CHANGE_SUCCESSFUL then ChangeDisplaySettings(DevModeChanger,0);
  Result := Retour;
end;


Il faut initialiser le "TDeviceMode" par un appel à "EnumDisplaySettings" avant tout autre chose

Code testé ... ceci devrait résoudre le problème

    
@+ Cirec
Commenter la réponse de Cirec
0
Utile
merci Cirec,

désolé pour le retard je n'ai pas vu le temps passer
cela faisait longtemps, merci de m'avoir répondu c'est sympa.

Alors j'ai essayé mais chez moi ton code génère une erreur (mais je vais regarder mieux pour comprendre ce que j'ai mal fait), par contre, comme je l'ai répondu à cs_eli42, j'ai trouvé une autre fonction: ChangeDisplaySettingsEx qui va très bien, apparement dans tous les cas, avec le code suivant

Retour := ChangeDisplaySettingsEx(0,DevModeChanger,0,CDS_TEST,Nil); // test (0, pour le premier index de moniteur)
  if Retour = DISP_CHANGE_SUCCESSFUL then ChangeDisplaySettingsEx(0,DevModeChanger,0,0,Nil);
Commenter la réponse de md21

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.