Problème de changement de résolution écran

Résolu
md21 - 24 nov. 2016 à 10:32
 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

4 réponses

cs_eli42 Messages postés 143 Date d'inscription mardi 24 décembre 2002 Statut Membre Dernière intervention 11 juillet 2023 1
24 nov. 2016 à 13:44
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
--
0
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
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
Modifié par Cirec le 26/11/2016 à 19:26
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
0
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);
0
Rejoignez-nous