2010-05-31 6 views
1

c'est ma première question ici. J'essaie de créer un contrôle de numérotation en tant que contrôle utilisateur personnalisé dans VB.NET. J'utilise VS2008. Jusqu'à présent, j'ai réussi à faire pivoter l'image en utilisant graphics.rotatetransform.VB.NET utilisateur personnalisé contrôle graphique rotation

Cependant, cela tourne tout. Maintenant, j'ai un bitmap pour le cadran qui devrait rester stable et un autre bitmap pour l'aiguille dont j'ai besoin de tourner.

Jusqu'à présent, j'ai essayé ceci:

Dim gL As Graphics = Graphics.FromImage(bmpLongNeedle) 
    gL.TranslateTransform(bmpLongNeedle.Width/2, bmpLongNeedle.Height * 0.74) 
    gL.RotateTransform(angleLongNeedle) 
    gL.TranslateTransform(-bmpLongNeedle.Width/2, -bmpLongNeedle.Height * 0.74) 
    gL.DrawImage(bmpLongNeedle, 0, 0) 

Si je comprends bien, l'image de l'aiguille doit être mis en rotation à angle « angleLongNeedle » bien que je placer l'image pivotée à 0,0. Cependant, le résultat est que l'aiguille ne se dessine pas sur le contrôle.

Est-ce que je pourrais faire quelque chose pour savoir où je pourrais me tromper?

Merci à l'avance

Répondre

0

Tout d'abord, pourquoi avez-vous allouez l'objet Graphics à partir d'un bitmap que vous allez ensuite dessiner sur les graphiques? Cela n'a pas de sens.

Dim gL As Graphics = Graphics.FromImage(bmpLongNeedle) 
' … ' 
gL.DrawImage(bmpLongNeedle, 0, 0) 

Qu'est-ce que vous voulez sans doute est un contexte graphique pour toute l'image . Vous appliquez ensuite les transformations et dessinez l'image bmpLongNeedle. Deuxièmement, vos traductions semblent inversées: dans la première étape, vous devez déplacer l'image vers l'origine (0, 0); puis vous le faites pivoter, puis le déplacez vers l'arrière. Ainsi, la transformation devrait ressembler à ceci:

gL.TranslateTransform(-bmpLongNeedle.Width * 0.5, -bmpLongNeedle.Height * 0.5) 
gL.RotateTransform(angleLongNeedle) 
gL.TranslateTransform(bmpLongNeedle.Width * 0.5, bmpLongNeedle.Height * 0.5) 

Avis l'ordre des TranslateTransform inversé s. Aussi, pourquoi avez-vous traduit par 0,74 fois la hauteur, au lieu de la moitié?

0

oh le bitmap pour l'aiguille a le point de pivotement à une hauteur de 0,74 *.

peut-être que je devrais avoir posté cela avant. mais c'est ce que j'ai fait.


Public Class Altimeter 
    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs) 
     Dim bmpBezel As New Bitmap("{path}\Altimeter_Background.bmp") 
     Dim bmpLongNeedle As New Bitmap("{path}\LongNeedle.bmp") 
     Dim rect2 As New Rectangle(e.ClipRectangle.X, e.ClipRectangle.Y, e.ClipRectangle.Width, e.ClipRectangle.Height)

'make transparent bmpBezel.MakeTransparent(Color.Yellow) bmpLongNeedle.MakeTransparent(Color.Yellow) Dim angleLongNeedle As Single = (Altitude/50) * 360 'draw bezel e.Graphics.DrawImage(bmpBezel, rect2) 'rotate long needle Dim gL As Graphics = Graphics.FromImage(bmpLongNeedle) gL.TranslateTransform(bmpLongNeedle.Width/2, bmpLongNeedle.Height * 0.74) gL.RotateTransform(angleLongNeedle) gL.TranslateTransform(-bmpLongNeedle.Width/2, -bmpLongNeedle.Height * 0.74) gL.DrawImage(bmpLongNeedle, 0, 0) MyBase.OnPaint(e) End Sub

J'utilise e.graphics.drawimage pour peindre l'image entière. Je ne comprends pas vraiment ce que vous avez dit d'avoir un objet graphique pour toutes les images et ensuite dessiner l'aiguille? avez-vous un pseudo code? merci

Questions connexes