回 帖 发 新 帖 刷新版面

主题:OLE拖放和图像处理 以及 picturebox

第一个问题:OLE拖放时,拖到程序中图片的话,用Data.GetData(vbCFDIB)得到的是什么,能否直接保存到文件?如果能,麻烦简单说一下,后边的问题就无所谓了。
    第二个问题,接上一问题,如果不能保存到文件,那么能否显示到PictureBox里面?
    第三个问题,接上一问题,如果能显示,又如何把PictureBox中的图像保存到文件?

为何下面的代码会出错?
If Data.GetFormat(vbCFBitmap) Or _
   Data.GetFormat(vbCFMetafile) Or _
   Data.GetFormat(vbCFDIB) Or _
   Data.GetFormat(vbCFEMetafile) Then
      Picture1.Picture = LoadPicture(Data.GetData(vbCFBitmap))
出错为:指定的格式与数据格式不匹配
把Data.GetData(vbCFBitmap)改为Data.GetData(vbCFDIB)则出错为:
文件未找到
改为其他数据格式出错均与vbCFBitmap相同

回复列表 (共7个回复)

沙发

我只知道第三个问题,好像使用图片框的保存方法就可以。具体参数设计请查阅vb帮助。

板凳

在图片框的OLEDragOver过程中判断文件名后缀是否图片

Dim st As String
st = Right(UCase(Data.Files.Item(1)), 3) '获取文件后缀
If InStr("BMP,JPG,JPEG,GIF,ICO", st) Then
  Effect = vbDropEffectCopy And Effect '显示带小加号的可以放下的图标
Else
  Effect = vbDropEffectNone '否则显示圆圈加斜线不可放下的图标
End If


在OLEDragDrop过程中:

Dim OpenName As String
If Data.GetFormat(vbCFFiles) Then 
  OpenName = Data.Files.Item(1)
  PictureBox1.Picture = LoadPicture(OpenName)
End If

3 楼

2楼的是拖动文件的代码吧?
我不是想拖动文件,我是把网页上的图片拖到程序中,也就是说,我是想弄“一拖即存”。

现在解决程度是这样的:
我已经查资料得知可以使用savepicture函数把picturebox中的图片保存到文件;
最后的代码出错原因也找到,是因为不必用loadpicture,而是应该直接用data.getdata(vbCFDIB);
关于savepicture函数保存到文件的文件格式,有这么两句说明:
无论在设计时还是运行时图形从文件加载到对象的 Picture 属性,而且它是位图、图标、元文件或增强元文件,则图形将以原始文件同样的格式保存。如果它是 GIF 或 JPEG 文件,则将保存为位图文件。

目前我想知道的是(虽然只要解决下面两个问题中的一个就能解决一拖即存的问题,但是我希望2个问题都能解决):
1.一开始的第一个问题,用Data.GetData(vbCFDIB)得到的是什么,能否直接保存到文件?
2.拖动到picturebox中的图片在保存时如何判断应该保存为何种扩展名的文件?

4 楼

又有进展。
经过试验发现,一个网页中的jpg图像拖动到picturebox中,用savepicture函数保存时,扩展名为jpg或bmp都能正常保存!

5 楼

第一个问题:
VbCFDIB  得到的是与设备无关的位图(.dib or .bmp) 
直接保存的代码如下:

'Picture1.OLEDropMode属性设置为 1

Private Sub Picture1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
On Error Resume Next
Effect = vbDropEffectCopy
If Data.GetFormat(vbCFDIB) Then
  Picture1.Picture = Data.GetData(vbCFDIB)
  SavePicture Picture1.Picture, "D:\100.BMP"
End If
End Sub


第二个问题的答案我也想知道

6 楼

我用的就是你说的这个方法,在保存之前需要把图片加载到picturebox里面,所以我原先认为这样不是“直接保存”。
只不过我没有使用Effect参数,它的作用是什么?

7 楼

effect     源对象最初设置的长整型数,用来识别它支持的效果。在事件过程中,此参数必须被目标部件
     正确地设置。effect 值由所有活动的效果(如设置值表)逻辑 Or 确定。目标部件应检查这
     些效果以及其它参数以确定哪个动作适合于它,然后把此参数设置为允许的效果之一(如源所
     规定),以便确定放置选项到部件该执行哪个动作。可能的取值列于“设置值”中。
effect 设置如下:
常数              值      描述
vbDropEffectNone     0      放目标不接受数据。
VbDropEffectCopy     1      放结果保存于从源到目标的数据拷贝中。初始数据没有被拖放操作改变。
VbDropEffectMove     2      放结果保存于要从拖放源移到放源的数据中。移动后,拖放源要删除数据。
vbDropEffectScroll     -2147483648(&H80000000)   在目标部件中,滚动正在或将要发生。此值与其它值共同使用。注意:仅当在部件中执行自己的滚动时才能应用。

你不想把把图片加载到picturebox里面也行,那就要使用剪贴板,代码如下:

If Data.GetFormat(vbCFDIB) Then
  Clipboard.SetData Data.GetData(vbCFDIB)
  SavePicture Clipboard.GetData, "D:\100.BMP"
End If

我来回复

您尚未登录,请登录后再回复。点此登录或注册