我用VB6,在窗体里加了一个PictureBox或者Image,用来表示摄像头显示所拍摄的区域,现在加了一个按钮,拍照让拍下来的照片显示在这个PictureBox框里,我网上找了找,一旦拍摄启动,感觉是调用资源的问题,请有做过的大牛赐教!
解决方案 »
- 这个报表那位会做,急用,已经在好几个怎发贴了,没有人会,真急人。
- 难道就没有办法实现全局EXCEL对象吗?疑难杂症!
- 新人求一点代码,很简单的,新手也能搞定
- 由于access数据库太大了 没法把excel导入进来,怎么办啊
- 装vb和vc两个软件有冲突吗?为什么msdn装不上去啊?
- 100分求ASCII转换成UNICODE的算法,,不准用StrConv 函数!!!
- 在那里有企业版的VB(英文版)下载
- 非技术问题?
- 用VB訪問FOXPRO數据庫
- 讨论一下:如果CSDN取消了每天的加分,会怎么样?
- 求助用VBA抓取网页数据/新闻內容(求版主帮助~~)
- VB6.0在win7下调用advapi32.dll
.bas部分的代码
Private Declare Function capCreateCaptureWindow Lib "avicap32.dll" _
Alias "capCreateCaptureWindowA" ( _
ByVal lpszWindowName As String, _
ByVal dwStyle As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal hWndParent As Long, _
ByVal nID As Long) As LongPrivate Const WS_CHILD = &H40000000
Private Const WS_VISIBLE = &H10000000
Private Const WM_USER = &H400
Private Const WM_CAP_START = &H400
Private Const WM_CAP_EDIT_COPY = (WM_CAP_START + 30)
Private Const WM_CAP_DRIVER_CONNECT = (WM_CAP_START + 10)
Private Const WM_CAP_SET_PREVIEWRATE = (WM_CAP_START + 52)
Private Const WM_CAP_SET_OVERLAY = (WM_CAP_START + 51)
Private Const WM_CAP_SET_PREVIEW = (WM_CAP_START + 50)
Private Const WM_CAP_DRIVER_DISCONNECT = (WM_CAP_START + 11)Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" ( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As LongPrivate Preview_Handle As LongPublic Function CreateCaptureWindow( _
hWndParent As Long, _
Optional x As Long = 0, _
Optional y As Long = 0, _
Optional nWidth As Long = 440, _
Optional nHeight As Long = 440, _
Optional nCameraID As Long = 0) As Long Preview_Handle = capCreateCaptureWindow("Video", _
WS_CHILD + WS_VISIBLE, x, y, _
nWidth, nHeight, hWndParent, 1) SendMessage Preview_Handle, WM_CAP_DRIVER_CONNECT, nCameraID, 0
SendMessage Preview_Handle, WM_CAP_SET_PREVIEWRATE, 30, 0
SendMessage Preview_Handle, WM_CAP_SET_OVERLAY, 1, 0
SendMessage Preview_Handle, WM_CAP_SET_PREVIEW, 1, 0 CreateCaptureWindow = Preview_Handle
End FunctionPublic Function CapturePicture(nCaptureHandle As Long) As StdPicture
Clipboard.Clear
SendMessage nCaptureHandle, WM_CAP_EDIT_COPY, 0, 0
Set CapturePicture = Clipboard.GetData
End Function
Public Sub Disconnect(nCaptureHandle As Long, _
Optional nCameraID = 0) SendMessage nCaptureHandle, WM_CAP_DRIVER_DISCONNECT, _
nCameraID, 0
End Sub放了一个窗体,一个按钮,一个picturebox控件,窗体部分代码:
Dim Video_Handle As LongPrivate Sub Command1_Click()
Dim x As StdPicture
Set x = CapturePicture(Video_Handle)
SavePicture x, "c:\a1.bmp"
PicCapture.Visible = False
nowPic.Visible = True
nowPic.Picture = LoadPicture("c:\a1.bmp")
Image1.Picture = LoadPicture("c:\a1.bmp")
End SubPrivate Sub Form_Load()
Video_Handle = CreateCaptureWindow(PicCapture.hwnd)
nowPic.Visible = False
End SubPrivate Sub Form_Unload(Cancel As Integer)
Disconnect Video_Handle
End Sub
执行到这两句出错:
Set x = CapturePicture(Video_Handle)
SavePicture x, "c:\a1.bmp"
提示的错误是:
runtime error "521 " can't open clipboard
不知道什么原因?
原来你是因为这部分代码有错误好吧,扯远了,中文语法问题我没法帮你,但VB的问题还是能帮到点的:你的错误是"runtime error "521 " can't open clipboard",已经讲得很明白,无法打开剪贴板.从CapturePicture()函数的实现来看,需要把截的图放到剪贴板里再取回来,才能得到一个stdPicture对象,以便保存.Public Function CapturePicture(nCaptureHandle As Long) As StdPicture
Clipboard.Clear
SendMessage nCaptureHandle, WM_CAP_EDIT_COPY, 0, 0
Set CapturePicture = Clipboard.GetData
End Function至于你这代码为什么无法打开剪贴板,你要跟到CapturePicture()内部去,搞清楚具体错误是在哪一行.如果是Clipboard.Clear,那有可能是别的程序正在使用,可以尝试用一个带Sleep(100)的循环去调用这一句,没有错误的话即成功.另外,这样的方法不好,因为你并不需要使用到剪贴板,WM_CAP_EDIT_COPY消息是方便在别的地方(例如QQ聊天窗口中)粘贴图像而使用的,你这里是为了保存到文件并显示,那使用WM_CAP_FILE_SAVEDIB消息是最合适不过的了.这里给你一个封装:Function capFileSaveDIB(ByVal hCapWnd As Long, ByVal FilePath As String) As Boolean
capFileSaveDIB = SendMessageAsString(hCapWnd, WM_CAP_FILE_SAVEDIB, 0&, FilePath)
End Function'调用:
if not capFileSaveDIB(Video_Handle,"C:\a1.bmp") then
Msgbox "保存失败!"
end if
用暴风和QQ可以实现。暂没发现是什么原理。