Afficheur defilant

Soyez le premier à donner votre avis sur cette source.

Vue 5 933 fois - Téléchargée 545 fois

Description

Me revoici avec la petite sœur de "AFFICHEUR MATRICIEL MODULABLE"

cette source contient un UserCotrol Fait maison permetant de créer un support pour dessiner (Device Context) associé à une gestion du déplacement.

On défini une dimension (Largeur_totale, Hauteur_totale).
Un DC est créé à cette dimension. (par l'intermediaire d'un DIB mais ca c mon problème ^^)
La fenetre possède, de fait une dimension.

Si le DC est plus petit que l'Afficheur, aucun deplacement n'est possible.
Si le DC est plus grand que l'Afficheur, le défilement est automatique si la souris passe au dessus des bordures (de défilement)

On peut définir la bordure de sorte à avoir un dégradé de vitesse de défilement.
Cela permet concrètement de faire en sorte, que au centre le défilement soit lent (Brd_Vit_Min) et augmente en se rapprochant du bord de l'Afficheur (Brd_Vit_Min + Brd_Vit_Pas * index_zone)

l'interret, c'est qu'il ne reste plus que le graphisme à traiter pour les futurs projets.
on utilise des API sur le DeviceContext : AFFICHEUR.DC
une fois le graphisme modifié, on met l'affichage à jour : AFFICHEUR.ReDraw

on peut également utiliser la méthode MiniVue(PictureBox) pour afficher la position de la Zone visible par rapport au DC enier.

le plus simple c'est de lancer mon code, ça sa s'expliquera de soit.

Source / Exemple :


'-------------------------------------------------------------------------------
' les API
'-------------------------------------------------------------------------------
Private Type POINTAPI
    X As Long
    Y As Long
End Type

Private Enum FILLMODE
    ALTERNATE = 1
    WINDING = 2
End Enum

Private Enum RGN_COMBINE
    RGN_AND = 1     ' Intersection
    RGN_OR = 2      ' Union
    RGN_XOR = 3     ' Union - Intersection
    RGN_DIFF = 4    ' Rgn1 - Rgn2
    RGN_COPY = 5    ' Clone la Region
End Enum

Private Enum HASH_TYPE
    HS_HORIZONTAL = 0   'Horizontal lines.
    HS_VERTICAL = 1     'Vertical lines.
    HS_FDIAGONAL = 2    'Diagonal lines from the upper-left to the bottom-right.
    HS_BDIAGONAL = 3    'Diagonal lines from the bottom-left to the upper-right.
    HS_CROSS = 4        'Cross pattern of horizontal and vertical lines.
    HS_DIAGCROSS = 5    'Cross pattern of perpendicular diagonal lines.
End Enum

Private Enum PEN_STYLE
    PS_SOLID = 0
    PS_DOT = 2
End Enum

Private Declare Function CreateCompatibleDC Lib "GDI32.dll" (ByVal hDC As Long) As Long
Private Declare Function DeleteDC Lib "GDI32.dll" (ByVal hDC As Long) As Long

Private Declare Function BitBlt Lib "GDI32.dll" (ByVal hdcDest As Long, ByVal nXDest As Long, ByVal nYDest As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hdcSrc As Long, ByVal nXSrc As Long, ByVal nYSrc As Long, ByVal dwRop As Long) As Long
    
Private Declare Function CreateRectRgn Lib "gdi32" (ByVal nLeftRect As Long, ByVal nTopRect As Long, ByVal nRightRect As Long, ByVal nBottomRect As Long) As Long
Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal nLeftRect As Long, ByVal nTopRect As Long, ByVal nRightRect As Long, ByVal nBottomRect As Long, ByVal nWidthEllipse As Long, ByVal nHeightEllipse As Long) As Long
Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal nLeftRect As Long, ByVal nTopRect As Long, ByVal nRightRect As Long, ByVal nBottomRect As Long) As Long
Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
Private Declare Function CombineRgn Lib "GDI32.dll" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
Private Declare Function PtInRegion Lib "gdi32" (ByVal hRgn As Long, ByVal X As Long, ByVal Y As Long) As Long

Private Declare Function FrameRgn Lib "GDI32.dll" (ByVal hDC As Long, ByVal hRgn As Long, ByVal hBrush As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function PaintRgn Lib "gdi32" (ByVal hDC As Long, ByVal hRgn As Long) As Long
Private Declare Function FillRgn Lib "GDI32.dll" (ByVal hDC As Long, ByVal hRgn As Long, ByVal hBrush As Long) As Long

Private Declare Function CreatePen Lib "GDI32.dll" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long
Private Declare Function CreateSolidBrush Lib "GDI32.dll" (ByVal crColor As Long) As Long
Private Declare Function CreateHatchBrush Lib "GDI32.dll" (ByVal nIndex As Long, ByVal crColor As Long) As Long
Private Declare Function CreatePatternBrush Lib "GDI32.dll" (ByVal hBitmap As Long) As Long
Private Declare Function GetDCBrushColor Lib "GDI32.dll" (ByVal hDC As Long) As Long
Private Declare Function SetDCBrushColor Lib "GDI32.dll" (ByVal hDC As Long, ByVal crColor As Long) As Long

Private Declare Function SelectObject Lib "GDI32.dll" (ByVal hDC As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteObject Lib "GDI32.dll" (ByVal hObject As Long) As Long
'-------------------------------------------------------------------------------

Option Explicit

Private Sub AFFICHEUR1_DblClick(X As Single, Y As Single)
    Dim Rgn As Long
    Dim Brush As Long
    Dim hBrush As Long
            
    With AFFICHEUR1
        Brush = CreateSolidBrush(vbRed)
        hBrush = SelectObject(.DC, Brush)
        Rgn = CreateEllipticRgn(X - 5, Y - 5, X + 5, Y + 5)
            Call FillRgn(.DC, Rgn, Brush)
        Call DeleteObject(Rgn)
        Call SelectObject(.DC, hBrush)
        Call DeleteObject(Brush)
    
        .ReDraw
    End With
End Sub

Private Sub AFFICHEUR1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    AFFICHEUR1.Enable_Deplacement = False
End Sub

Private Sub AFFICHEUR1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    AFFICHEUR1.Enable_Deplacement = True
End Sub

Private Sub AFFICHEUR1_VueChange()
    Call AFFICHEUR1.MiniVue(P, vbRed, vbGreen)
End Sub

Private Sub Form_Load()
    With AFFICHEUR1
        .Largeur_totale = 1000
        .Hauteur_totale = 1000
        
        Dim Rgn As Long
        Dim Brush As Long
        Dim hBrush As Long
            
        Brush = CreateSolidBrush(vbWhite)
        hBrush = SelectObject(.DC, Brush)
        Rgn = CreateRectRgn(0, 0, .Largeur_totale, .Hauteur_totale)
            Call FillRgn(.DC, Rgn, Brush)
        Call DeleteObject(Rgn)
        Call SelectObject(.DC, hBrush)
        Call DeleteObject(Brush)
        
        Dim T(1 To 4) As POINTAPI
            T(1).X = 0
                T(1).Y = 0
            T(2).X = .Largeur_totale
                T(2).Y = .Hauteur_totale
            T(3).X = .Largeur_totale
                T(3).Y = 0
            T(4).X = 0
                T(4).Y = .Hauteur_totale
        Rgn = CreatePolygonRgn(T(1), 4, 1)
        Brush = CreateSolidBrush(vbBlack)
        hBrush = SelectObject(.DC, Brush)
            Call FrameRgn(.DC, Rgn, Brush, 3, 3)
        Call DeleteObject(Rgn)
        Call SelectObject(.DC, hBrush)
        Call DeleteObject(Brush)
        
        .ReDraw
    End With
End Sub

Conclusion :


Il n'y a pas de bug a ma connaissance, mais je ne les ai pas vraiment cherché non plus.

Si quelqu'un connais une méthode (API) permettant de copier une image(DC) sur une autre (DC) EN LA REDIMENSIONNANT, qu'il me le dise, cela permettrait de faire évoluer la "MiniVue"

tout commentaire est le bienvenu.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

sethlaerce
Messages postés
30
Date d'inscription
mardi 21 août 2007
Statut
Membre
Dernière intervention
4 octobre 2010
-
Merci à toi Flocreate pour l'initiative.
je vais le télécharger et le regarder de plus prés.
à plus
Flocreate
Messages postés
307
Date d'inscription
lundi 17 juillet 2006
Statut
Membre
Dernière intervention
27 mai 2012
3 -
ce projet est purement à titre d'exemple.
les taches rouges servent à montrer une modification de l'affichage associé à l'utilisation de l'evenement DblClick(x,y) (ce pourrait être Click MouseUp ou MouseDown).

cordialement,
mimiZanzan
Messages postés
301
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
17 décembre 2017
-
Merci de tes explications. Ce n'est pas évident à utiliser, en effet...
A quoi servent les petites taches rouges qui se forment quand on double-clic sur l'afficheur?
Cordialement
Flocreate
Messages postés
307
Date d'inscription
lundi 17 juillet 2006
Statut
Membre
Dernière intervention
27 mai 2012
3 -
En effet, j'ai du mal à être clair ^^
Il peut servir à faire des cartes comme dans "age of empire"

Le déplacement est géré automatiquement par le composant. C'est dailleur là son seul intérrêt. Lorsque la souris se trouve au dessus du composant et pret d'un bord, le déplacement se produit de sorte à "recentrer" la zone sous la souris.

Dans l'exemple que je donne, je trace une croix (permet de bien voir le déplacement)
Cette croix est tracée avec une Région rectangulaire et tracée aevc le FrameRgn.

On trace des choses avec les API windows de "Device Context"
sur le DC afficheur.DC
Une fois le tracé fait, il faut mettre à jour avec AFFICHEUR.redraw

Pour le déplacement, on peut juste définir la vitesse de déplacement, la largeur de la bordure.
c'est symbolisé par le cadre vert sur le control en mode dévelopement. (rouge si le Enable_deplacement est mis à faux)

Ce qui est peut-être dur a visualiser c'est que en mode dévellopement (pas en RUN), on ne peut rien afficher sur le composant. Il faut le faire par API dans le CODE. (moi ds mon exemple, je le fait dans le Main et dans le AFFICHEUR1_DblClick)
mimiZanzan
Messages postés
301
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
17 décembre 2017
-
Salut Flocreate,

Excuse-moi, j'ai chargé et exécuté ton code, mais je ne comprends pas à quoi il peut bien servir...Les explications que tu donnes ne m'ont pas aidé. Comment dessiner par ex, et comment gérer les déplacements?
Peux-tu être plus clair sur l'utilisation de ce code?
Merci d'avance.

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.