IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Calcul de la résolution de l'écran sur Windows 10


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 582
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 582
    Par défaut Calcul de la résolution de l'écran sur Windows 10
    Bonjour à toutes et à tous,

    Avec la procédure standard pour connaitre la résolution de mon écran qui fait 1920 x 1080, mon code donne un autre résultat soit (1536 x 864).


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TForm1.FormActivate(Sender: TObject);
    var
    HH :HDC;
    hauteur, largeur:integer;
    begin
    HH:=getdc(GetDesktopWindow);
      largeur:=GetDeviceCaps(HH,HORZRES);
      hauteur:=GetDeviceCaps(HH,VERTRES);
      Edtwidth.text := inttostr(largeur);
      Edtheight.text := inttostr(hauteur);
    end;

    Il y a surement une explication.

    @+,


    cincap

  2. #2
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 539
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par cincap Voir le message
    Bonjour à toutes et à tous,

    Avec la procédure standard pour connaitre la résolution de mon écran qui fait 1920 x 1080, mon code donne un autre résultat soit (1536 x 864).
    ...
    Il y a surement une explication.

    @+,


    cincap
    essaye avec ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Form1.Caption := Screen.Width.ToString + ' ' + Screen.Height.ToString;

  3. #3
    Membre émérite
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Par défaut
    Bonjour,

    je suppose que tu es toujours sous D6 ...
    teste voir ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var
     DesktopRect: TRect;
    begin
      SystemParametersInfo(SPI_GETWORKAREA, 0, @DesktopRect, 0);
      with DesktopRect do
        Caption := Format('%d x %d', [Right, Bottom]);
    end;
    il devrait fonctionner

    Cordialement,
    @+

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 582
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 582
    Par défaut Toujours sous D6 personnel !
    @ ALWEBER, merci de ta suggestion mais cela ne fonctionne pas en D6 sur Windows 10.

    @ Cirec, Comment vas tu mon mentor, merci de ta suggestion et j'obtiens le même résultat soit 1536 x 864, par contre cette méthode est nettement simplifiée comme d'habitude.

    A mon avis il y a d'autres paramètres ou pixels qui jouent avec ce code.

    Je teste aussi.

    Avec ce code j'obtiens aussi 1536 x 864.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MessageDlg('Largeur de l''écran = ' + IntToStr( Screen.Width ) + 
      ' pixels, Hauteur de l''écran = ' + IntToStr( Screen.Height )+' pixels', 
      mtInformation, [mbOk], 0 );
    @+,


    cincap

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 582
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 582
    Par défaut
    Euréka, j'ai trouvé la cause, en effet dans les paramètres de l'affichage de Windows 10, le poste "Mise à l'échelle et disposition" puis "Modifier la taille du texte, des applications et d'autres éléments" le réglage était sur 125% (Recommandé).


    Tous les codes fonctionnent en mettant ce paramètre sur 100% j'obtiens bien la résolution de 1920 x 1080.


    Je ne pense pas qu'il y a une autre solution avec ce même réglage de 125%.

    @+,

    cincap

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 582
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 582
    Par défaut
    Bonjour à toutes et à tous,

    Je pensais ne pourrait t'on pas inclure un champ ou on pourrait indiquer ce fameux 25% dans le code de recherche de la résolution pour tester les réelles dimensions de l'écran sans modifier ce qui est recommandé par Windows 10 ?

    Merci à tous,

    @+,

    cincap

  7. #7
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 539
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par cincap Voir le message
    @ ALWEBER, merci de ta suggestion mais cela ne fonctionne pas en D6 sur Windows 10.
    ...
    voici le code associé à screen.with et screen height
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function TScreen.GetHeight: Integer;
    begin
      Result := GetSystemMetrics(SM_CYSCREEN);
    end;
     
    function TScreen.GetWidth: Integer;
    begin
      Result := GetSystemMetrics(SM_CXSCREEN);
    end;
    GetSystemMetrics est une fonction Microsoft

  8. #8
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 086
    Par défaut
    Si Screen.PixelsPerInch est à 120 au lieu 96, tu peux retrouver ton information de 1.25


    Dans mes applications, je gère le zoom depuis genre XP
    Avec Windows 7, il devenait très facile de changer la taille de police en 100/125/150, j'ai eu quelques très rares utilisateurs en 125 ou 150, j'ai donc été confronté à ce problème
    je crois pas me tromper mais je détecte cela et considére que l'application est déjà zoomé grâce à Screen.PixelsPerInch

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
     
      /// <summary>Assistance de la classe TForm, en particulier la Méthode ScaleBy</summary>
      /// <remarks>Le TFormScaleSLTAssistant n'est pas un class helper car lors de sa création la version utilisée était Delphi7 puis C++Builder2007
      /// Traduction C++Builder vers Delphi en concervant ce concept des Assistances de classes (Class Helper) du Delphi.NET</remarks>
      TFormScaleSLTAssistant = class(TObject)
      private
        const
          DPI_BASE = 96;
          DPI_STEP = 24;
          POURCENT_BASE = 100;
          POURCENT_STEP = 25;
      private
        class var FMaxZoom: Integer;
        class var FReferenceZoom: Integer;
        class var FCurrentZoom: Integer;
        class var FSpecificZooms: System.Generics.Collections.TDictionary<TForm, Integer>;
        class var FBeforeZoom: TFormScaleSLTAssistantBeforeZoomEvent;
        class var FAfterZoom: TFormScaleSLTAssistantAfterZoomEvent;
     
        class function DoBeforeZoom(AForm: TForm; ZoomFrom: Integer; var ZoomTo: Integer): Boolean;
        class procedure DoAfterZoom(AForm: TForm; ZoomFrom: Integer; ZoomTo: Integer);
        class procedure CheckBounds(AForm: TForm);
     
        class procedure ScaleBy(AWinControl: TWinControl; M, D: Integer);
      public
        class constructor Create();
        class destructor Destroy();
     
        /// <summary>BuildChangeZoomMenu ajoute comme menus enfants dans un TMenuItem listant plusieurs niveau de Zoom</summary>
        /// <param name="AMenuZoom">Menu dans lequel seront insérés comme sous-menu chaque niveau de zoom géré par l'application</param>
        /// <param name="AOnClick">Gestionnaire d'évèmenent commun à chaque sous-menu, le Tag permet de trouver le style concerné, il recommandé d'utiliser ZoomClickDefaultEventHandler</param>
        /// <param name="ADefaultZoom">Zoom fixé à l'origine</param>
        /// <param name="AMaxZoom">Zoom maximum qui sera disponible dans le menu</param>
        /// <returns>Zoom actuel</returns>
        class function BuildChangeZoomMenu(AMenuZoom: TMenuItem; AOnClick: TNotifyEvent; ADefaultZoom: Integer = -1; AMaxZoom: Integer = 200): Integer;
     
        class procedure ZoomClickDefaultEventHandler(Sender: TObject);
        class procedure ZoomAllForms(AZoom: Integer);
        class procedure ApplyCurrentZoom(AForm: TForm);
        class procedure ApplyCurrentZoomToControl(AControl: TWinControl);
        class function ApplySpecificZoom(AForm: TForm; AZoom: Integer): Integer;
        class procedure CancelZoom(AForm: TForm);
        class procedure UnregisterZoom(AForm: TForm);
        class property CurrentZoom: Integer read FCurrentZoom;
        class property ReferenceZoom: Integer read FReferenceZoom;
        class property BeforeZoom: TFormScaleSLTAssistantBeforeZoomEvent read FBeforeZoom write FBeforeZoom;
        class property AfterZoom: TFormScaleSLTAssistantAfterZoomEvent read FAfterZoom write FAfterZoom;
      end;
     
     
    ...
     
     
     
    //------------------------------------------------------------------------------
    class function TFormScaleSLTAssistant.BuildChangeZoomMenu(AMenuZoom: TMenuItem; AOnClick: TNotifyEvent; ADefaultZoom: Integer = -1; AMaxZoom: Integer = 200): Integer;
    var
      I, MaxI: Integer;
      DPI, Pourcent: Integer;
      Sub: TMenuItem;
    begin
      AMenuZoom.AutoHotkeys := maManual;
      AMenuZoom.Clear();
     
      MaxI := Round((AMaxZoom - POURCENT_BASE) / POURCENT_STEP);
      FMaxZoom := POURCENT_BASE + MaxI * POURCENT_STEP;
      if ADefaultZoom > FMaxZoom then
        ADefaultZoom := FMaxZoom;
     
      for I := 0 to MaxI do
      begin
        DPI := DPI_BASE + I * DPI_STEP;
        Pourcent := POURCENT_BASE + I * POURCENT_STEP;
     
        Sub := TMenuItem.Create(AMenuZoom);
        AMenuZoom.Add(Sub);
        Sub.Tag := Pourcent;
        Sub.RadioItem := True;
        Sub.GroupIndex := 1;
        Sub.AutoHotkeys := maManual;
        Sub.Caption := IntToStr(Pourcent) + ' %';
     
        if CheckWin32Version(6, 0) and (Screen.PixelsPerInch = DPI) then
          FReferenceZoom := Pourcent;
     
        if (POURCENT_BASE <= ADefaultZoom) and (ADefaultZoom <= FMaxZoom) then
        begin
          if ADefaultZoom = Pourcent then
          begin
            FCurrentZoom := Pourcent;
            Sub.Checked := True;
          end;
        end
        else
        begin
          if CheckWin32Version(6, 0) and (Screen.PixelsPerInch = DPI) then
          begin
            FCurrentZoom := Pourcent;
            Sub.Checked := True;
          end
          else
          begin
            if Pourcent = POURCENT_BASE then
            begin
              FCurrentZoom := Pourcent;
              Sub.Checked := True;
            end;
          end;
        end;
     
        Sub.OnClick := AOnClick;
      end;
     
      if AMenuZoom.Owner is TForm then
        ApplyCurrentZoom(TForm(AMenuZoom.Owner));
     
      Result := FCurrentZoom;
    end;


    @ALWEBER, c'est le .ToString qui je pense était source d'erreur de compilation pour Cincap






    Alors pour conclure si Screen.PixelsPerInch change bien en Win10 comme en Win7, tu peux tenter cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        MessageDlg(Format('Largeur de l''écran = %d pixels, Hauteur de l''écran = %d pixels'
                       , [Screen.Width * IfThen(CheckWin32Version(6, 2), Screen.PixelsPerInch div 96, 1), Screen.Height * IfThen(CheckWin32Version(6, 2), Screen.PixelsPerInch div 96, 1)])
                , mtInformation, [mbOk], 0);
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. (Re)positionner une DIV sur une autre selon résolution de l'écran.
    Par argyronet dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 26/09/2011, 09h28
  2. Pbm résolution d'écran sur système invité XP
    Par pjtuloup dans le forum VirtualBox
    Réponses: 4
    Dernier message: 14/09/2011, 14h56
  3. problème de résolution d'écran sur un Terminal
    Par bambi98 dans le forum Périphériques
    Réponses: 5
    Dernier message: 31/03/2007, 20h28
  4. Réponses: 10
    Dernier message: 28/01/2007, 17h35
  5. problème d'apparence de l'écran sur windows xp
    Par Arabella dans le forum Windows XP
    Réponses: 1
    Dernier message: 15/02/2006, 09h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo