Problème MsChart & Clipboard [Résolu]

pedro93 10 Messages postés lundi 2 mai 2005Date d'inscription 3 juin 2008 Dernière intervention - 21 avril 2008 à 15:17 - Dernière réponse : pedro93 10 Messages postés lundi 2 mai 2005Date d'inscription 3 juin 2008 Dernière intervention
- 3 juin 2008 à 12:18
Bonjour,

je cherche à enregistrer un graphique MsChart en image (peu import le format)
Après de nombreuses recherches et essais infructueux je me résous enfin à demander de l'aide sur ce forum.

J'ai donc essayer de passer par le presse papier pour sauvegarder mon graph :

    Private Sub SauverGraph(ByVal path As String)
        AxMSChart1.EditCopy()
        PictureBox1.Image = Clipboard.GetData(DataFormats.Bitmap)
        PictureBox1.Image.Save(path)

    End Sub

Or, le débugg me renvoie l'erreur suivante quand j'appèles ma fonction :
"FatalExecutionEngineError a été détecté
Message: Le runtime a rencontré une erreur irrécupérable. L'adresse de l'erreur était 0x79f89a89 sur le thread 0x110. Le code d'erreur est 0xc0000005. Il s'agit peut-être d'un bogue dans le CLR ou dans les portions unsafe ou non vérifiables du code utilisateur. Les causes courantes de ce bogue incluent des erreurs de marshaling utilisateur pour COM-Interop ou PInvoke, erreurs susceptibles d'endommager la pile."

Si quelqu'un à la mondre idée pour résoudre ce problème, ou une autre méthode de sauvegarde vers image d'un mschart (si possible sans OCX ou DLL en plus) je serais preneur.

Merci beaucoup.
Afficher la suite 

12 réponses

Répondre au sujet
najlaa85ma 2 Messages postés mercredi 1 février 2006Date d'inscription 20 mai 2008 Dernière intervention - 20 mai 2008 à 22:26
+3
Utile
bonsoir dro93
Bon finalement g pu  imprimer Ms chart directement  avec choix d'imprimante et mise en page
bon voila le code
 tu dois ajouter au form le composant printdocument("printdocument1")
et printdialogue("printdialogue1)
 "Graf" c est le nom de ton mschart



Private






Declare



Function
BitBlt

Lib



"gdi32.dll"



Alias



"BitBlt"
(

ByVal
_hdcDest


As
IntPtr,

ByVal
nXDest

As



Integer
,

ByVal
nYDest

As
_


Integer
,

ByVal
nWidth

As



Integer
,

ByVal
nHeight

As



Integer
,

ByVal
_hdcSrc


As
IntPtr,

ByVal
nXSrc

As



Integer
,

ByVal
nYSrc

As



Integer
, _


ByVal
dwRop

As
System.Int32)

As



Long






Dim
memoryImage

As
Bitmap


Private



Sub
CaptureScreen()


Dim
mygraphics

As
Graphics = Graf.CreateGraphics()


Dim
s

As
Size Graf.SizememoryImage


New
Bitmap(s.Width, s.Height, mygraphics)


Dim
memoryGraphics

As
Graphics = Graphics.FromImage(memoryImage)


Dim
dc1

As
IntPtr = mygraphics.GetHdc


Dim
dc2

As
IntPtr = memoryGraphics.GetHdcBitBlt(dc2, 0, 0, Graf.ClientRectangle.Width, _

Graf.ClientRectangle.Height, dc1, 0, 0, 13369376)

mygraphics.ReleaseHdc(dc1)

memoryGraphics.ReleaseHdc(dc2)


End



Sub






Private



Sub
CaptureScreen_donnee()


Dim
mygraphics

As
Graphics = DataGrid1.CreateGraphics()


Dim
s

As
Size DataGrid1.SizememoryImage


New
Bitmap(s.Width, s.Height, mygraphics)


Dim
memoryGraphics

As
Graphics = Graphics.FromImage(memoryImage)


Dim
dc1

As
IntPtr = mygraphics.GetHdc


Dim
dc2

As
IntPtr = memoryGraphics.GetHdcBitBlt(dc2, 0, 0, Graf.ClientRectangle.Width, _

DataGrid1.ClientRectangle.Height, dc1, 0, 0, 13369376)

mygraphics.ReleaseHdc(dc1)

memoryGraphics.ReleaseHdc(dc2)


End



Sub






Private



Sub
PrintDocument1_PrintPage(

ByVal
sender

As
System.Object, _


ByVal
e

As
System.Drawing.Printing.PrintPageEventArgs)

Handles
_PrintDocument1.PrintPage

e.Graphics.DrawImage(memoryImage, 0, 0)


End



Sub






Private



Sub
DiagrammeToolStripMenuItem_Click(

ByVal
sender

As
System.Object,

ByVal
e

As
System.EventArgs)

Handles
DiagrammeToolStripMenuItem.ClickCaptureScreen()


Dim
psDlg

As



New
PageSetupDialog


Dim
LePageSettings

As



New
PageSettingspsDlg.PageSettings = LePageSettings

psDlg.ShowDialog()

PrintDocument1.DefaultPageSettings = LePageSettings


Dim
dlg

As



New
PrintDialogdlg.Document = PrintDocument1


Dim
result

As
DialogResult = dlg.ShowDialog()


If
(result = System.Windows.Forms.DialogResult.OK)

Then

PrintDocument1.Print()







End



If






End



Sub

''''copier coller le programme et n oublie d ajouter les composants que je t'avais dit
bonne reception.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de najlaa85ma
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 21 avril 2008 à 23:52
0
Utile
salut,
un petit clear du clipboard avant?..

ps : il n'y a plus de propriété picture dans le controle picturebox sous dotnet?
++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Commenter la réponse de PCPT
pedro93 10 Messages postés lundi 2 mai 2005Date d'inscription 3 juin 2008 Dernière intervention - 22 avril 2008 à 10:20
0
Utile
Salut,

merci pour ta réponse.

J'ai essayé le clipbord.clear, au préalable, et j'ai malheureusement toujours la même erreur.
J'ai l'impression que c'est un bug de .NET. En effet, lorsque je copie dans Word le contenu de mon presse papier suite à l'instruction "AxMSChart1.EditCopy()", j'ai les données texte de mon MsChart...
Etrange...

Ca ne résoud pas mon problème malheureusement!

PS :  picturebox.picture a été remplacé par picturebox.image.
Commenter la réponse de pedro93
pedro93 10 Messages postés lundi 2 mai 2005Date d'inscription 3 juin 2008 Dernière intervention - 22 avril 2008 à 12:07
0
Utile
Par contre, je viens de me rendre compte qu'en faisant un "collage spécial" sous word après mon "editcopy", j'ai bien mon mschart qui s'affiche en format image.
Sous paint, j'ai une erreur si je fais la même manip, ce qui veut dire que le contenu du presse papier n'est pas un format image à la base.

Existe-t'il une émulation du collage spécial de word sous vb.net?
Commenter la réponse de pedro93
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 23 avril 2008 à 00:00
0
Utile
je ne fais pas de dotnet ....
çà donne quoi quelquechose du genre PictureBox1.Image = Clipboard.GetData(DataFormats.metafile)
ou voir ce qui t'es proposé... ?
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Commenter la réponse de PCPT
pedro93 10 Messages postés lundi 2 mai 2005Date d'inscription 3 juin 2008 Dernière intervention - 23 avril 2008 à 00:47
0
Utile
La ligne de code :
PictureBox1.Image = Clipboard.GetData(DataFormats.EnhancedMetafile)

malheureusement la même erreur...
Les autres formats également.

Rhaaa dotnet...
Commenter la réponse de pedro93
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 23 avril 2008 à 00:53
0
Utile
voici quelques pistes trouvées rapidement...
http://msdn.microsoft.com/library/fre/default.asp?url=/library/fre/mschrt/html/vboriChartCtrlMethods.asp
http://msdn2.microsoft.com/fr-fr/library/system.windows.dataformats(VS.85).aspx
http://support.microsoft.com/kb/197487/fr

++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Commenter la réponse de PCPT
pedro93 10 Messages postés lundi 2 mai 2005Date d'inscription 3 juin 2008 Dernière intervention - 23 avril 2008 à 16:40
0
Utile
J'ai encore bien galéré sur internet pour trouver une solution.
Malheureusement, il semblerait, selon certaines sources qui ne sont évidemment pas vérifiables auprès de Microsoft (bah tiens!), que .net ne supporterait pas le traitement des métafiles dans le clipboard (http://support.microsoft.com/?id=323530 qui aborde le sujet de manière elliptique).

Merci pour les liens que tu m'as envoyé toute fois.

PS : petite préscision au sujet du clipboard sous .net, le seul moyen de le vider complètement est :
"Clipboard.SetDataObject(New DataObject())"

La méthode .clear ne sert à rien...

D'autre part, le format vb6 "vbCFMetaFile" équivaut à "DataFormats.MetafilePict" en .net

Voilà, ça ne résoud pas mon problème, mais ça peut servir!
Commenter la réponse de pedro93
pedro93 10 Messages postés lundi 2 mai 2005Date d'inscription 3 juin 2008 Dernière intervention - 2 mai 2008 à 14:47
0
Utile
Personne n'aurait une idée?
Commenter la réponse de pedro93
najlaa85ma 2 Messages postés mercredi 1 février 2006Date d'inscription 20 mai 2008 Dernière intervention - 17 mai 2008 à 14:09
0
Utile
bonjour,
g le méme probléme que toi g essayé ce code mais il me donne la meme erreur
Dim pr As New Printer
        Graf.EditCopy()
        pr.PaintPicture(Clipboard.GetData(DataFormats.), 0, 0, pr.ScaleWidth, pr.ScaleHeight)

        pr.EndDoc()

est ce que tu peux me dire STP comment tu as fais pour copier ton grahe au word?

je serai trés reconnaissante si vous me trouverez une solution
merci.
Commenter la réponse de najlaa85ma
pedro93 10 Messages postés lundi 2 mai 2005Date d'inscription 3 juin 2008 Dernière intervention - 20 mai 2008 à 11:51
0
Utile
bonjour najala32ma,

je n'ai malheureusement toujours pas réussi à trouver une solution pour enregistrer mon graphique en image directement via mon appli.
Vu que j'ai du la distribuer à ses commanditaires au travail, j'ai donc pris le parti de faire une "copie dans le presse papier" à partir de mon appli, solution inélégante s'il est est...

la fonction est la suivante :

"private sub copyClipboard()
    AxMSChart1.EditCopy()
end sub"

Voici le workaround pour la copie dans word :

1) lance la fonction "copyClipboard()".
2) il faut ensuite coller le
Graphique dans « Word » en cliquant sur  « Edition/Collage Spécial »
et en sélectionnant « En tant que : Image »

Voilà.

J'aimerais quand même bien faire fonctionner la copie en image directement...
et par là même l'impression.
Commenter la réponse de pedro93
pedro93 10 Messages postés lundi 2 mai 2005Date d'inscription 3 juin 2008 Dernière intervention - 3 juin 2008 à 12:18
0
Utile
Merci beaucoup,
j'ai désormais pu solutionner mon problème.

j'ai en outre utilisé ta fonction pour sauvegarder mon graphique en image :
 Private Sub SauverGraph(path As String)
        memoryImage.Save(path)
    End Sub

    Private Sub SauvImage() Handles SaveFileDialog3.FileOk
        SauverGraph(SaveFileDialog3.FileName)
    End Sub

    Private Sub BMPToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FormatBmpToolStripMenuItem2.Click
        CaptureScreen(AxMSChart1)
        'extension par défaut bmp
        SaveFileDialog3.DefaultExt = ".bmp"
        SaveFileDialog3.AddExtension = True
        SaveFileDialog3.Filter = "Fichiers Bitmap (*.bmp)|*.bmp|Tous fichiers (*.*)|*.*"
        'on affiche la fenêtre de sauvegarde de fichiers
        SaveFileDialog3.ShowDialog()
        'si le fichier existe déjà on demande pour l'écraser
        SaveFileDialog3.OverwritePrompt = True

    End Sub

Il ne me reste plus qu'a faire un resize de ma zone à imprimer pour ça rentre dans le page (ma graph est assez imposant en taille!)

A +
Commenter la réponse de pedro93

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.