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
Michel