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

Macros et VBA Excel Discussion :

probleme de conversion point to pixel (api gdi32)


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut probleme de conversion point to pixel (api gdi32)
    bonjour a tous

    j'ai un souci avec ce code apparament il fonctionne mais la conversion point to pixel ne semble pas fonctionner
    en effet le decoupage se fait bien mais les proportions ne sont pas bonnes
    si quelqu'un a une idée je suis preneur

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    'patricktoulon
    'module pour faire un trou en forme rectangle dans un userform sur la base d'un control
     
    '"""""""""""""""""""""""""""""""""""""""""""""""""
    'dans le module userform
    'Private Sub UserForm_Activate()
    'decoupage Me
    'End Sub
    '""""""""""""""""""""""""""""""""""""""""""""""""""
     
    ' Régions rectangulaires :
    Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
    ' Fonction permettant d'associé plusieurs régions :
    Declare Function CombineRgn Lib "gdi32" (ByVal hdestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
    ' Fonction permettant d'appliquer les régions sur une form :
    Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
    'Fonction permettant de libérer la mémoire :
    Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
    'fonction permetant de determiner le handle de la form
    Public Declare Function fwa Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
     
    Public handle As Long
     
    '// Constantes d'opérateurs logiques :
     
    '// ET logique :
    Public Const RGN_AND = 1
    '// OU logique :
    Public Const RGN_OR = 2
    '// OU exclusif :
    Public Const RGN_XOR = 3
    '// Soustraction logique :
    Public Const RGN_DIFF = 4
     
     
    'variable representant les nom de regions
    Public rgnCercle As Variant
    Public rgnBarre As Variant
    Public rgncarré As Variant
    Public rgnFinale As Variant
    Const p_to_pix = (1.33333333333333) 'converti lunité en point vers l'unité en pixel
    Sub decoupage(uf As Object)
     
    handle = fwa(vbNullString, uf.Caption)
    'on crée la region complete
    rgncomplete = CreateRectRgn(0, 0, 300 * p_to_pix, 300 * p_to_pix)
     
    'on crée la region qui sera decoupée sur la base du label1 en appliquant le p to pix , _
    chiffre multiplicateur pour convertir  les dimentions de point  en pixels
     
    rgncarré = CreateRectRgn(uf.Label1.Left * p_to_pix, uf.Label1.Top * p_to_pix, _
    uf.Label1.Width * p_to_pix, uf.Label1.Height * p_to_pix)
     
    '// On crée la zone principale :celle ci sera identique au userform
    rgnFinale = rgncomplete
     
    '// On combine toutes les zones :le chiffre 3 corespond au mode exclusif
    CombineRgn rgncomplete, rgncarré, rgnFinale, RGN_XOR
     
    '// On associe la région combinée à la form :
    SetWindowRgn handle, rgnFinale, True
     
    'on vide la memoire des variable regions
    DeleteObject rgnFinale
    DeleteObject rgncarré
    DeleteObject rgncomplete
    End Sub
    merci d'avance

    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  2. #2
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonjour Patrick.

    Je crois que la conversion en pixels est toujours délicate car elle dépend du nombre de twips qui varie d'une machine à l'autre et qui est généralement différent en X et en Y.

    Regarde les méthodes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Window.PointsToScreenPixelsX
    Window.PointsToScreenPixelsY
    Bien cordialement,

    PGZ

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour pgz

    heuh... oui c'est quoi ces variable ou les prend tu dans une api ?

    si oui la quelle
    et puis point toscreen pixel sa me donnerais la dimention de l'ecran et non pas la conversion enfin je ne connais pas ces variables

    d'autre precisions me serait utiles


    merci a toi pour le coup de mains

    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  4. #4
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut
    Le problème ne vient pas de ta conversion, mais de ta définition de région de ton Label, Y2 et X2 ne valent pas juste la heuteur et largeur de ton label, il faut aussi tenir compte de sa position top et left.
    Comme ca
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    'patricktoulon
    'module pour faire un trou en forme rectangle dans un userform sur la base d'un control
     
    '"""""""""""""""""""""""""""""""""""""""""""""""""
    'dans le module userform
    'Private Sub UserForm_Activate()
    'decoupage Me
    'End Sub
    '""""""""""""""""""""""""""""""""""""""""""""""""""
     
    ' Régions rectangulaires :
    Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
    ' Fonction permettant d'associé plusieurs régions :
    Declare Function CombineRgn Lib "gdi32" (ByVal hdestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
    ' Fonction permettant d'appliquer les régions sur une form :
    Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
    'Fonction permettant de libérer la mémoire :
    Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
    'fonction permetant de determiner le handle de la form
    Public Declare Function fwa Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
     
    Public handle As Long
     
    '// Constantes d'opérateurs logiques :
     
    '// ET logique :
    Public Const RGN_AND = 1
    '// OU logique :
    Public Const RGN_OR = 2
    '// OU exclusif :
    Public Const RGN_XOR = 3
    '// Soustraction logique :
    Public Const RGN_DIFF = 4
     
     
    'variable representant les nom de regions
    Public rgnCercle As Variant
    Public rgnBarre As Variant
    Public rgncarré As Variant
    Public rgnFinale As Variant
    Const p_to_pix = 0.75 'converti lunité en point vers l'unité en pixel
    Sub decoupage(uf As Object)
     
    handle = fwa(vbNullString, uf.Caption)
    'on crée la region complete
    rgncomplete = CreateRectRgn(0, 0, 300 / p_to_pix, 300 / p_to_pix)
     
    'on crée la region qui sera decoupée sur la base du label1 en appliquant le p to pix , _
    chiffre multiplicateur pour convertir  les dimentions de point  en pixels
     
    rgncarré = CreateRectRgn(uf.Label1.Left / p_to_pix, uf.Label1.Top / p_to_pix, _
    (uf.Label1.Width + uf.Label1.Left) / p_to_pix, (uf.Label1.Height + uf.Label1.Top) / p_to_pix)
     
    '// On crée la zone principale :celle ci sera identique au userform
    rgnFinale = rgncomplete
     
    '// On combine toutes les zones :le chiffre 3 corespond au mode exclusif
    CombineRgn rgncomplete, rgncarré, rgnFinale, RGN_XOR
     
    UserForm1.Show False
    '// On associe la région combinée à la form :
    SetWindowRgn handle, rgnFinale, True
     
    'on vide la memoire des variable regions
    DeleteObject rgnFinale
    DeleteObject rgncarré
    DeleteObject rgncomplete
    Au passage, pour être passé a coté il y a quelques temps, au lieu de multiplier par 1.333333..., il est préférable de diviser par 0.75 (1/0.75 = 1.33333...)

    Tu auras un dernier truc a gérer c'est la bordure et le bandeau haut de ton userform qu'il faudra intégrer a tes calcul de position, tu vas vite voir en exécutant le code.

    Il existe en effet d'autre méthodes de conversion, plus exact que /0.75, mais je ne les maîtrise pas (plus), je les ai utilisé en VB4 pour faire joujou avec les régions moi aussi il y a quelques années.
    J'avais même fait un code (monstrueux d'autant que je me souvienne) qui suivait les pixels d'une forme dessiné en N&B dans un Bmp et créer la région correspondante, je peux peut être le retrouver si ça t’intéresse.

    [Edit]
    Bon je retrouve plus mes vieux projets vb , ils sont peut être sur un cd dans un coin, mais j'ai vu des méthodes supers intéressantes sur le woueb, surtout une, elle n'est pas codé en vb par contre.
    La personne par d'une image en N&B, la zone à supprimer est en noir par exemple, il lit l'image ligne par ligne (scanline en vb je crois) il prend en compte les pixels noir et forme des régions rectangulaires de pixels isolés ou de pixels consécutifs. Il regroupe ensuite toutes ces régions dans une régions global. La zone en noir de l'image devient donc la région qui sera appliqué a ton objet. En écrivant ça je me demande si y'a pas une fonction qui fait ça dans les API... Mask... quelque chose
    [/Edit]
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  5. #5
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonsoir,

    Citation Envoyé par patricktoulon Voir le message
    heuh... oui c'est quoi ces variable ou les prend tu dans une api ?
    Dans la bibli Excel, il y a une classe Window qui a les méthodes en question.
    Voici un bout de code qui illustre le truc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    With ActiveWindow
        .Zoom = 50
        Range("A1") = "Zoom 50 : " & .PointsToScreenPixelsX(1) & " x " & .PointsToScreenPixelsY(1)
     
        .Zoom = 100
        Range("A2") = "Zoom 100 : " & .PointsToScreenPixelsX(1) & " x " & .PointsToScreenPixelsY(1)
     
    End With
    ce qui affiche
    Zoom 50 : 22 x 180
    Zoom 100 : 27 x 186
    C'est pour illustrer le pb de conversion en pixels.

    Cordialement,

    PGZ

  6. #6
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut
    Si mes souvenirs sont bons, c'est même pour cette raison que Visual Basic (pas le Application) utilisait comme unité le Twips, cette unité n’était pas fonction du nombre de pixel par cm et pour convertir en pixel, il fallait utiliser une constante, qui fournissait le nombre de Twips de l'écran (hauteur et largeur) et l'utiliser pour faire le ratio en fonction du nombre de pixels affichés sur l'écran (hauteur et largeur également) .... enfin je suis pas sur à 100%, faudrait faire quelques recherches
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  7. #7
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Salut Quaz.

    Voir sur msdn, conversions des unités Twips, ...
    Extrait
    Voici deux tableaux de conversion des unités de mesure utilisées pour la
    manipulation des coordonnées graphiques ou des polices de caractères.

    Dans chacun de ces tableaux, l'abréviation TP désigne le nombre de Twips
    par Pixel qui est la mesure couramment employée pour indiquer la
    résolution video utilisée ainsi que celle d'une imprimante: il s'agit
    donc d'une unité dépendante du périphérique. On distingue la résolution
    horizontale et la résolution verticale: par exemple 640*480, 800*600.
    Sous Visual Basic, on obtient ces valeurs respectivement par
    [Screen|Printer].TwipsPerPixelX et [Screen|Printer].TwipsPerPixelY.


    Tableau de correspondance entre Twips, Point, Pouce, millimètre et Pixel:

    |Twips Point Pouce mm Pixel
    Twips |1 1/20 1/1440 25.4/1440 1/TP
    Point |20 1 1/72 25.4/72 20/TP
    Pouce |1440 72 1 25.4 1440/TP
    mm |1440/25.4 72/25.4 1/25.4 1 1440/TP*25.4

    Pixel |TP TP/20 TP/1440 25.4*TP/1440 1
    Voilà.

    Mais dans Excel, encore une fois, on a la méthode PointsToScreenPixelsX (ou Y) de l'objet Window. Sinon, c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Screen.TwipsPerPixelX (ou Y)
    Cordialement,

    PGZ

Discussions similaires

  1. probleme de conversion
    Par hay2006 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 19/12/2005, 10h02
  2. probleme de conversion float en int
    Par murreya dans le forum C++
    Réponses: 2
    Dernier message: 17/12/2005, 15h27
  3. [datapump] probleme de conversion d'une base paradox
    Par plante20100 dans le forum Bases de données
    Réponses: 4
    Dernier message: 04/11/2005, 18h39
  4. Probleme de conversion de dates
    Par manu00 dans le forum Langage
    Réponses: 4
    Dernier message: 29/05/2005, 00h00
  5. [Math][Integer] Problème de conversion
    Par deathwing dans le forum API standards et tierces
    Réponses: 8
    Dernier message: 11/05/2004, 17h01

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