Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Problèmes avec les API graphiques de windows [ Windows / API ] (Kite37)

dimanche 27 mai 2007 à 18:12:27 | Problèmes avec les API graphiques de windows

Kite37

Bonjour !
J'ai trouvé des morceaux de code sur différents sites touchant au API graphique présents dans windows, mais je ne sais pourquoi je n'arrive pas a en faire marcher un seul ..

Que se soit SetPixel ou bitblt par exemple, j'obtient a chaque fois la meme erreur.
Voici les déclarations des deux API :

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

Declare Function SetPixel Lib "gdi32" (byval hDC as long, ByVal X as long, ByVal Y as long, ByVal color as long) As Long.

Travaillant sur VB 2005, voici des exemples de code que j'ai testé, sans succès :

setpixel(form1.handle, 50,50, color)  (color étant défini par la fonction RGB auparavant dans mon programme), le but étant ici de faire aparaitre un pixel de la couleur voulue au point de coordonnées 50/50 sur ma form.

bitblt(form1.handle, 50,50,picSource.width, picSource.height, picSource.handle, 0,0, SRCCOPY)
SRCCOPY étant une constante de l'API = &HCC0020 , le but ici étant de copier l'image d'une picturebox vers une autre simplement.

Cependant, dans chacun des cas, une erreur survient :

PInvokeStackImbalance a été détecté
Message: Un appel à la fonction PInvoke 'WindowsApplication1!WindowsApplication1.Form1::SetPixel' a déséquilibré la pile. Cela peut se produire, car la signature PInvoke managée ne correspond pas à la signature cible non managée. Vérifiez que la convention d'appel et les paramètres de la signature PInvoke correspondent à la signature non managée cible.

Quelqu'un maniant bien ces APIs en VB 2005 pourrait-il me dépanner? car je ne trouve vraiment rien sur MSDN qui me sorte de ce mauvais pas :s

dimanche 27 mai 2007 à 18:58:27 | Re : Problèmes avec les API graphiques de windows

casy

Membre Club

Si tu travaille en VB2005, il te faut modifier toutes les déclarations des fonctions de l'api.

En effet, à moins que ce soit explicitement mentionner, les codes que tu trouvera ne sont par pour la plateforme .Net. Sous .Net certains types de variables ont changés. C'est le cas notamment des Long. Sur une structure Win32 (API windows, VB6, ...) un long fait 32 bits soit 4 octets. Sur une plateforme Win64 ou sur la plateforme .Net, un long fait 64 bits soit 8 octets.

Dans toutes les déclarations, il faut donc que tu remplace tous les long par leur équivalent 32bits sous .Net soit au choix Integer ou Int32

---- Sevyc64  (alias Casy) ----
# LE PARTAGE EST NOTRE FORCE #

dimanche 27 mai 2007 à 19:28:54 | Re : Problèmes avec les API graphiques de windows

Kite37

hum ta solution corrigé bien l'erreur, mais cependant je n'arrive pas a afficher les pixel et les image normalement obtenues a l'écran :s La form sur laquelle je suis sensé dessiner reste vierge ..

lundi 28 mai 2007 à 09:09:19 | Re : Problèmes avec les API graphiques de windows

Renfield

Administrateur CodeS-SourceS

en VB6, je t'aurais dit de faire un Refresh, et de vérifier ton AutoRedraw...

form1.handle => c'est le hWnd
il faut passer un hDc aux API

Renfield
Admin CodeS-SourceS- MVP Visual Basic

lundi 28 mai 2007 à 11:04:40 | Re : Problèmes avec les API graphiques de windows

Kite37

Réponse acceptée !
Je pense avoir trouvé : une API de windows est la suivante : Private Declare Function GetDC Lib "user32" ( _ ByVal hwnd As Integer) As Integer Ainsi, pour SetPixel, en faisant : SetPixel(GetDC(Me.Handle), x, y, color) au lieu de : SetPixel(Me.Handle, x, y, color) Nous obtenons enfin un résultat concluant ! A vérifier maintenant si c'est aussi le cas pour BitBlt, mais cela ne devrait poser aucun problème, GetDC fournissant le hDC inexistant en .NET :)

lundi 28 mai 2007 à 11:18:32 | Re : Problèmes avec les API graphiques de windows

Kite37

Réponse acceptée !
Je viens cependant de m'apercevoir d'une chose : GetDc étant assez long d'exécution il est préférable de mettre le hDC du controle voulu dans une variable puis d'utiliser celle-ci, comme suit : Dim hdc As Int32 = GetDC(Me.Handle) puis SetPixel(hdc, x, y, color) En effet, en 1 seconde, le code du message précédent ne trace que 2400 points, alors que celui que je viens de donner en trace près de 73000 !

lundi 28 mai 2007 à 12:21:35 | Re : Problèmes avec les API graphiques de windows

Renfield

Administrateur CodeS-SourceS
Réponse acceptée !

le probleme est que tu ne libère pas ton DC, et que, par conséquent, tu risque de provoquer un crash rapidement...

ReleaseDc

SetPixelV ira plus vite encore....


Renfield
Admin CodeS-SourceS- MVP Visual Basic


lundi 28 mai 2007 à 12:23:19 | Re : Problèmes avec les API graphiques de windows

Kite37

Réponse acceptée !
Private Declare Function ReleaseDC Lib "user32" ( _ ByVal hwnd As Integer, _ ByVal hdc As Integer) As Integer ça peut servir ;)

lundi 28 mai 2007 à 12:32:45 | Re : Problèmes avec les API graphiques de windows

Kite37

Réponse acceptée !
De plus, après vérification, la seule différence entre SetPixel et SetPixelV est la valeur de retour (long pour la couleur dans un cas, boolean dans l'autre). Donc meme avec SetPixelV, le problème de libération du hDC se serait posé ^ ^. De plus, MSDN nous dit que SetPixelV est censé être plus rapide que SetPixel, mais après plusieurs test l'écart de rapidité apparait comme négligeable. (moins de 200 point d'écart, quelques soit la durée d'exécution du code). Je pense donc que les API SetPixel, GetDc et ReleaseDc suffisent ^ ^



Cette discussion est classé dans : long, api, signature, setpixel, bitblt


Répondre à ce message

Sujets en rapport avec ce message

[.NET 2] APi : Recupérer titre de la fenetre active [ par fdiedler2000 ] Bonjour,Je voudrais récupérer le titre de la fentre windows active mais j'ai une erreur :  Private Declare Function GetForegroundWindow Lib "user32" ( Menu Dynamique - Utilisation API setwindowlong [ par cricri95 ] Bonjour, Voila j'ai créé des menus dynamiquement à partir d'une base de données (en Visual Basic 6).Je gère les clicks sur les menus deroulants avec s Manette de jeu et visual basic 2005 [ par sidne_II ] Bonsoir Je n'arrive pas à utiliser l'API pour lire le joystick avec la foncion    joyGetPos (0, manette_info)  Public Structure JOYINFO        Public Setparent dans VB .NET 2005 [ par math083 ] Salut tout le monde !J'ai un petit problèmeAvant sous vb 6 je pouvais utiliser la fonction setparent en utilisant l'api : Declare Function SetParent L Fonction BitBlt .. [ par Kite37 ] Bonjour !En regardant de nombreux code de jeux (référence a ceux de EBArtSoft par exemple :p) j'ai trouvé une fonction graphique qui m'interresse beau Déplacement souris [ par bimbo777 ] Bonjour à tous,Je suis débutant et je souhaiterai pouvoir automatiser le déplacement de ma souris (je verrai les clicks plus tard...)J'ai un soucis av Utilisation de SendMessage-constante API [ par Trappiste ] Bonjour.Pour mon application, j'aimerai changer la couleur de fond d'un HScroll lorsque l'utilisateur sélectionne une certaine plage.Comme la propriét [VB.NET] Coord souris/API/PictureBox/ [ par jajapremier ] bonjourje voudrais recuperer les coordonées du curseur dans une picture box. pour cela j'utilise l'API GetCursorPosmais pas bien apperement, je vous l Fonction BitBlt ??? [ par liban123 ] Salut a tous!La fonction" bitblt (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC A


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,421 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.