Fenêtres facile

Programmation d'applications complexes
Avatar de l’utilisateur
MLD
Messages : 1097
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Fenêtres facile

Message par MLD »

Bonjour a tous

J'avais indiqué dans la rubrique débutant, que sa me "gonflait" de ne pas pouvoir avoir des écrans identiques selon les résolutions, et les dimensions des dit écrans.
Donc ce WE, j'ai pris mon courage a deux mains et voici le résultat.
Ce code est libre faites en ce que vous voulez, mais j'en connais que ça intérêssera surement, car il se sont posé le problème depuis longtemps.
Reste le problème des gadgets, pour certains c'est simple, mais pour d'autres, c'est une autre paire de manches. (Mais j'y pense.)
SVP testez, et faite moi remonté les éventuels problèmes.

Code : Tout sélectionner

Enumeration
  #Ma_fen
  #Ma_fen1
EndEnumeration
#Ldef = 1920 :#Hdef = 1080
Global typH.b
Global St
Procedure Ywp(y.d)
definecrht.d = GetSystemMetrics_(#SM_CYSCREEN)
Select y.d
  Case 0
   ProcedureReturn 0 ;en haut de l'écran
 Default
  If definecrht.d = #Hdef
   ProcedureReturn y.d * 1
  Else
   ProcedureReturn y.d * (definecrht /#Hdef)
  EndIf 
EndSelect   
EndProcedure

Procedure Hw(Dh.d,typH.b)
definecrht.d = GetSystemMetrics_(#SM_CYSCREEN)
SystemParametersInfo_(#SPI_GETWORKAREA,0,@DesktopWorkArea.RECT,0)
htTaskbarwin = definecrht.d - DesktopWorkArea\Bottom
OpenWindow(2000,0,0,200,200,"",#PB_Window_SystemMenu|#PB_Window_Invisible)
If OSVersion() = #PB_OS_Windows_XP
 EPframeH.d = WindowX(2000, #PB_Window_InnerCoordinate)
 EPframeL.d = WindowX(2000, #PB_Window_InnerCoordinate)
Else
 EPframeH.d = (WindowX(2000, #PB_Window_InnerCoordinate)*3)
 EPframeL.d = WindowX(2000, #PB_Window_InnerCoordinate)  
EndIf  
Httitre.d = WindowY(2000, #PB_Window_InnerCoordinate)
CloseWindow(2000)
Select typH.b
 Case 1 ;fen avec titre et haut max
  If St = 0  
   Hbw.d = definecrht - (Httitre.d + EPframeH) 
   ProcedureReturn Hbw.d
  Else ; fen sans titre et hauteur max
   Hbw.d = definecrht
   ProcedureReturn Hbw.d 
  EndIf 
 Case 2 ;fen avec titre et barre de tache win visible
  If St = 0   
   Hbw.d = definecrht - (htTaskbarwin  + Httitre.d  + EPframeH)
   ProcedureReturn Hbw.d
  Else  ; fen sans titre et barre de tache win visible
   Hbw.d = definecrht - htTaskbarwin 
   ProcedureReturn Hbw.d
  EndIf 
 Default ;fen quelconque
  If Dh = 0:Dh = 1:EndIf
  If definecrht <> #Hdef
   hwq.d =  Dh * (definecrht /#Hdef)
   ProcedureReturn Hwq.d
  Else
   Hwq.d =  Dh
   ProcedureReturn Hwq.d 
  EndIf  
EndSelect 
EndProcedure

Procedure XWp(lp.d)
definecrlt.d = GetSystemMetrics_(#SM_CXSCREEN)
Select lp.d
 Case 0
  ProcedureReturn 1 ;a gauche
 Default
  If definecrlt <> #Ldef
   ProcedureReturn lp.d * (definecrlt /#Ldef)
  Else
   ProcedureReturn lp.d
  EndIf 
EndSelect 
EndProcedure

Procedure Lw(dL.d)
definecrlarg = GetSystemMetrics_(#SM_CXSCREEN)
Select dL.d
 Case 0 
   If St = 0 ;largeur max avec bordure
    L.d = definecrlarg - ((EPframeL*2)+10)
    ProcedureReturn L.d
   Else ;largeur max sans bordure
    L.d = definecrlarg
    ProcedureReturn L.d
   EndIf 
 Default
  If definecrlarg <> #Ldef
    a.d = (definecrlarg /#Ldef)
    L.d = dL * (definecrlarg /#Ldef)
    ProcedureReturn L.d
   Else 
    L.d = dL
    ProcedureReturn L.d
   EndIf
EndSelect  
EndProcedure

Procedure MLD_openfen(ng.d,x.d,y.d,L.d,H.d,titre$,opt1.l,opt2.l,opt3.l,opt4.l,typH.b)
  If y.d <> 0 :typH.b = 0:EndIf 
  Select #PB_Window_BorderLess
   Case opt1.l,opt2.l,opt3.l,opt4.l
    Global St = 1
   Default
     Global St = 0
     If L.d < 300 And L.d > 0:L.d = 300:EndIf
  EndSelect 
  Select #PB_Window_ScreenCentered 
   Case opt1.l,opt2.l,opt3.l,opt4.l
     typH.b =0
 EndSelect
 If opt1.l = 0 And opt2.l = 0 And opt3.l = 0 And opt4.l = 0; les options ne supporte pas les 0(pas de bouton)
    OpenWindow(ng.d,Xwp(x.d),Ywp(y.d),Lw(L.d),Hw(H.d,typH.b),titre$)
  Else  
   OpenWindow(ng.d,Xwp(x.d),Ywp(y.d),Lw(L.d),Hw(H.d,typH.b),titre$,opt1.l|opt2.l|opt3.l|opt4.l)
 EndIf 
EndProcedure   
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ DEMO ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
;Ces procédures permettent de produire des fenêtres de même rapport de dimensions quelque soit les résolutions d'écrans,et les dimensions des écrans.
;Si x,y,LargeurInterne,HauteurInterne sont a zéro, Il est considéré que la fenêtre est en plein écran avec barre de tache Widow visible ou non. 
;Vous pouvez renseigner uniquement LargeurInterne. A ce moment la hauteur sera plein écran, et la largeur ce que vous souhaitez, 
; mais pas inférieur a 300 pixel, en fenêtre avec bord. (Window limite la largeur. Pour être compatible dans toutes les résolutions) 

;Principe: MLD_openfen(#Fenetre,x,y,LargeurInterne,HauteurInterne,Titre$,opt1,opt2,opt3,opt4,TypH) remplace OpenWindow.
;TypH = 1 fenêtre sur la hauteur total de l'écran. TypH = 2 La fenêtre s'arrete a la barre de Window. TypH = 0 Hauteur quelconque.

MLD_openfen(#Ma_fen,0,0,0,0, "Essai_Ecran",0,0,0,0,2)
MLD_openfen(#Ma_fen1,0,0,318.75,200, "Essai_Ecran",#PB_Window_ScreenCentered,#PB_Window_MinimizeGadget,0,0,0)
StickyWindow(0,1) 
StickyWindow(1,1)
Repeat
Event = WaitWindowEvent()

Until Event = #PB_Event_CloseWindow
Amusez vous bien

Michel
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Fenêtres facile

Message par Micoute »

Bonsoir MLD, c'est du beau travail que tu nous a pondu là et j'ai été surpris qu'une fenêtre de 1920 x 1080 tienne sur mon écran de 1400 x 768.

Merci énormément pour ce partage que je trouve très pratique, car je pense que ça fonctionne dans les deux sens.
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 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
MLD
Messages : 1097
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Fenêtres facile

Message par MLD »

@ Micoute

Merçi, mais tu peux aussi descendre en 800X600
Les deux constantes Ldef = 1920 et #Hdef = 1080 sont uniquement là pour avoir une base de calcul.
Bientôt quand j'aurais un peu de temps tu verras que les gadgets suivront le même chemin.
J'ai déja fais cela pour certaines de mes applications, mais c'est tellement imbriqué dans le code, que ce n'est pas exploitable pour le moment tel-que.
Le but final c'est de pouvoir joindre sous une forme ou une autre, un enssemble de procédures permettant, que l'on soit sous n'importe quelle définition avec n'importe quel DPI quand une interface est crée quelle soit visible de manière identique partout sur n'importe quel matériel. Pour le moment Window uniquement.
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Fenêtres facile

Message par Micoute »

Salut MLD, je pense, si j'ai bien compris, tu souhaites donc que, quelque soit la résolution, avoir le même aspect sur l'écran et non pas un écran de 80 caractères x 25 lignes comme les ordinateurs des années 80 !

Seulement, plus on a une petite résolution et plus gros sont les pixels, ça risque de faire des marches d'escalier ! Tu imagines du 320 x 200 sur un écran 32 pouces !

Mais, comme tu dis que tu l'as déjà fait, donc je ne m'inquiète pas, c'est quand même bien d'avoir des spécialistes sur ce forum, petit par le nombre de membres actifs, mais très grand par l'entraide et l'ambiance qui y règne.
Dernière modification par Micoute le mar. 18/févr./2014 10:35, modifié 1 fois.
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 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
MLD
Messages : 1097
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Fenêtres facile

Message par MLD »

@ Micoute

Non sans les layouts. Même principe que les fenêtres, tu programme les gadgets comme tu le souhaite, ensuite ça suit le redimensionnement de la fenêtre en fonction de la résolution et du DPI.
Mais encore une foi pour certains gadgets pas de problème, pour d'autres galère.
Répondre