2009-01-30 6 views
1

Un collègue rencontre une erreur lorsqu'il essaie d'exécuter une application VB6 sur laquelle nous travaillons. L'erreur est "480: impossible de créer l'image AutoRedraw". La documentation de Microsoft indique que «la mémoire disponible pour la propriété AutoRedraw est trop faible, définissez la propriété AutoRedraw sur False et effectuez votre propre redessin dans la procédure d'événement Paint ou réduisez le contrôle PictureBox ou l'objet Form. .. "Comment effectuer mon propre redessin dans l'événement Paint d'un PictureBox VB6?

Réduire le PictureBox n'est pas une option. Je serais heureux de "... effectuer mon propre redessin dans la procédure événementielle de Paint ...", mais je ne suis pas sûr de savoir comment s'y prendre. Quelqu'un peut-il me montrer le chemin?

Répondre

1

Sans détails, ce sera une réponse simpliste. En général, la plupart des programmeurs VB6 débutants utilisent AutoRedraw = True draw pour répondre à certaines entrées. Remplissez quelques données, cliquez sur dessiner, et il apparaît dans la zone d'image.

L'événement click dans le bouton Draw est lié à votre code de dessin. La première étape consiste à déplacer l'appel vers le code de dessin vers l'événement de peinture de l'image. La deuxième étape consiste à remplacer tous les appels au code de dessin par MyPictureBox.Refresh. Actualiser force l'événement Paint de cette zone d'image à se déclencher.

Le problème principal que vous devrez vous poser est que l'événement paint sera déclenché chaque fois que le formulaire aura besoin d'être actualisé. Comme si une fenêtre qui le recouvre est déplacée. Cela signifie que tout problème de vitesse dans votre code de dessin sera exposé. AutoRedraw = True prend ce que vous avez dessiné et place dans un bitmap caché que le PictureBox utilise pour afficher ce que vous avez dessiné. L'événement Paint exécutera chaque étape de votre processus de dessin de sorte que vous devez vous assurer que vous êtes aussi rapide que possible. En fonction de la dynamique de votre application, les problèmes de ralentissement s'aggraveront. Si vous affichez une image statique, le problème n'est pas aussi grave.

+0

Je pense que dans votre deuxième phrase vous voulez dire "la plupart des programmeurs VB6 utilisant AutoRedraw = * Faux * pas Vrai? – MarkJ

+0

Je pense que cela peut être considéré comme une opinion subjective.Utiliser AutoRedraw = True est plus facile pour le programmeur débutant alors que les programmeurs expérimentés ne Les programmeurs débutants comprenaient la plupart des anciens utilisateurs de VB6 –

+0

La raison pour laquelle c'est plus facile pour les débutants parce que vous dessinez juste et il reste là.Un algorithme légèrement plus simple que d'utiliser de la peinture. –

-1

Il existe généralement une liste déroulante d'événements pour votre contrôle dans la fenêtre du code de formulaire. Vous devez sélectionner l'événement de peinture:

Private Sub object_Paint() 

et de remplir votre code pour dessiner sur le PictureBox.

1

Réduire la taille de PictureBox n'est pas une option. Je serais heureux de "... effectuer mon propre redessin dans la procédure événementielle de Paint ...", mais je ne suis pas sûr de savoir comment s'y prendre. Quelqu'un peut-il me montrer le chemin?

C'est facile. Vous venez d'implémenter l'événement _Paint() - de votre formulaire ou PictureBox et dessinez. Parce que vous demandez, je pense que je devrais clarifier ce que fait AutoRedraw-Propeprty. Si elle est définie sur true, vous pouvez "dessiner votre image" comme vous le souhaitez. En plusieurs étapes. Peu importe. S'il a besoin d'être redessiné, par exemple, parce qu'une autre fenêtre était dessus, ça sera fait comme par magie. Le site bas est, c'est lent, pour la partie dessin.

Si AutoRedraw est faux, aucune magie ne se produira. Le Paint() - Événement sera déclenché et vous êtes responsable de dessiner votre image à nouveau. Ce sera beaucoup plus rapide, si votre fenêtre n'est pas "invalidée" (par exemple "couverte") souvent. Ou vous faites beaucoup de dessin.

Ou vous êtes à court de mémoire pour le « espace magique » ;-)

1

Si vous ne me dérange pas de réécrire votre code graphique pour utiliser l'API GDI - cela pourrait être une tâche assez grand - j'ai trouvé ce thread from 2006 dans le groupe de discussion VB6, où Mike Sutton dit en réponse à un problème similaire:

la mise en œuvre de back-tampon de VB utilise un bitmap dépendant Device (DDB) pour stocker les données d'image, ce qui est tout à fait limitée dans quelle mesure il peut être fait. Sur l'ancien OS 'ceci était l'habitude d'être ~ 16mb non compressé taille des données, sur l'OS plus tard cela a été étendu mais est encore assez restrictive.

Une solution consiste à utiliser une des ressources Bitmap indépendant périphérique (DIB) et gérer les GDI vous-même, un coup d'oeil à la DIB article sur mon site pour un exemple de la façon de travailler avec eux.

Je ne l'ai pas essayé moi-même.

Questions connexes