CM63
Messages postés3Date d'inscriptionmercredi 20 décembre 2006StatutMembreDernière intervention21 décembre 2006
-
20 déc. 2006 à 22:22
CM63
Messages postés3Date d'inscriptionmercredi 20 décembre 2006StatutMembreDernière intervention21 décembre 2006
-
21 déc. 2006 à 18:54
Salut, voici mon problème (ah c'est en Times new roman) je voudrais dessiner dans un objet image, posé dans un UserForm, mais je n'ai pas accès aux méthodes telles que Pset et autres, qui n'existent que dans les Form (pas user) de VB (pas A). Comment puis-je faire en VBA l'équivalent d'un line x,y, RGB(r,g,b) comme dans une image en VB?
Salut (ha c'est en Verdana ) (faut pas cherche à comprendre)
lol
Faut utiliser les apis du gdi :
Private Declare Function SetPixel Lib "gdi32" Alias "SetPixel" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long
Private Declare Function LineTo Lib "gdi32" Alias "LineTo" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long,
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 21 déc. 2006 à 08:58
Celà ne fera l'affaire qu'à condition de dessiner sur une autre Form et d'affecter à son image sur la 1èere Form le dessin fait sur la seconde. (il dit vouloir mettre son image dans un contrôle image).
Il lui faudra également jouer un peu avec le hdc !!!
Je me demande vraiment si le plus simple pour lui ne serait pas l'insertion d'un objet OLE (paint ou autre) complété par l'utilisation du clipboard...
CM63
Messages postés3Date d'inscriptionmercredi 20 décembre 2006StatutMembreDernière intervention21 décembre 2006 21 déc. 2006 à 14:52
Merci beaucoup, Kenji, je vais essayer. Mais je ne comprends pas pourquoi Jmfmarques dit que je serais obligé de tracer dans une autre Form.
Sinon, en effet, il faut que je sache comment récupérer le... divice contexte je suppose? (hdc) d'une Form (ou UserForm) ou d'un widget Image
inclu dedans.
J'ai vu des contrib là-dessus, mais c'est un peu lourd.
Quant à un objet OLE, peut-on contrôler une exe OLE de Paint, par exemple, depuis VB(A), et comment? Si je peux y faire des set et des get
de pixels, ça me va.
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 21 déc. 2006 à 15:43
Salut cm63,
pourquoi sur une autre form ?
parce que tu dis vouloir afficher ton image dans un contrôle image, pardi.
Si tu dessines sur la Form de travail, ton dessin y figureras !
Comment avec un objet Ole inséré ?
Je ne pratique pas vba depuis plusieurs années, mais me rappelles cette possibilité...
Il est alors inutile d'utiliser des "set" et des "get" de pixels, comme tu dis, puisque tu es directement dans un outil de dessin !
mais, si tu y tenais : là encore, rien ne devrait t'empêcher d'utiliser le clipboard, d'envoyer ton image sur une autre Form (une autre, toujours pour les mêmes raisons) et d'y travailler avec les apis de GDI pour des "get" et des "set" de pixels...
Si tu tiens à dessiner sur une Form plutôt que de passer par un objet OLE, je crois me rappeler que sous VBA, le hdc de la form active est 0... (à vérifier).
A ce propos : ce n'est pas un "divice contexte" mais un "Device Context" ... (donc un contexte de dispositif, que ce dispositif soit matériel ou virtuel).
Je regrette de ne pas avoir le VBA (je t'aurais volontiers montré comment s'y prendre et celà m'aurait amusé...)
Vous n’avez pas trouvé la réponse que vous recherchez ?
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 21 déc. 2006 à 15:58
Tiens,
Je vais essayer en aveugle et tu seras mes yeux et mes doigts ::
mets ce code.
adapte-le au besoin un peu au goût VBA (je crois que l'on dit userform et pas form sous VBA, par exemple) puis essaye de dessiner avec le bouton droit de la souris maintenu pressé.
Et dis-moi ce qui se passe (avec le plus de précisions possibles dans tes explications)
Const PS_DOT = 2
Const PS_SOLID = 0
Private Type POINTAPI
X As Long
Y As Long
End Type
Private Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, lpPoint As POINTAPI) As Long
Private Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
Private Declare Function CreatePen Lib "gdi32" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function SetPixelV Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Byte
Private monhdc As Long
Private Sub form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Do While monhdc = 0
monhdc = GetForegroundWindow()
monhdc = GetDC(monhdc)
Loop
If Button <> 1 Then Exit Sub
hRPen = CreatePen(PS_SOLID, 100, QBColor(I + 8))
DeleteObject SelectObject(Me.hdc, hRPen)
SetPixelV monhdc, X * 1.32, Y * 1.32, 0
'LineTo Me.hdc, 200, 200
DoEvents
End Sub
Private Sub Command1_Click()
For I = 0 To 1000
SetPixelV monhdc, 100, I, &HC000&
Next
End Sub
CM63
Messages postés3Date d'inscriptionmercredi 20 décembre 2006StatutMembreDernière intervention21 décembre 2006 21 déc. 2006 à 18:54
Oui, évidemment, "device context" et non pas "divice contexte", j'avais tapé un peu vite. Merci Jmfmarques,
je vais essayer tes trucs, ça a l'air assez complet.