Gestion résolution écran

Soyez le premier à donner votre avis sur cette source.

Snippet vu 9 473 fois - Téléchargée 51 fois

Contenu du snippet

encor une modif résolution écran mais avec la gestion de la fréquence et du mode couleur. Il marche sous VB6 et W2k. Faites moi savoir si il tourne sous les autres Win.

Source / Exemple :


Public oldX, oldY, oldR, oldC As Long                             ' Résolution écran avant application

Private Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" ( _
                        ByVal lpszDeviceName As Long, ByVal iModeNum As Long, lpDevMode As Any) As Boolean
Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" ( _
                        lpDevMode As Any, ByVal dwFlags As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
                     ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Private Declare Function FindWindowA Lib "user32" (ByVal lpClassName As String, _
                                    ByVal lpWindowName As String) As Long

Private Declare Function SetWindowPos Lib "user32" (ByVal handleW1 As Long, _
                                    ByVal handleW1InsertWhere As Long, ByVal w As Long, _
                                    ByVal x As Long, ByVal y As Long, ByVal z As Long, _
                                    ByVal wFlags As Long) As Long

Private Const CCHDEVICENAME = 32
Private Const CCHFORMNAME = 32

Private Const DM_BITSPERPEL = &H40000
Private Const DM_WIDTH = &H80000
Private Const DM_HEIGHT = &H100000
Private Const DM_DISPLAYFREQUENCY = &H400000
Private Const WM_DEVMODECHANGE = &H1B
Private Const HWND_BROADCAST = &HFFFF&
Private Const HWND_DESKTOP = 0

Const TOGGLE_HIDEWINDOW = &H80
Const TOGGLE_UNHIDEWINDOW = &H40

Private Type DEVMODE
    dmDeviceName As String * CCHDEVICENAME
    dmSpecVersion As Integer
    dmDriverVersion As Integer
    dmSize As Integer
    dmDriverExtra As Integer
    dmFields As Long
    dmOrientation As Integer
    dmPaperSize As Integer
    dmPaperLength As Integer
    dmPaperWidth As Integer
    dmScale As Integer
    dmCopies As Integer
    dmDefaultSource As Integer
    dmPrintQuality As Integer
    dmColor As Integer
    dmDuplex As Integer
    dmYResolution As Integer
    dmTTOption As Integer
    dmCollate As Integer
    dmFormName As String * CCHFORMNAME
    dmUnusedPadding As Integer
    dmBitsPerPel As Integer
    dmPelsWidth As Long
    dmPelsHeight As Long
    dmDisplayFlags As Long
    dmDisplayFrequency As Long
End Type

Dim dmEcran As DEVMODE
Dim dynSetting() As String

Dim handleW1 As Long

' =================================== DEBUT DU CODE ================================
'---- Change la résolution écran

Public Sub ResolutionEcran(Chge As Boolean, sgWidth As Long, sgHeight As Long)
    Dim blTMP As Boolean
    Dim lgTMP As Long
    Dim compt As Integer
          
    If Chge = True Then                                                               ' modification de la résolution - début du programme
  
        blTMP = EnumDisplaySettings(0, -1, dmEcran)                   ' stockage de la résolution écran avant modif
        oldX = dmEcran.dmPelsWidth
        oldY = dmEcran.dmPelsHeight
        oldR = dmEcran.dmDisplayFrequency
        oldC = dmEcran.dmBitsPerPel
        
        If Not oldX = sgWidth Then                                                ' si la résolution est différente de la résolution demandée
        
            lgTMP = 0
            cpt = 0                                                                        ' compteur d'affichage
    
            ReDim dynSetting(0)
            Do                                                                              ' parcours tous les affichages possibles
               blTMP = EnumDisplaySettings(0, lgTMP, dmEcran)
                lgTMP = lgTMP + 1
                
                If dmEcran.dmPelsWidth = sgWidth Then                  ' si résolution demandée
                    dynSetting(cpt) = Right("000" & dmEcran.dmBitsPerPel, 3) & _
                                              Right("000" & dmEcran.dmDisplayFrequency, 3)
                    cpt = cpt + 1
                    ReDim Preserve dynSetting(cpt)
                End If
            Loop Until Not blTMP
            
            ' right(dynSetting(cpt - 1),3)                                                        ' Fréquence maximale acceptée par la carte
            ' left(dynSetting(cpt - 1),3)                                                          ' Mode couleur maxi accepté par la carte
  
            For compt = cpt - 1 To 0 Step -1
                If CLng(Left(dynSetting(compt), 3)) = oldC Then
                    If CLng(Right(dynSetting(compt), 3)) = oldR Then               ' si même mode couleur et même fréquence
                        Exit For
                    Else                                                                               ' même mode couleur mais fréquence inférieure
                        If CLng(Right(dynSetting(compt), 3)) > 71 Then              ' contrainte sur la fréquence 72Hz
                            Exit For
                        End If
                    End If
                Else                                                                                   ' mode couleur inférieur
                    If CLng(Right(dynSetting(comp), 3)) = oldR Then
                        Exit For
                    Else
                        If CLng(Right(dynSetting(comp), 3)) > 71 Then               ' contrainte sur la fréquence 72Hz
                            Exit For
                        End If
                    End If
                End If
            Next
            If cpt = 0 Then
            'alerte : votre système ne supporte pas la résolution demandée
                End
            End If
            
            Call Change(sgWidth, sgHeight, CLng(Left(dynSetting(compt), 3)), CLng(Right(dynSetting(compt), 3)))
        End If
    
    Else                                                                                  ' modification de la résolution - fin du programme
            Call Change((oldX), (oldY), (oldC), (oldR))
    End If
End Sub

Private Sub Change(width As Long, height As Long, pel As Long, freq As Long)

            dmEcran.dmFields = DM_BITSPERPEL Or DM_WIDTH Or DM_HEIGHT Or DM_DISPLAYFREQUENCY
            dmEcran.dmPelsWidth = width
            dmEcran.dmPelsHeight = height
            dmEcran.dmBitsPerPel = pel
            dmEcran.dmDisplayFrequency = freq
       
            lgTMP = ChangeDisplaySettings(dmEcran, 0)
            Call SendMessage(HWND_BROADCAST, WM_DEVMODECHANGE, 0, 0)
End Sub

Conclusion :


A mettre dans un module et appeler la
Sub ResolutionEcran(Chge As Boolean, sgWidth As Long, sgHeight As Long)

A voir également

Ajouter un commentaire Commentaires
laurent207 Messages postés 101 Date d'inscription jeudi 31 janvier 2002 Statut Membre Dernière intervention 11 avril 2008
3 avril 2006 à 10:25
J'ai un problème, ton code fonctionne très bien sauf que si la résolution d'écran n'a jamais était changé dans propriété->paramétre, le code ne fonctionne pas.
ngfr Messages postés 2 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 9 août 2004
2 févr. 2004 à 10:07
Bonjour.

Pourrais-tu faire un zip STP?
car je ne compren pa où il faut mettre le code.
C'est tout le code qu'il mettre dans un module ou seulement le début?
Où dois-je mettre le début du code? comment l'appelé?

Merci
cs_DNBPROCESS Messages postés 13 Date d'inscription jeudi 2 janvier 2003 Statut Membre Dernière intervention 14 septembre 2004
28 août 2003 à 00:40
Bien vu comme ca je retrouve pas mon ecran sur 32*32 !! (:

madame n'aime pas quand c'est tout petit !

merci.
cs_Calou Messages postés 15 Date d'inscription jeudi 26 octobre 2000 Statut Membre Dernière intervention 23 avril 2010
30 juil. 2003 à 12:00
J'ai un petit soucis, ça marche tres bien (sous W2K-SP3) en ce concerne les fonctionnalités, mais les changements ne sont pas conservés au redémarage de la machine.
Si qlqu'un à une idée ?
cs_Tidus Messages postés 78 Date d'inscription dimanche 21 avril 2002 Statut Membre Dernière intervention 7 juillet 2003
28 sept. 2002 à 21:11
Marche sous XP ...
Afficher les 7 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.