Problème MsChart & Clipboard

Résolu
pedro93 Messages postés 10 Date d'inscription lundi 2 mai 2005 Statut Membre Dernière intervention 3 juin 2008 - 21 avril 2008 à 15:17
pedro93 Messages postés 10 Date d'inscription lundi 2 mai 2005 Statut Membre Dernière intervention 3 juin 2008 - 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.

12 réponses

najlaa85ma Messages postés 2 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 20 mai 2008
20 mai 2008 à 22:26
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.
3
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
21 avril 2008 à 23:52
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
0
pedro93 Messages postés 10 Date d'inscription lundi 2 mai 2005 Statut Membre Dernière intervention 3 juin 2008
22 avril 2008 à 10:20
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.
0
pedro93 Messages postés 10 Date d'inscription lundi 2 mai 2005 Statut Membre Dernière intervention 3 juin 2008
22 avril 2008 à 12:07
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?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
23 avril 2008 à 00:00
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
0
pedro93 Messages postés 10 Date d'inscription lundi 2 mai 2005 Statut Membre Dernière intervention 3 juin 2008
23 avril 2008 à 00:47
La ligne de code :
PictureBox1.Image = Clipboard.GetData(DataFormats.EnhancedMetafile)

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

Rhaaa dotnet...
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
23 avril 2008 à 00:53
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
0
pedro93 Messages postés 10 Date d'inscription lundi 2 mai 2005 Statut Membre Dernière intervention 3 juin 2008
23 avril 2008 à 16:40
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!
0
pedro93 Messages postés 10 Date d'inscription lundi 2 mai 2005 Statut Membre Dernière intervention 3 juin 2008
2 mai 2008 à 14:47
Personne n'aurait une idée?
0
najlaa85ma Messages postés 2 Date d'inscription mercredi 1 février 2006 Statut Membre Dernière intervention 20 mai 2008
17 mai 2008 à 14:09
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.
0
pedro93 Messages postés 10 Date d'inscription lundi 2 mai 2005 Statut Membre Dernière intervention 3 juin 2008
20 mai 2008 à 11:51
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.
0
pedro93 Messages postés 10 Date d'inscription lundi 2 mai 2005 Statut Membre Dernière intervention 3 juin 2008
3 juin 2008 à 12:18
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 +
0
Rejoignez-nous