private void button2_Click(object sender, EventArgs e)
{
Metafile metafile;//定义图形-图元文件
Picture.Picture x = new Picture.Picture();//利用matlab生成的类
x.pictureTest01();//生成图象,并复制在剪切板上
IDataObject iData = Clipboard.GetDataObject();//从剪切板获取数据
if (iData.GetDataPresent(DataFormats.MetafilePict))
{
object o = iData.GetData(DataFormats.MetafilePict);
metafile = (Metafile)o;
this.pictureBox1.Image = metafile;
}
}
代码如上所示。主要作用是利用matlab生成图象,并把图象copy在剪切板上,然后winform窗体从剪切板上读取该图象,并在GroupBox中显示出来。
我现在的问题是当 if 为真时,却无法获取到剪切板上的图元文件。即object o = iData.GetData(DataFormats.MetafilePict);时,o 总是为Null,请问各位朋友,这是什么原因?
1、外部粘贴没有问题。
2、另外,如果是jpg的格式,是可以读取并显示在picturebox中的。
bitmap格式不存在。
EnhancedMetafile格式存在,但是读不到数据。
MetafilePict格式存在,也读不到数据。
看来,只能选择你说的API了,你能不能帮我提供一个思路,我以前没有进行过API方面的编程?
真是多谢多谢你了
public enum ClipboardFormats : uint
{
CF_TEXT = 1,
CF_BITMAP = 2,
CF_METAFILEPICT = 3,
CF_SYLK = 4,
CF_DIF = 5,
CF_TIFF = 6,
CF_OEMTEXT = 7,
CF_DIB = 8,
CF_PALETTE = 9,
CF_PENDATA = 10,
CF_RIFF = 11,
CF_WAVE = 12,
CF_UNICODETEXT = 13,
CF_ENHMETAFILE = 14
}
public class ClipboardUtility
{
[DllImport("user32.dll")]
private static extern bool OpenClipboard(IntPtr hWndNewOwner); [DllImport("user32.dll")]
private static extern bool EmptyClipboard(); [DllImport("user32.dll")]
private static extern IntPtr GetClipboardData(uint uFormat); [DllImport("user32.dll")]
private static extern IntPtr SetClipboardData(uint uFormat, IntPtr hMem); [DllImport("user32.dll")]
private static extern bool CloseClipboard(); [DllImport("kernel32.dll")]
private static extern UIntPtr GlobalSize(IntPtr hMem); public static System.Drawing.Imaging.Metafile GetClipboardMETAFILEPICT()
{
OpenClipboard(IntPtr.Zero);
IntPtr alloc = GetClipboardData((uint)ClipboardFormats.CF_METAFILEPICT);
System.Drawing.Imaging.Metafile metafile = new System.Drawing.Imaging.Metafile(alloc,true);
CloseClipboard();
return metafile;
}
}
你能帮我注释一下 System.Drawing.Imaging.Metafile GetClipboardMETAFILEPICT()这个方法里的语句么?
我弄了好几个小时,还是弄不出来,然后在System.Drawing.Imaging.Metafile metafile = new System.Drawing.Imaging.Metafile(alloc,true);的时候出错,是参数无效的错误。麻烦你了,谢谢
IntPtr alloc = GetClipboardData((uint)ClipboardFormats.CF_METAFILEPICT);
int size = (int)GlobalSize(alloc);你输出下那个size,看看是多少,如果获取到剪贴板内容,size肯定大于0.如果你有项目测试文件,特别是那个Picture.Picture及其相关类,我倒是可以帮你测试。相关文件可以发这里:[email protected]
SIZE是大于0的。错误又变成了GDI+中发生一般性错误。
我把文件发到你邮箱了。你查收一下。
this.pictureBox1.Image = Clipboard.GetImage();
对于图元文件格式的图象获取不到。JPEG的可以。但问题是MATLAB只能以图元格式复制到剪贴板。
object o = iData.GetData(DataFormats.MetafilePict);//这里得到MetafilePict
Clipboard.SetData(DataFormats.Bitmap, o);//再向剪贴板里设置一次 设置成Bitmap
o = iData.GetData(DataFormats.Bitmap);//然后再获取就可以了
Bitmap bim =o as Bitmap ;
bim.Save("234.jpg");
在MATLAB R2012b中,Bitmap和Metafile都可以被剪切板获取的。
我是这样来获取img的-。-
Image img;
//IDataObject idata = Clipboard.GetDataObject();
img = Clipboard.GetImage();
this.pictureBox1.Image = img;
但是不行,加断点能走到这里,但是img是null。