Création cadre 3d avec api win32

Soyez le premier à donner votre avis sur cette source.

Vue 9 213 fois - Téléchargée 409 fois

Description

Ce code écrit dans 1 module vous permet de créer de jolis rectangles en 3D avec seulement des APIs Win32, sans utiliser des contrôles. Donc ressources peu sollicitées & meilleure rapidité!

Source / Exemple :


Dans un module .Bas:

Option Explicit

Public Type RECT
  Left As Long
  Top As Long
  Right As Long
  Bottom As Long
End Type

Public Const BDR_RAISEDOUTER = &H1
  Public Const BDR_SUNKENOUTER = &H2
    Public Const BDR_RAISEDINNER = &H4
      Public Const BDR_SUNKENINNER = &H8
        Public Const BDR_OUTER = &H3
          Public Const BDR_INNER = &HC
            Public Const BDR_RAISED = &H5
              Public Const BDR_SUNKEN = &HA
                Public Const EDGE_RAISED = (BDR_RAISEDOUTER Or BDR_RAISEDINNER)
                  Public Const EDGE_SUNKEN = (BDR_SUNKENOUTER Or BDR_SUNKENINNER)
                    Public Const EDGE_ETCHED = (BDR_SUNKENOUTER Or BDR_RAISEDINNER)
                      Public Const EDGE_BUMP = (BDR_RAISEDOUTER Or BDR_SUNKENINNER)
                        Public Const BF_LEFT = &H1
                          Public Const BF_TOP = &H2
                        Public Const BF_RIGHT = &H4
                      Public Const BF_BOTTOM = &H8
                    Public Const BF_TOPLEFT = (BF_TOP Or BF_LEFT)
                  Public Const BF_TOPRIGHT = (BF_TOP Or BF_RIGHT)
                Public Const BF_BOTTOMLEFT = (BF_BOTTOM Or BF_LEFT)
              Public Const BF_BOTTOMRIGHT = (BF_BOTTOM Or BF_RIGHT)
            Public Const BF_RECT = (BF_LEFT Or BF_TOP Or BF_RIGHT Or BF_BOTTOM)
          Public Const BF_DIAGONAL = &H10
        Public Const BF_MIDDLE = &H800
      Public Const BF_SOFT = &H1000
    Public Const BF_ADJUST = &H2000
  Public Const BF_FLAT = &H4000
Public Const BF_MONO = &H8000

'Dessine des bordures (relevés,creuse,etc...). Essayez les divers paramètres
'(EDGE_SUNKEN, BDR_RAISEDINNER etc..) pour voir toutes les possibilités de cette fonction.
'Malheureusement, elle ne permet pas de définir la couleur des bordures.
'Les couleurs sont celles qui sont définies dans les paramètres systèmes de Windows:
Public Declare Function DrawEdge Lib "user32" _
      (ByVal hdc As Long, _
      qrc As RECT, _
      ByVal edge As Long, _
      ByVal grfFlags As Long) As Boolean

'Crée un bitmap compatible avec le bitmap du contexte de périphérique passé en paramètre.
'Avant de pouvoir dessiné dans un contexte de périphérique vous devez créer un bitmap
'et le sélectionner dans le DC:
Public Declare Function CreateCompatibleBitmap& Lib "gdi32" _
      (ByVal hdc As Long, _
      ByVal nWidth As Long, _
      ByVal nHeight As Long)

'Crée un contexte de périphérique en mémoire compatible avec celui passé en paramètre:
Public Declare Function CreateCompatibleDC& Lib "gdi32" (ByVal hdc As Long)

'Supprime le DC crée avec CreateCompatibleDC et libère les ressources utilisées par ce DC:
Public Declare Function DeleteDC& Lib "gdi32" (ByVal hdc As Long)

'Sélectionne un objet dans un DC. Avant de pouvoir être utilisé, un objet
'(crayon, pinceau, bitmap, police, région) doit être sélectionné dans le DC.
'La valeur de retour est l'objet qui était sélectionné précédemment dans le DC.
'Conservez cette valeur dans une variable pour remettre le DC dans son état initial
'à la fin des opérations de dessin:
Public Declare Function SelectObject& Lib "gdi32" _
      (ByVal hdc As Long, _
      ByVal hObject As Long)

'Crée un pinceau de la couleur spécifiée:
Public Declare Function CreateSolidBrush& Lib "gdi32" (ByVal crColor As Long)

'Supprime un objet (crayon, pinceau, bitmap etc...) et libère les ressources utilisées par
'cet objet:
Public Declare Function DeleteObject& Lib "gdi32" (ByVal hObject As Long)

'Remplit un rectangle dans un DC avec le pinceau passé en paramètre:
Public Declare Function FillRect& Lib "user32" _
      (ByVal hdc As Long, _
      lpRect As RECT, _
      ByVal hBrush As Long)

'Récupère les dimensions client d'une fenêtre (en pixel) [Dimension de la
'fenêtre sans les bordures et la barre de titre] et les charges dans la structure lpRect:
Public Declare Function GetClientRect& Lib "user32" _
      (ByVal Hwnd As Long, _
      lpRect As RECT)

'Convertit une couleur OLE en une valeur de couleur compatible avec les API.
'Sans cette fonction et si vous utilisez une couleur système de VB (ex:&H8000000D&),
'vous obtiendrez du noir:
Public Declare Function OleTranslateColor Lib "oleaut32.dll" _
      (ByVal lOleColor As Long, _
      ByVal lHPalette As Long, _
      lColorRef As Long) As Long

'Transfère le bitmap d'un DC source (hSrcDC) dans un DC de destination (hDestDC).
'Vous pouvez effectuer des opération d'étirement, de réduction, de copie, d'inversion etc...
'BitBlt est beaucoup plus rapide que PaintPicture puisque le bloc de mémoire contenant
'l'image est envoyé directement à la carte graphique, qui se charge des opérations pendant
'que Windows continue ses autres traitements. Essayer aussi différentes valeurs pour dwRop:
Public Declare Function BitBlt& Lib "gdi32" _
      (ByVal hDestDC As Long, _
      ByVal x As Long, _
      ByVal y As Long, _
      ByVal nWidth As Long, _
      ByVal nHeight As Long, _
      ByVal hSrcDC As Long, _
      ByVal xSrc As Long, _
      ByVal ySrc As Long, _
      ByVal dwRop As Long)

Public Declare Function GetWindowDC Lib "user32" (ByVal Hwnd As Long) As Long

Public Enum FormeDuCadre
  [Bordure en 3D enfoncé] = BDR_SUNKENOUTER
  [Bordure en 3D ressortie] = BDR_RAISEDINNER
  [Cadre en 3D enfoncé] = (BDR_SUNKENOUTER Or BDR_SUNKENINNER)
  [Cadre en 3D ressortie] = (BDR_RAISEDOUTER Or BDR_RAISEDINNER)
End Enum

'Opération de Raster (ROP) Constante BitBlt
Public Const SRCCOPY& = &HCC0020   'Destination = Source
Public Const SRCAND& = &H8800C6  'Destination = Source AND Destination
Public Const SRCERASE& = &H440328  'Destination = Source AND (NOT Destination)
Public Const SRCINVERT& = &H660046   'Destination = Source XOR Destination
Public Const SRCPAINT& = &HEE0086    'Destination = Source OR Destination
Public Const DSTINVERT& = &H550009   'Destination = NOT Destination
Public Const NOTSRCCOPY& = &H330008  'Destination = NOT Source
Public Const NOTSRCERASE& = &H1100A6 'Destination = (NOT Source)AND(NOT Destination)
Public Const MERGECOPY& = &HC000CA   'Destination = Source AND Pattern
Public Const MERGEPAINT& = &HBB0226  'Destination = (NOT Source) OR Destination
Public Const PATCOPY& = &HF00021   'Destination = Motif
Public Const PATINVERT& = &H5A0049   'Destination = Motif XOR Destination
Public Const PATPAINT& = &HFB0A09  'Destination = (NOT Source)OR Motif OR Destination
Public Const BLACKNESS& = &H42       'Destination = 0
Public Const WHITENESS& = &HFF0062   'Destination = Blanc

Public Sub Draw(ByVal Hwnd As Long, ByVal x As Long, ByVal y As Long, _
ByVal RectWidth As Long, ByVal Rectheight As Long, ByVal RectBackColor As Long, RectStyle As FormeDuCadre)

On Error Resume Next
Dim r As RECT
Dim bmpMem As Long
Dim oldBmp As Long
Dim hDcMem As Long
Dim Brush As Long
Dim oldBrush As Long
Dim frmRect As RECT
Dim lColor
Dim lHdcSrc As Long

'Récupère le DC sur lequel on doit dessiner le cadre
lHdcSrc = GetWindowDC(Hwnd)

'récupère les dimensions de la feuille
GetClientRect Hwnd, frmRect

'création d'un DC en mémoire compatible avec celui de la fenêtre
hDcMem = CreateCompatibleDC(lHdcSrc)
'création d'un bitmap compatible avec le bitmap du dc de la feuille et de la même dimension que le cadre à tracer
bmpMem = CreateCompatibleBitmap(lHdcSrc, RectWidth, Rectheight)
'récupération de l'ancien bmp et sélection du nouveau
oldBmp = SelectObject(hDcMem, bmpMem)
OleTranslateColor RectBackColor, 0, lColor
'création d'un pinceau de la couleur d'arriere plan de la feuille
Brush = CreateSolidBrush(lColor)
'récupération de l'ancien pinceau et sélection du nouveau dans le DC
oldBrush = SelectObject(hDcMem, Brush)
'remplit le DC en mémoire avec le nouveau pinceau
FillRect hDcMem, frmRect, Brush

With r
r.Right = RectWidth
r.Bottom = Rectheight
End With

'dessin des cotés du rectangle dans le DC en mémoire
DrawEdge hDcMem, r, RectStyle, BF_RECT

'dessin du contenu du DC en mémoire dans le DC source
BitBlt lHdcSrc, x, y, RectWidth, Rectheight, hDcMem, 0, 0, SRCCOPY

'remet le DC en mémoire dans son état initial
SelectObject hDcMem, oldBrush
SelectObject hDcMem, oldBmp
'supprime le pinceau et le bitmap crée pour libérer la mémoire (NE PAS OUBLIER!!!)
DeleteObject Brush
DeleteObject bmpMem
'supprime le DC en mémoire (NE PAS OUBLIER!!!)
DeleteDC hDcMem
End Sub
##################################################
Dans une Form:

Option Explicit

Private Sub Form_Paint()
'Les nombres représentent:
' 1) Distance entre la bordure gauche de la fenêtre & celle du rectangle;
' 2) Distance entre la bordure supérieure de la fenêtre & celle du rectangle;
' 3) Longueur du rectangle;
' 4) Largeur [ou Hauteur] du rectangle;
' 5) Valeur de la couleur choisie;
' 6) Type de cadre choisi:
  Draw Me.Hwnd, 5, 25, 300, 250, vbRed, [Cadre en 3D enfoncé]
End Sub

Conclusion :


L'auteur je n'en suis point.
Sur le site http://www.ifrance.com/hlbactivex/ il se trouve.
Pierrick CRAMPON son nom est.
Sur VBFrance l'équivalent de ce code il n'y en a point.
Un lieu d'apprentissage & de partage ce site est.
Commenté le code l'est abondamment.
D'image il n'y en a point, désolé, je le suis!... ;-P

Allez bonne prog'!!!!!!!!!!

Gogogogogogogogoooooooooooo

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_bigane
Messages postés
46
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
12 février 2004
-
No, le code n'est pas nul, il est commenté et est très utile pour comprendre les API graphiques. Merci.
Note 7 (plus d'exemple pour appliquer tes commentaires serait un plus)
cs_bigane
Messages postés
46
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
12 février 2004
-
No, le code n'est pas nul, il est commenté et est très utile pour comprendre les API graphiques. Merci.
Note 7 (plus d'exemple pour appliquer tes commentaires serait un plus)
ma aranger sa!
Enfin 1 note à 10, c'est drôlement & bizarrement sympa qd même de sa part!... 8-}
Euh, qui c'est qui m'as mis ça??...

Enfin tant pis... Y aura tjrs des imbéciles qui séviront sur Terre! Pour ceux qui s'y connaissent 1 peu en religion, récitons tous ensemble: "Seigneur, prends pitié d'eux!..."
;-)

Allez bonne prog'!!!!!!!!!!

Gogogogogogogogoooooooooo

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.