votre écran mesure Ht x mm larg y mm

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: votre écran mesure Ht x mm larg y mm

Message par Micoute »

Je croyais qu'un écran se mesurait en diagonale, ce qui donne sa résolution, donc selon le théorème de Pythagore, la somme des carrés des côtés de l'angle droit est égal au carré de l’hypoténuse et réciproquement ! Le mien fait 17 pouces.

Veuillez m'excuser de m’immiscer dans votre sujet !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: votre écran mesure Ht x mm larg y mm

Message par MLD »

@ Mesa, Dobro

Le code de Mesa, j'avais déja fait, mais encore une fois ceci ne fonctionne qu'avec le réglage natif.

Forcer la résolution est une possibilité, mais tu ne sais pas si l'écran de l'utilisateur final accepte cette résolution.

@ falsam

Que vient faire Poshu ici :?: :mrgreen: :mrgreen:

@ Micoute

Si ton logiciel est distribué comment fais tu pour connaitre la diagonale de l'écran d'un client lamda :?: :mrgreen:

Bon je jette l'éponge. (Mais je n'aime pas resté sur un échec, et cette idée va me suivre un moment.)
Pour une application j'ai besoin d'une interface graphique qui, quelque soit les dimensions d'un écran ou sa résolution, ou le nombre de DPI
Présente visuellement la même chose. (en plus ou mois réduit bien sur,mais toujours dans les mêmes proportions par rapport a la surface de l'écran)
Pour les fenetres pas de problème, certains gadgets sont faciles, mais d'autres comme les gadgetLists sont plus que ardus.
Par exemple une ListIconGadget qui contient 10 lignes visibles et qu'il faut que les 10 lignes soient visible quelque soit la config
Certain logiciels ont une interface par résolution entre 800x600, et le dernier cris des écrans du moment. Seul les différences de DPI sont pris en compte. Si les écrans évoluent une nouvelle version du logiciel est proposé. C'est pour cela que des logiciels qui paraissent assez banal sont trés gros en nombre d'octets.
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: votre écran mesure Ht x mm larg y mm

Message par Micoute »

Bonjour MLD, je me servirais des fonctions PB pour connaître la largeur et la hauteur de l'écran, ce qui permettrait de calculer toutes les dimensions voulues pour pouvoir extrapoler.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: votre écran mesure Ht x mm larg y mm

Message par Mesa »

Mon code fonctionne bien avec Xp mais je n'avais pas vu que la fonction "GetDeviceCaps" ne fonctionnait plus (ou plus ou moins bien) depuis vista :
Microsoft : Note GetDeviceCaps reports info that the display driver provides. If the display driver declines to report any info, GetDeviceCaps calculates the info based on fixed calculations. If the display driver reports invalid info, GetDeviceCaps returns the invalid info. Also, if the display driver declines to report info, GetDeviceCaps might calculate incorrect info because it assumes either fixed DPI (96 DPI) or a fixed size (depending on the info that the display driver did and didn’t provide). Unfortunately, a display driver that is implemented to the Windows Display Driver Model (WDDM) (introduced in Windows Vista) causes GDI to not get the info, so GetDeviceCaps must always calculate the info.
Un programmeur propose un code en C++ mais il prévient qu'il ne fonctionne pas à tous les coups et que c'est le genre de code qui est recherché par beaucoup mais que personne n'a réellement réussi à créer.
Voir ici :
http://ofekshilon.com/2011/11/13/readin ... right-way/

C'est un "faux-ami" ( problème apparemment simple mais en fait impossible à résoudre).

A éviter.

[edit] voir ici aussi, un code plus facile à traduire
http://stackoverflow.com/questions/5777 ... he-monitor

Il semble qu'il existe une fonction spécial sous vista
GetMonitorDisplayAreaSize()
http://msdn.microsoft.com/en-us/library ... 85%29.aspx

M.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: votre écran mesure Ht x mm larg y mm

Message par Backup »

MLD a écrit : Forcer la résolution est une possibilité, mais tu ne sais pas si l'écran de l'utilisateur final accepte cette résolution.
ben si :)

Code : Tout sélectionner


InitSprite()

  If ExamineScreenModes()
    While NextScreenMode()
      Debug Str(ScreenModeWidth())+"x"+Str(ScreenModeHeight())+"x"+Str(ScreenModeDepth())+"@"+Str(ScreenModeRefreshRate())+"Hz"
    Wend
  EndIf

ceci te sort toute les résolution possible de l'utilisateur
il te suffit de tester si une résolution particuliere qui t’intéresse est présente dans la liste
si c'est le cas , tu "Forces" la résolution ...

apres c'est sur que, tout le monde ne peut pas faire du 1920X1080

mais il te suffit de prendre une résolution courante (1024x768) pour deja avoir la majorité des PC ...

et si tu veux mieux comme résolution , tu peux éventuellement tester si c'est possible, avant de Forcer la Résolution
si c'est pas possible (résolution non présente dans la liste )

tu affiche un message , ou tu dis que le gars a une Bouze infame, et qu'il faut vite courir acheter une carte Graphique
digne de 2014 , car son model est As-Been :lol:

c'est ce que font sans vergogne les éditeurs de Jeux, qui mettent une config minimum indiquée pour jouer a leur jeux...

tu peux aussi essayer d'adapter ton interface a la résolution courante de l'utilisateur ...
vu que tu peux récuperer facilement la Résolution en cours,... tu adaptes ton interface a cette résolution

tu peux aussi , préparer plusieurs interface , pour des résolutions Clef ..

une pour le 1024x768
une pour le 1600x1024x16@60Hz
une pour le 1920x1080x32@60Hz

et en fonction de la liste possible tu choisis l'interface de la plus haute résolution... que tu aura préalablement forcé :)
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: votre écran mesure Ht x mm larg y mm

Message par Micoute »

C'est Dobro qui a raison, moi j'aurais proposer quelque chose comme ça :

Code : Tout sélectionner

; 
;  Calcule la taille nécessaire pour afficher un gadget correctement.
;
;  Gadgets pris en charge:
;    Button, Checkbox, Option, Text, String, ComboBox, Image 
;
;   Note: 
; Pour Gadgets à contenu variable (String, ComboBox), seul la hauteur 
; est utile, alors que la largeur ne sera qu'une valeur minimale absolue
;
;  Les paramètres 'Options' donne les drapeaux gadget à inclure dans le calcul.
;  Actuellement seulement #PB_Text_Border fait une différence.   
;

CompilerIf Defined(Max, #PB_Procedure) = 0
  Procedure Max(a, b)
    If a > b
      ProcedureReturn a
    Else
      ProcedureReturn b
    EndIf
  EndProcedure
CompilerEndIf

; Stocke le résultat dans *Largeur\l et *Hauteur\l
;
Procedure FaireRequerirTaille(Gadget, *Largeur.LONG, *Hauteur.LONG, Drapeaux = 0)
  DC = GetDC_(GadgetID(Gadget))
  AncPolice = SelectObject_(DC, GetGadgetFont(Gadget)) 
  Taille.SIZE
  
  Select GadgetType(Gadget)
      
    Case #PB_GadgetType_Text
      Texte$ = RemoveString(GetGadgetText(Gadget), #LF$)
      Compte = CountString(Texte$, #CR$) + 1
      Vide = 0
      HauteurMaxi = 0 
      For index = 1 To Compte 
        Ligne$ = StringField(Texte$, index, #CR$)
        If Ligne$ = ""
          Vide + 1
        Else 
          GetTextExtentPoint32_(DC, @Ligne$, Len(Ligne$), @TailleLigne.SIZE)
          Taille\cx = Max(Taille\cx, TailleLigne\cx)
          Taille\cy + TailleLigne\cy
          HauteurMaxi = Max(HauteurMaxi, TailleLigne\cy)
        EndIf
      Next index            
      Taille\cy + Vide * HauteurMaxi  
      
      If Drapeaux & #PB_Text_Border
        Taille\cx + GetSystemMetrics_(#SM_CXEDGE) * 2
        Taille\cy + GetSystemMetrics_(#SM_CYEDGE) * 2
      Else           
        Taille\cx + 2
        Taille\cy + 2
      EndIf
      
    Case #PB_GadgetType_CheckBox, #PB_GadgetType_Option
      Texte$ = GetGadgetText(Gadget)
      GetTextExtentPoint32_(DC, @Texte$, Len(Texte$), @Taille.SIZE)
      Taille\cx + 20
      Taille\cy = Max(Taille\cy+2, 20)
      
    Case #PB_GadgetType_Button
      Texte$ = GetGadgetText(Gadget)
      GetTextExtentPoint32_(DC, @Texte$, Len(Texte$), @Taille.SIZE)
      Taille\cx + GetSystemMetrics_(#SM_CXEDGE)*2
      Taille\cy = Max(Taille\cy+GetSystemMetrics_(#SM_CYEDGE)*2, 24)
      Taille\cx + 10
      
    Case #PB_GadgetType_String
      Texte$ = GetGadgetText(Gadget) + "Hg" 
      GetTextExtentPoint32_(DC, @Texte$, Len(Texte$), @Taille.SIZE)
      Taille\cx = GetSystemMetrics_(#SM_CXEDGE)*2 
      Taille\cy = Max(Taille\cy+GetSystemMetrics_(#SM_CXEDGE)*2, 20)
      
    Case #PB_GadgetType_ComboBox
      GetTextExtentPoint32_(DC, @"Hg", 2, @Taille.SIZE)
      Taille\cy = Max(Taille\cy + 8, 21)
      Taille\cx = Taille\cy  
      
    Case #PB_GadgetType_Image
      Taille\cx = GadgetWidth(Gadget)
      Taille\cy = GadgetHeight(Gadget)
      
  EndSelect
  
  SelectObject_(DC, AncPolice)
  ReleaseDC_(GadgetID(Gadget), DC)
  *Largeur\l  = Taille\cx
  *Hauteur\l = Taille\cy
  
  If Type = #PB_GadgetType_String Or Type  = #PB_GadgetType_ComboBox        
    *Largeur\l = 30 
  EndIf
  EndProcedure

; enveloppes de commodité si une seule taille est requise
;
Procedure FaireRequerirLargeur(Gadget, Drapeaux = 0)
  Protected Largeur.l, Hauteur.l
  FaireRequerirTaille(Gadget, @Largeur, @Hauteur, Drapeaux)
  ProcedureReturn Largeur
EndProcedure 

Procedure FaireRequerirHauteur(Gadget, Drapeaux = 0)
  Protected Largeur.l, Hauteur.l
  FaireRequerirTaille(Gadget, @Largeur, @Hauteur, Drapeaux)
  ProcedureReturn Hauteur
EndProcedure
et ceci pour l'essayer :

Code : Tout sélectionner

XIncludeFile #PB_Compiler_Home + "..\Prg perso\Projets\FaireRequerir\FaireRequerir.pbi"
Enumeration
  #Button_1
  #Button_2
  #Button_3
  #Checkbox_1
  #Checkbox_2
  #Checkbox_3  
  #String
  #ComboBox
  #ChangeFont
EndEnumeration

Procedure Retailler()
  FaireRequerirTaille(#Button_1, @LargeurBouton1.i, @HauteurBouton1.i)
  FaireRequerirTaille(#Button_2, @LargeurBouton2.i, @HauteurBouton2.i)
  FaireRequerirTaille(#Button_3, @LargeurBouton3.i, @HauteurBouton3.i)
  
  Hauteur = Max(HauteurBouton1, Max(HauteurBouton2, HauteurBouton3))
  x = 10
  y = 10
  ResizeGadget(#Button_1, x, y, LargeurBouton1, Hauteur): x + LargeurBouton1 + 5
  ResizeGadget(#Button_2, x, y, LargeurBouton2, Hauteur): x + LargeurBouton2 + 5
  ResizeGadget(#Button_3, x, y, LargeurBouton3, Hauteur): x + LargeurBouton3 + 5
  
  y + Hauteur + 10  
  HauteurFenetre = x
  
  FaireRequerirTaille(#Checkbox_1, @LargeurCoche1.i, @HauteurCoche1.i)
  FaireRequerirTaille(#Checkbox_2, @LargeurCoche2.i, @HauteurCoche2.i)
  FaireRequerirTaille(#Checkbox_3, @LargeurCoche3.i, @HauteurCoche3.i)
  
  Largeur = Max(LargeurCoche1, Max(LargeurCoche2, LargeurCoche3))
  ResizeGadget(#Checkbox_1, 10, y, Largeur, HauteurCoche1): y + HauteurCoche1 + 5
  ResizeGadget(#Checkbox_2, 10, y, Largeur, HauteurCoche2): y + HauteurCoche2 + 5
  ResizeGadget(#Checkbox_3, 10, y, Largeur, HauteurCoche3): y + HauteurCoche3 + 5
  
  y + 5
  HauteurFenetre = Max(HauteurFenetre, Largeur+20)
  
  Hauteur = FaireRequerirHauteur(#String)
  ResizeGadget(#String, 10, y, HauteurFenetre-20, Hauteur)
  y + Hauteur + 5

  Hauteur = FaireRequerirHauteur(#ComboBox)
  ResizeGadget(#ComboBox, 10, y, HauteurFenetre-20, Hauteur)
  y + Hauteur + 10
  
  FaireRequerirTaille(#ChangeFont, @LargeurBouton.i, @HauteurBouton.i)
  ResizeGadget(#ChangeFont, (HauteurFenetre-LargeurBouton)/2, y, LargeurBouton, HauteurBouton)
  y + HauteurBouton + 10
  
  ResizeWindow(0, #PB_Ignore, #PB_Ignore, HauteurFenetre, y)
EndProcedure

If OpenWindow(0, 100, 100, 0, 0, "Test taille", #PB_Window_SystemMenu|#PB_Window_Invisible)
  ButtonGadget(#Button_1, 0, 0, 0, 0, "Court")
  ButtonGadget(#Button_2, 0, 0, 0, 0, "-- Long --")
  ButtonGadget(#Button_3, 0, 0, 0, 0, "------- Très long ------")
  CheckBoxGadget(#Checkbox_1, 0, 0, 0, 0, "Salut monde cruel !")
  CheckBoxGadget(#Checkbox_2, 0, 0, 0, 0, "Voyez le brick géant que j'examine près du wharf.")
  CheckBoxGadget(#Checkbox_3, 0, 0, 0, 0, "Une autre boîte à cocher")
  StringGadget(#String, 0, 0, 0, 0, "String")
  ComboBoxGadget(#ComboBox, 0, 0, 0, 0)
  AddGadgetItem(#ComboBox, 0, "ComboBox")
  SetGadgetState(#ComboBox, 0)
  ButtonGadget(#ChangeFont, 0, 0, 0, 0, "Changer police")

  Retailler()
  HideWindow(0, 0)
  
  Repeat
    Event = WaitWindowEvent()
    
    If Event = #PB_Event_Gadget And EventGadget() = #ChangeFont
      If FontRequester("Arial", 20, 0)
        If LoadFont(0, SelectedFontName(), SelectedFontSize(), SelectedFontStyle())
          For Gadget = #Button_1 To #ChangeFont
            SetGadgetFont(Gadget, FontID(0))
          Next Gadget
          Retailler()
        EndIf
      EndIf
    EndIf
  Until Event = #PB_Event_CloseWindow
EndIf
comme ça, l'utilisateur peut adapter la police de caractères à son écran.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: votre écran mesure Ht x mm larg y mm

Message par Backup »

Micoute a écrit :C'est Dobro qui a raison, moi j'aurais proposer quelque chose comme ça :

le but n'est pas de dire si j'ai raison ou tord..... ;)
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: votre écran mesure Ht x mm larg y mm

Message par Micoute »

Comme tu le proclames souvent, ce que je pense, n'est pas forcément une tendance générale, mais n'engage que moi-même, pour moi, c'est ta solution qui est la plus judicieuse !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: votre écran mesure Ht x mm larg y mm

Message par MLD »

@ Dobro

Oui c'est des possibilités,mais je n'aime pas en général forcer quoi que ce soit sur le matériel des autres. Surtout que si la machine
pour une raison quelconque crack, ou que il y ait une panne EDF, certains ne saurons pas remettre la bonne résolution.
Mais merci pour les pistes.

@ Micoute

Trés joli travail, mais le problème n'est pas la.
La taille de la police, c'est simple, ajusté la taille d'un gadget a partir de la taille d'une police peu se faire a partir de TextHeight("W"), TextWidth("W") par exemple. a partir de la, tu rezise les gadgets dans une boucle.

Comme entrainement de ce que je souhaite, essaye de faire une fenêtre qui dans toute les résolutions a une hauteur qui laisse apparaitre la barre de tache de window a raz de celle-ci bien sur. :mrgreen: :? :lol:
Pour infos chez moi en ce moment TEMPETE vent = 120km/h . Je cours aprés tout ce qui n'est pas bien arrimé sur ma terrasse.
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: votre écran mesure Ht x mm larg y mm

Message par Micoute »

Bonsoir MLD, je pense que pour qu'on voit la barre des tâches, il faut la mesurer, mais pas simple si tu ne travaille pas sur cet écran et qu'ensuite tu retranches cette mesure à la hauteur de ta fenêtre et bien sûr retrancher aussi la position y de ta fenêtre sur l'écran, mais je sais que tu n'es pas sot à ce point !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre