peug
Messages postés232Date d'inscriptionmercredi 25 octobre 2000StatutMembreDernière intervention 5 octobre 2012
-
5 mars 2007 à 16:51
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 2021
-
6 mars 2007 à 18:55
Bonjour,
cela fait plusieurs jours que je tourne en rond sur un problème de print preview sur la base de l'exemple suivant : http://support.microsoft.com/kb/193379/fr J'ai modifié ce code pour qu'il travaille en pixels afin d'utiliser les API que je préféère largement au Line, print de VB.
peut être pourrez-vous m'aider sur l'un de mes nombreux problèmes. J'ai créé une fonction DrawRectangle(hdc, X, Y, width, height....) mais dans ce cas :
for n ...
'draw API
DrawRectangle2 picture1.hdc, X1, Y1, m, 200, vbBlue, vbBlue
'draw VB
picture1.Line (X1, Y2)-Step(m, 200), vbRed, B
next
Cependant un décalage existe systématiquement avec API. comme si il ne respecté par le picture scale que j'ai défini... Est-ce la cas ?
peug
Messages postés232Date d'inscriptionmercredi 25 octobre 2000StatutMembreDernière intervention 5 octobre 2012 5 mars 2007 à 18:13
voili
Public Sub DrawRectangle2(ByRef hDC As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal lWidth As Long, ByVal lHeight As Long, _
ByVal BackColor As Long, ByVal ColorLine As Long, ByVal Ratio As Double)
Dim lpPoint(5) As POINTAPI
Dim lRectbrush As Long
Dim lholdRectbrush As Long
Dim lrec As Long
'Crée un brush Solide et rempli
lRectbrush = CreatePen(0, 1, ColorLine)
'Mémorise la brush utilisé par défaut du hDC courant
lholdRectbrush = SelectObject(hDC, lRectbrush)
'Desine le rectangle plein
lrec = Polygon(hDC, lpPoint(0), UBound(lpPoint))
'Restauration
lrec = SelectObject(hDC, lholdRectbrush)
lrec = DeleteObject(lRectbrush)
end sub
Private Function ConvertTwipsToPixels(ByVal lhdc As Long, ByVal lTwips As Long, ByVal lDirection As Long) As Long
' http://support.microsoft.com/kb/210590/fr Dim lPixelsPerInch As Long
If (lDirection = 0) Then
lPixelsPerInch = GetDeviceCaps(lhdc, LOGPIXELSX)
Else
lPixelsPerInch = GetDeviceCaps(lhdc, LOGPIXELSY)
End If
ConvertTwipsToPixels = lTwips / 1440 * lPixelsPerInch
end if
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 5 mars 2007 à 18:36
Redonne ton code (le 1er) car il est incomplet, déjà :
DrawRectangle2 picture1.hdc, X1, Y1, m, 200, vbBlue, vbBlue
envoie 7 paramètres
et
DrawRectangle2(ByRef hDC As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal lWidth As Long, _
ByVal lHeight As Long, ByVal BackColor As Long, ByVal ColorLine As Long, ByVal Ratio As Double)
Je ne vois par ailleurs pas pourquoi tu fais les frais de Polygon alors que l'API de windows t'offre du plus simple pour un rectangle !
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 5 mars 2007 à 19:01
Tiens,
Mets ce petit bout de code dans un mini projet, lance, regarde, analyse, comprends et sers-t-en ayi lieu de ta fonction Polygon.
Const PS_DOT = 2
Const PS_SOLID = 0
Const RGN_AND = 1
Const RGN_COPY = 5
Const RGN_OR = 2
Const RGN_XOR = 3
Const RGN_DIFF = 4
Const HS_DIAGCROSS = 5
Private Declare Function CreatePen Lib "gdi32" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long
Private Declare Function Rectangle Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 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 Sub Form_Activate()
Me.ScaleMode = vbPixels
Me.AutoRedraw = True
Me.Move 0, 0, Screen.Width, Screen.Height
Dim hRPen As Long
hRPen = CreatePen(PS_SOLID, 3, vbBlue)
DeleteObject SelectObject(Me.hdc, hRPen)
Rectangle Me.hdc, 200, 200, 800, 600
DeleteObject hRPen
End Sub
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 5 mars 2007 à 23:11
Plus là ?
Dommage !
Tu aurais remarqué un léger débordement du rouge, en bas et à gauche.
Celà est un minuscule bug de VB (pas de l'Api de Windows) en te rappelant que le rouge, vient de l'utilisation de la méthode Line et par de la fonction rectangle...
VB se trompe d'un pixel (dieu sait pourquoi)
corrigeons donc VB :
Me.Line (200, 200)-(800, 600), vbRed, B ===>>> Me.Line (200, 200)-(800-1, 600-1), vbRed, B
et la superposition sera parfaite !
A NOTER : nopus avions là une épaisseur de 3 et nous avons corrigé de 1. La correction (1) serait la même avec n'importe quelle autre épaisseur de trait
peug
Messages postés232Date d'inscriptionmercredi 25 octobre 2000StatutMembreDernière intervention 5 octobre 2012 6 mars 2007 à 11:03
Merci,
J'utilise le polygon car il ne crée pas de débord contrainement à l'API Rectangle ! un peu comme le me.Line.
par rapport à ma question initiale, j'ai constaté que le dessin via API ne respecté par la scale appliqué à un object. Ce qui maintenant me semble presque normale. Le méthode LINE, CIRCLE propre à VB se cale sur le scale de l'objet. L'envoie sur un hdc de API-rectangle passe au dessus de cela et dessine sur le hdc indiqué...
J'utilise les API par rapport au line de VB car elles donnent beaucoup plus de possiblité (sans parler de GDI+) VB reste "basic" sans API.