IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Stocker un imprim ecran sous bmp avec l'api windows


Sujet :

Windows

  1. #1
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut Stocker un imprim ecran sous bmp avec l'api windows
    Bonjour je suis sous VBA Access

    Je désire récupérer un imprim écran et le stocker dans un fichier bitmap.

    J'arrive à envoyer la capture vers le presse papier.

    A l'aide de l'api GetClipboardData, je récupere le handle. Mais à partir de là, pas moyen de stocker l'image.

    Si une bonne ame charitable avait une idée

  2. #2
    mat.M
    Invité(e)
    Par défaut
    Voilà j'ai trouvé ça dans le MSDN

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    HDC hdc; 
    HDC hdcMem; 
    RECT rc; 
    //.....
    
            hdcMem = CreateCompatibleDC(hdc); 
                        if (hdcMem != NULL) 
                        { 
                            if (OpenClipboard(hwnd)) 
                            { 
                                hbm = (HBITMAP) 
                                   GetClipboardData(CF_BITMAP); 
                                SelectObject(hdcMem, hbm); 
                                GetClientRect(hwnd, &rc); 
     
                                BitBlt(hdc, 0, 0, rc.right, rc.bottom, 
                                    hdcMem, 0, 0, SRCCOPY); 
                                CloseClipboard(); 
                            } 
                            DeleteDC(hdcMem); 
                        }
    C'est en C mais facilement transposable à VB ; il faut utiliser l'API Viewer.
    Les PictureBox présentent des HDC et il est possible de faire un "BitBlt" dessus



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    Public Declare Function CreateCompatibleDC Lib "gdi32" Alias "CreateCompatibleDC" (ByVal hdc As Long) As Long
    
    Public Declare Function OpenClipboard Lib "user32" Alias "OpenClipboard" (ByVal hwnd As Long) As Long
    
    Public Declare Function GetClipboardData Lib "user32" Alias "GetClipboardDataA" (ByVal wFormat As Long) As Long
    
    Public Declare Function SelectObject Lib "gdi32" Alias "SelectObject" (ByVal hdc As Long, ByVal hObject As Long) As Long
    
    Public Declare Function GetClientRect Lib "user32" Alias "GetClientRect" (ByVal hwnd As Long, lpRect As RECT) As Long
    
    
    Public Declare Function BitBlt Lib "gdi32" Alias "BitBlt" (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) As Long
    
    Public Declare Function CloseClipboard Lib "user32" Alias "CloseClipboard" () As Long
    
    Public Declare Function DeleteDC Lib "gdi32" Alias "DeleteDC" (ByVal hdc 
    
    As Long) As Long
    Public Const CF_BITMAP = 2
    
    Public Type RECT
            Left As Long
            Top As Long
            Right As Long
            Bottom As Long
    End Type
    
    '...................
    Dim hdc As Long
    Dim hdcMem As Long
    Dim hbm As Long  'HBitmap
    Dim rc As RECT 
    
    
     hdcMem = CreateCompatibleDC(hdc)
    If hdcMem<>0 Then  
       if OpenClipboard Me.Hwnd Then
                             
    hbm=GetClipboardData CF_BITMAP 
                                SelectObject hdcMem, hbm 
                                GetClientRect Me.Hwnd,rc 
     
                                BitBlt hdc, 0, 0, rc.right, rc.bottom, 
                                    hdcMem, 0, 0, SRCCOPY 
                                CloseClipboard 
                            End If 
                            DeleteDC hdcMem 
    End If

  3. #3
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Enfait ça c'est le bout de code que j'ai déja. Mais soucis... sous VBA :

    Pas de picturebox, encore moins de HDC et pire les controles ne fournissent pas leur handle

    Le souci est en fait bel et bien au niveau de la sauvegarde

  4. #4
    mat.M
    Invité(e)
    Par défaut
    Pas de PictureBox ?
    Mais sous Access , Word il ya ça non ?
    Sinon il existe aussi des méthodes AUTOMATION il ya l'interface IPicture

    Une autre solution c'est de sauvegarder ce qu'il ya dans le presse-papier en image BMP et de la recharger dans le formulaire Access par exemple qui contient une PictureBox

  5. #5
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    En fait je suis sous Access

    Pas de PictureBox ?
    Non, ce ne sont pas les mêmes objets qu'en VB

    Sinon il existe aussi des méthodes AUTOMATION il ya l'interface IPicture
    Au début, je m'étais tourner vers cette solution et notamment IPictDisp que je peut sauvegarder. Seul hic, impossible d'instancier un nouvel objet IpictDisp ni StdPicture valide pour pouvoir y rediriger la copie.

    Une autre solution c'est de sauvegarder ce qu'il ya dans le presse-papier en image BMP et de la recharger dans le formulaire Access par exemple qui contient une PictureBox
    Le clipboard n'est pas disponible non plus

  6. #6
    mat.M
    Invité(e)
    Par défaut
    je crois que la seule solution c'est de développer un Active X avec Vb ou faire une dll en C

  7. #7
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 669
    Points
    10 669
    Billets dans le blog
    3
    Par défaut
    Mais le code de mat.M tu peux l'utiliser ? C'est du Win32, rien de spécifique à VB(A) si ce n'est la syntaxe.
    Normalement il te reste juste à l'enregistrer dans un fichier:
    http://www.vb-helper.com/howto_memory_bitmap_save.html

  8. #8
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Merci aurélien. C'est tout juste ce lien qui me manquait

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. imprime ecran sous SUSE
    Par medora dans le forum Applications et environnements graphiques
    Réponses: 1
    Dernier message: 05/05/2007, 11h10
  2. Réponses: 2
    Dernier message: 24/12/2005, 11h37
  3. Tutorial d'initiation a la programmation avec l'API Windows
    Par mcdonald dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 16/09/2005, 17h20
  4. Réponses: 3
    Dernier message: 09/11/2004, 10h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo