如何在截屏后清空内存中刚才截的图片???

wingdes 2005-08-05 01:00:57
Private Declare Function CreateCompatibleDC Lib "GDI32" (ByVal hDC As Long) As Long

Private Declare Function CreateCompatibleBitmap Lib "GDI32" (ByVal hDC As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long

Private Declare Function GetDeviceCaps Lib "GDI32" (ByVal hDC As Long, ByVal iCapabilitiy As Long) As Long

Private Declare Function GetSystemPaletteEntries Lib "GDI32" (ByVal hDC As Long, ByVal wStartIndex As Long, ByVal wNumEntries As Long, lpPaletteEntries As PALETTEENTRY) As Long

Private Declare Function CreatePalette Lib "GDI32" (lpLogPalette As LOGPALETTE) As Long

Private Declare Function SelectObject Lib "GDI32" (ByVal hDC As Long, ByVal hObject As Long) As Long

Private Declare Function BitBlt Lib "GDI32" (ByVal hDCDest As Long, ByVal XDest As Long, ByVal YDest As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hDCSrc As Long, ByVal XSrc As Long, ByVal YSrc As Long, ByVal dwRop As Long) As Long

Private Declare Function DeleteDC Lib "GDI32" (ByVal hDC As Long) As Long

Private Declare Function GetForegroundWindow Lib "USER32" () As Long

Private Declare Function SelectPalette Lib "GDI32" (ByVal hDC As Long, ByVal hPalette As
Long, ByVal bForceBackground As Long) As Long

Private Declare Function RealizePalette Lib "GDI32" (ByVal hDC As Long) As Long

Private Declare Function GetWindowDC Lib "USER32" (ByVal hWnd As Long) As Long

Private Declare Function GetDC Lib "USER32" (ByVal hWnd As Long) As Long

Private Declare Function GetWindowRect Lib "USER32" (ByVal hWnd As Long, lpRect As RECT) As Long

Private Declare Function ReleaseDC Lib "USER32" (ByVal hWnd As Long, ByVal hDC As Long) As Long

Private Declare Function GetDesktopWindow Lib "USER32" () As Long

Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As PicBmp, RefIID As GUID, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long


看了高手做了截屏的的程序,用到以上这些库。我想实现一个屏幕录像成图片的功能,但是我做完之后,大约运行5分钟,就会报虚拟内存溢出,我想一定是没有释放掉前面截的屏的内存位图,不知哪位可以指点一下,在我把内存位图保存为本地图片之后,清空这个内存位图,多谢了!!!
...全文
300 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
michael_zy 2005-10-25
  • 打赏
  • 举报
回复
这个很简单....
先把整个屏幕抓下来....
在从你鼠标所画的区域把图片抓出来....主要是坐标的问题.......
长度宽度和开始的坐标
wzxiaodu 2005-10-25
  • 打赏
  • 举报
回复
高手们,借贵宝地问个问题?
就是通过上面两个程序等或其他,
如何用过鼠标,截取一部分屏幕在存图???
Mister 2005-08-07
  • 打赏
  • 举报
回复
这个2个函数好熟啊,是从网上粘的吧?这2个函数我以前就用过 N 次,抓过 N 次的图片,没有出现你说的那种问题啊......是不是你自己的代码有点问题。


如果要销毁对像,这样:Set Object=Nothing

Public Sub SaveFile()
Dim mPic As StdPicture

Set mPic=CaptureWindow(参数) '抓屏。
SavePicture mpic, "文件名" '将图片保存为磁盘文件(位图)。
Set mPic=Nothing '销毁对像。

End Sub
wingdes 2005-08-05
  • 打赏
  • 举报
回复
Public Function CreateBitmapPicture(ByVal hBmp As Long, ByVal hPal As Long) As Picture
Dim r As Long

Dim Pic As PicBmp

Dim IPic As IPicture
Dim IID_IDispatch As GUID

With IID_IDispatch
.Data1 = &H20400
.Data4(0) = &HC0
.Data4(7) = &H46
End With

With Pic
.Size = Len(Pic)
.Type = vbPicTypeBitmap
.hBmp = hBmp
.hPal = hPal
End With

r = OleCreatePictureIndirect(Pic, IID_IDispatch, 1, IPic)

Set CreateBitmapPicture = IPic
End Function

Public Function CaptureWindow(ByVal hWndSrc As Long, ByVal Client As Boolean, ByVal LeftSrc As Long, ByVal TopSrc As Long, ByVal WidthSrc As Long, ByVal HeightSrc As Long) As Picture

Dim hDCMemory As Long
Dim hBmp As Long
Dim hBmpPrev As Long
Dim r As Long
Dim hDCSrc As Long
Dim hPal As Long
Dim hPalPrev As Long
Dim RasterCapsScrn As Long
Dim HasPaletteScrn As Long
Dim PaletteSizeScrn As Long
Dim LogPal As LOGPALETTE

If Client Then
hDCSrc = GetDC(hWndSrc)
Else
hDCSrc = GetWindowDC(hWndSrc)
End If

hDCMemory = CreateCompatibleDC(hDCSrc)
hBmp = CreateCompatibleBitmap(hDCSrc, WidthSrc, HeightSrc)
hBmpPrev = SelectObject(hDCMemory, hBmp)

RasterCapsScrn = GetDeviceCaps(hDCSrc, RASTERCAPS)

HasPaletteScrn = RasterCapsScrn And RC_PALETTE

PaletteSizeScrn = GetDeviceCaps(hDCSrc, SIZEPALETTE)

If HasPaletteScrn And (PaletteSizeScrn = 256) Then
LogPal.palVersion = &H300
LogPal.palNumEntries = 256
r = GetSystemPaletteEntries(hDCSrc, 0, 256, LogPal.palPalEntry(0))
hPal = CreatePalette(LogPal)
hPalPrev = SelectPalette(hDCMemory, hPal, 0)
r = RealizePalette(hDCMemory)
End If

' Copy the on-screen image into the memory DC.
r = BitBlt(hDCMemory, 0, 0, WidthSrc, HeightSrc, hDCSrc, LeftSrc, TopSrc, vbSrcCopy)

' Remove the new copy of the on-screen image.
hBmp = SelectObject(hDCMemory, hBmpPrev)

If HasPaletteScrn And (PaletteSizeScrn = 256) Then
hPal = SelectPalette(hDCMemory, hPalPrev, 0)
End If

r = DeleteDC(hDCMemory)
r = ReleaseDC(hWndSrc, hDCSrc)

Set CaptureWindow = CreateBitmapPicture(hBmp, hPal)
End Function

主要是这两个函数,我用CaptureWindow函数截屏后,不知如何清空内存位图。
michael_zy 2005-08-05
  • 打赏
  • 举报
回复
贴这么多函数声明有什么用??谁知道你的代码是怎么写的??
wingdes 2005-08-05
  • 打赏
  • 举报
回复
自己先顶一下……!!!
内存盘软件 Qsoft Ramdisk Enterprise 的简单使用说明 这个……好像有些朋友需要,就写一下吧,其实,我觉得直接看英文的帮助文档就好了,里面写得比较详细的。 首先安装就比较麻烦:控制面板——添加硬件——手动安装,找到RAMDriv.inf所在的目录就行了。 下面就以官方帮助的图为例子说明: [1]和[2]这个应该不用说明了,就是设定虚拟盘的盘符和容量大小,所有虚拟盘软件的基本功能。 [3]处是让软件来自动进行分配虚拟盘的大小,与[2]不同就是此处是按总内存的百分比来设置虚拟盘的容量,如果选取这个后,[2]处就无法设定了。其实两处的设定是一致的,区别只在于一个是按容量设置,而另一个是按总容量的百分比大小来设置罢了。若想手动调节其百分比的大小,可以拉动[6]处的滑动条。它是以32M为单位递进的,同理这个软件的所有滑动条都以32M为单位递进。 [4]和[5]应该合并到一处来说明。[4]按字面意思来讲是指“使用锁定内存”,其作用为当你选择后,系统将会把一部分内存容量保留出来,由虚拟软件进行管理,系统不再使用这部分内存,此时,你在任务管理器的"性能选项卡"看到的内存总容量会小于实际容量,少的那部分就是你设置为锁定内存的容量,其大小可由后面的滑动条来设置,能设置的最大容量将由软件依据你的物理内存实际大小而定。帮助文档提到:在Win2000系统由于稳定性问题不建议选择此设置。[5]是"使用常驻内存",选择后,系统将与软件共用这部分内存。此时,任务管理器的"性能选项卡"看到的内存容量不会有变化。同样,可以由滑动条来设置大小,上限也是由软件根据物理内存实际大小来定。以上两者都以32M为步进单位。 [7]和[8]的作用是相同的,既对应[4]和[5],当选择了[4]和[5](两者之一或全部),并且又遇到系统主内存容量不足的情况时,允许系统从虚拟盘回收多少内存来“救急”。 [6]和[9]:[6]前面提到过,使用来设置软件允许用来设置虚拟盘的内存大小,这个可以比你设置的虚拟盘容量大,但不能比其小,小了会提示可用内存不够而无法设置虚拟盘。无论在何种情况下[9]都是必选的,表示你要使用系统内存来做虚拟盘,如果不选,虚拟盘就不会生效。 [12]是一个比较有趣的地方,就是它将内存划分为32M为一个单位,图黄色的部分就是指允许虚拟盘使用这一位址(没写错,不是位置,从左到右分别表示每条内存的最高位到最低位),红色表示已经被虚拟盘占用的位址,黑色表示不允许虚拟盘占用的位址。(至于主板有6根插槽或者内存组成为2x2G这种情况没条件测试就不清楚它怎么分配了。)默认如图,它将每根内存的最低位64Mb设置为排除,是因为有些驱动程序和常驻系统的软件会占用这部分内存,为了避免引起冲突采取的措施。如果大家有兴趣的话,还可以把虚拟盘设置到任意一根内存条上,比如第一或是最后一根,你只要在那些单位上点一下就行了, 它的状态会在允许/排除之间切换。 [13]表示生成虚拟盘的磁盘格式 FAT fAT32 或 NTFS [14]表示是否压缩驱动器来节省空间,选有效 [15]表示是否使用索引服务来加快搜索虚拟盘上文件的速度 其实,对于[14]和[15],一般我们都是在模拟盘上放临时缓存和页面文件,就没必要压缩和索引了。 [16]生成模拟盘的ID号,这是硬件的标示ID,一般不用去管它,你也可以自己设置,修改后可以在设备管理器ramdrive属性里的详细信息里看到它 [17]就是模拟盘的卷标了 [18]是加载映像文件的位置选项,类似superspeed ramdisk plus 的功能 [19]点击后,就可以对映像文件进行详细的调节,这个比较简单,看帮助的例子 [21]是对[19]的文字说明 [20]显示映像文件的详细信息 [22]表示当你设置完成后点OK时,模拟盘会重新生成,同时你刚才所做的设置修改也会生效,这有时会清空模拟盘上的文件,需要注意一下 [23]是对模拟盘上的文件复制操作是否使用 MMX指令集,一般都能选,是对模拟盘上的文件复制操作进行MMX加速的,也只对文件复制操作有效。 基本上就介绍完了,由于我是凭自己记忆写的(公司的机器内存不大,当然不能来装这些东西测试)所以某些地方可能有记错的地方,欢迎大家实践后指正。最近要做封闭开发,感觉我的时间太少了,呵呵。不过我会经常来看看并修改错误的。

808

社区成员

发帖
与我相关
我的任务
社区描述
VB 多媒体
社区管理员
  • 多媒体
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧