Afficheur matriciel modulable

Description

Bonjour, me revoici avec une source plus sérieuse ^^

AFFICHEUR MATRICIEL MODULABLE ne veux pas dire grand chose,
attendez que je vous explique ^^

Peut être connaissez vous les jeux tels que Battle For Wesnoth ou AdvanceWars
Les Cartes sont constituées d'un tableau de cases. La carte comporte au total un certain nombre de cases, ce qui empeche l'affichage de la totalité.
Donc, l'ecran afiche un petit nombre de cases, et par effet de déplacement, on accede a n'importe quelle case (zone) de la carte.
C'est encore flou ? ^^, téléchargez et essayez le projet.

Je me suis proposé de créer un composant générique permetant d'utiliser ce principe dans n'importe quel projet.
C'est, tada, l' AFFICHEUR

L'afficheur est un control utilisateur que l'on pose sur un objet.
les propriétés :
- Nb_Cases_x = nombre total de Colones
- Nb_Cases_y = nombre total de Lignes
- Nb_cases_visibles_x = nombre de colones visibles
- Nb_cases_visibles_y = nombre de lignes visibles
Le composant se redimensionne pour etre pil poil adapté aux nombre de colonnes à afficher.

- Largeur_Bordure_Défilement
c'est le nombre de pixels de la largeur de la zone de défilement.
zone de défilement entre bord de l'objet et la ligne verte
ps : la ligne verte permet la mise en place du composant, elle disparait à l'exécution.

- TempoScroll = Nombre de millisecondes avant que l'action de scrolling se renouvelle. Évite un défilement trop rapide --> incontrôlable.

- Cases(X,Y) as cCASE = permet d'acceder aux cases et de modifier leurs propriétés publiques

- Sub Redraw = lance le réafichage de l'AFFICHEUR.
l'afficheur se reafiche automatiquement, uniquement dans les cas de redimensionnement, ou de changement des nombres de case.
ceci permet de modifier plusieurs cases et de reaficher apres --> gain de performances.

Les Evenements :
Click, DblClick, MoseMove, CaseChange, MoseDown, MouseUp
(il me reste a gérer correctement lorsque la souris quitte le composant)

J'ai dit MODULABLE, et ça l'est :
la seule chose à la quelle l'utilisateur ai besoin de toucher c'est l'objet cCASE
on lui ajoute des propriétés publics (dans mon exemple, le bck_color et le brd_color). et on code la Sub "Paint" de sorte a afficher ce que l'on veu sur la case. Pour ce faire travailler sur le DC : hDC

besoin d'aide sur les DC ?
allez voir ici :
http://edais.mvps.org/Tutorials/GDI/DC/Files/EDais%20-%20Using%20Device%20Contexts%20(DCs)%20in%20Visual%20Basic.pdf

c tout ^^

Source / Exemple :


Public Bck_Color As ColorConstants
Public Brd_Color As ColorConstants

Private Sub Paint()
    '--------------------------------------------------------------------
    'ici se dessine la case en fonction de ses propriétés
    '--------------------------------------------------------------------
    Dim Brush As Long
    Dim hBrush As Long
    Dim Rgn As Long
        Rgn = CreateRectRgn(0, 0, p_largeur, p_hauteur)
    
    'le fond est Blanc
    Brush = CreateSolidBrush(Bck_Color)
    hBrush = SelectObject(hDC, Brush)
        Call FillRgn(hDC, Rgn, Brush)
    Call SelectObject(hDC, hBrush)
    Call DeleteObject(Brush)
    
    'ajouter un cadre
    Brush = CreateSolidBrush(Brd_Color)
    hBrush = SelectObject(hDC, Brush)
        Call FrameRgn(hDC, Rgn, Brush, 1, 1)
    Call SelectObject(hDC, hBrush)
    Call DeleteObject(Brush)
    
    'ajouter un texte
    Dim Font As Long
    Dim hFont As Long
    Dim Text As String
        Text = p_colone & "-" & p_ligne
    Font = CreateFont(20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "Times New Roman")
    hFont = SelectObject(hDC, Font)
        Call TextOut(hDC, 10, CLng((p_hauteur - 20) / 2), Text, Len(Text))
    Call SelectObject(hDC, hFont)
    Call DeleteObject(Font)
    
    Call DeleteObject(Rgn)
    '--------------------------------------------------------------------
    'fin du dessin
    '--------------------------------------------------------------------
    
    Call SelectObject(hDC, hDIB)
End Sub

Conclusion :


Il est vrai que j'ai fait pas mal de spaghettis.
Le code risque donc ne pas être très clair. j'en suis désolé ^^

Un autre exemple d'utilisation serait un afficheur de miniatures genre explorer ou encore un visualisateur de diapositives (en ne mettant 1x1 visible et 1xN total) ...
Le reste dépends de l'imagination de l'utilisateur ;)

tout commentaire est le bienvenu.
cordialement,

Codes Sources

A voir également

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.