电竞比分网-中国电竞赛事及体育赛事平台

分享

VB抓圖

 虹鄉(xiāng)青蓮 2011-01-10
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
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 CloseClipboard Lib "user32" () As Long
Private Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" (ByVal lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As String, lpInitData As Long) As Long
以上是下面要用到的API的聲明
代碼是復(fù)制過(guò)來(lái)的,所以這些API是干什么要的,我不怎么了解,Command1按鈕按下后,效果就是抓取屏幕,且顯示在Picture1上面,誰(shuí)來(lái)解釋下Sub Command1_Click()各代碼做的是什么事情?
Private Sub Command1_Click()
SourceDC = CreateDC("DISPLAY", 0, 0, 0)
DestDC = CreateCompatibleDC(SourceDC)
Bhandle = CreateCompatibleBitmap(SourceDC, 400, 300)         '顯示區(qū)域設(shè)置
SelectObject DestDC, Bhandle
BitBlt DestDC, 100, 100, 400, 300, SourceDC, 0, 0, &HCC0020      '設(shè)置抓圖區(qū)域
Wnd = Screen.ActiveForm.hwnd
OpenClipboard Wnd
EmptyClipboard
SetClipboardData 2, Bhandle
CloseClipboard
DeleteDC DestDC
ReleaseDC Dhandle, SourceDC
Picture1.Picture = Clipboard.GetData()
End Sub
SourceDC = CreateDC("DISPLAY", 0, 0, 0)
DestDC = CreateCompatibleDC(SourceDC)
Bhandle = CreateCompatibleBitmap(SourceDC, 800, 600)         '顯示區(qū)域設(shè)置
SelectObject DestDC, Bhandle
BitBlt DestDC, 0, 0, 800, 600, SourceDC, 0, 0, &HCC0020      '設(shè)置抓圖區(qū)域
Wnd = Screen.ActiveForm.hwnd
OpenClipboard Wnd
EmptyClipboard
SetClipboardData 2, Bhandle
CloseClipboard
DeleteDC DestDC
ReleaseDC Dhandle, SourceDC
Picture1.Picture = Clipboard.GetData()
最佳答案
才疏學(xué)淺,只能粗略講一下啦
SourceDC = CreateDC("DISPLAY", 0, 0, 0)
'以屏幕為源建立一個(gè)設(shè)備場(chǎng)景
DestDC = CreateCompatibleDC(SourceDC)
'在內(nèi)存中建立一個(gè)與剛才建立的設(shè)備場(chǎng)景一致的設(shè)備場(chǎng)景
Bhandle = CreateCompatibleBitmap(SourceDC, 400, 300) '顯示區(qū)域設(shè)置
'在內(nèi)存中建立一幅與剛建立的設(shè)備場(chǎng)景相兼容的位圖
SelectObject DestDC, Bhandle
'這句難理解一點(diǎn),不亂說(shuō)了,回頭給你看API說(shuō)明
BitBlt DestDC, 100, 100, 400, 300, SourceDC, 0, 0, &HCC0020 '設(shè)置抓圖區(qū)域
'在兩個(gè)設(shè)備場(chǎng)景(DestDC和SourceDC)間復(fù)制位圖
Wnd = Screen.ActiveForm.hwnd
OpenClipboard Wnd
EmptyClipboard
SetClipboardData 2, Bhandle
CloseClipboard
'這一段是對(duì)剪貼板的操作,我的API工具中沒(méi)有相關(guān)說(shuō)明
'大體意思應(yīng)該是把剛才在內(nèi)存中建立的位圖放到剪貼板中
DeleteDC DestDC
'刪除一個(gè)設(shè)備場(chǎng)景
ReleaseDC Dhandle, SourceDC
'在內(nèi)存中釋放掉一個(gè)設(shè)備場(chǎng)景
Picture1.Picture = Clipboard.GetData()
'這句不用解釋了吧,把剪貼板中的位圖下載到Picture1中
========================
下面是我在API工具中查到的相關(guān)說(shuō)明,但愿對(duì)你有幫助
CreateDC
【說(shuō)明】
為專門設(shè)備創(chuàng)建設(shè)備場(chǎng)景
【返回值】
Long,新設(shè)備場(chǎng)景句柄,若出錯(cuò)則為零
【其它】
在繪制之前,先要為該設(shè)備場(chǎng)景選定一個(gè)位圖。不再需要時(shí),該設(shè)備場(chǎng)景可用DeleteDC函數(shù)刪除。刪除前,其所有對(duì)象應(yīng)回復(fù)初始狀態(tài)。若有設(shè)備初始設(shè)置可用DocumentProperties
API函數(shù)載入DEVMODE結(jié)構(gòu)。使用屏幕設(shè)備場(chǎng)景(DISPLAY)時(shí)要小心,因?yàn)樗鼤?huì)干擾其他應(yīng)用程序的外觀
示例:靠近屏幕左上角畫一個(gè)矩形
dc&  = CreateDCBynum("DISPLAY", vbNullString,
vbNullString, 0)
dl&  = Rectangle(dc& , 5, 5, 100, 100)
【參數(shù)表】
lpDriverName ---  String,用vbNullString傳遞null值給該參數(shù),除非:1、用DISPLAY,是獲取整個(gè)屏幕的設(shè)備場(chǎng)景;2、用WINSPOOL,則是訪問(wèn)打印驅(qū)動(dòng)
lpDeviceName ---  String,所用專門設(shè)備的名稱。該名由打印管理器分配顯示
lpOutput -------  String,用vbNullString傳遞null值給該參數(shù)
lpInitData -----  DEVMODE,這個(gè)結(jié)構(gòu)保存初始值。用CreateDCBynum傳遞0(NULL)值則適用默認(rèn)設(shè)置
CreateCompatibleDC
【說(shuō)明】
創(chuàng)建一個(gè)與特定設(shè)備場(chǎng)景一致的內(nèi)存設(shè)備場(chǎng)景
【返回值】
Long,新設(shè)備場(chǎng)景句柄,若出錯(cuò)則為零
【其它】
在繪制之前,先要為該設(shè)備場(chǎng)景選定一個(gè)位圖。不再需要時(shí),該設(shè)備場(chǎng)景可用DeleteDC函數(shù)刪除。刪除前,其所有對(duì)象應(yīng)回復(fù)初始狀態(tài)
【參數(shù)表】
hdc ------------  Long,設(shè)備場(chǎng)景句柄。新的設(shè)備場(chǎng)景將與它一致。也可能為0以創(chuàng)建一個(gè)與屏幕一致的設(shè)備場(chǎng)景
CreateCompatibleBitmap
【說(shuō)明】
創(chuàng)建一幅與設(shè)備有關(guān)位圖,它與指定的設(shè)備場(chǎng)景兼容
【返回值】
Long,執(zhí)行成功返回位圖句柄,零表示失敗
【其它】
內(nèi)存設(shè)備場(chǎng)景即與彩色位圖兼容,也與單色位圖兼容。這個(gè)函數(shù)的作用是創(chuàng)建一幅與當(dāng)前選入hdc中的場(chǎng)景兼容。對(duì)一個(gè)內(nèi)存場(chǎng)景來(lái)說(shuō),默認(rèn)的位圖是單色的。倘若內(nèi)存設(shè)備場(chǎng)景有一個(gè)DIBSection選入其中,這個(gè)函數(shù)就會(huì)返回DIBSection的一個(gè)句柄。如hdc是一幅設(shè)備位圖,那么結(jié)果生成的位圖就肯定兼容于設(shè)備(也就是說(shuō),彩色設(shè)備生成的肯定是彩色位圖)
如果nWidth和nHeight為零,返回的位圖就是一個(gè)1×1的單色位圖
一旦位圖不再需要,一定用DeleteObject函數(shù)釋放它占用的內(nèi)存及資源
【參數(shù)表】
hdc ------------  Long,設(shè)備場(chǎng)景的句柄
nWidth ---------  Long,位圖寬度,以像素為單位
nHeight --------  Long,位圖高度,以像素為單位
SelectObject
【說(shuō)明】
每個(gè)設(shè)備場(chǎng)景都可能有選入其中的圖形對(duì)象。其中包括位圖、刷子、字體、畫筆以及區(qū)域等等。一次選入設(shè)備場(chǎng)景的只能有一個(gè)對(duì)象。選定的對(duì)象會(huì)在設(shè)備場(chǎng)景的繪圖操作中使用。例如,當(dāng)前選定的畫筆決定了在設(shè)備場(chǎng)景中描繪的線段顏色及樣式
【返回值】
Long,與以前選入設(shè)備場(chǎng)景的相同hObject類型的一個(gè)對(duì)象的句柄,零表示出錯(cuò)。如選定的對(duì)象是一個(gè)區(qū)域(Region),結(jié)果就是下列常數(shù)之一:SIMPLEREGION,
COMPLEXREGION 或 NULLREGION 對(duì)區(qū)域進(jìn)行描述, GDI_ERROR 表示出錯(cuò)
【其它】
返回值通常用于獲得選入DC的對(duì)象的原始值。繪圖操作完成后,原始的對(duì)象通常選回設(shè)備場(chǎng)景。在清除一個(gè)設(shè)備場(chǎng)景前,務(wù)必注意恢復(fù)原始的對(duì)象
【參數(shù)表】
hdc ------------  Long,一個(gè)設(shè)備場(chǎng)景的句柄
hObject --------  Long,一個(gè)畫筆、位圖、刷子、字體或區(qū)域的句柄
BitBlt
【說(shuō)明】
將一幅位圖從一個(gè)設(shè)備場(chǎng)景復(fù)制到另一個(gè)。源和目標(biāo)DC相互間必須兼容
【返回值】
Long,非零表示成功,零表示失敗。會(huì)設(shè)置GetLastError
【其它】
在NT環(huán)境下,如在一次世界傳輸中要求在源設(shè)備場(chǎng)景中進(jìn)行剪切或旋轉(zhuǎn)處理,這個(gè)函數(shù)的執(zhí)行會(huì)失敗
如目標(biāo)和源DC的映射關(guān)系要求矩形中像素的大小必須在傳輸過(guò)程中改變,那么這個(gè)函數(shù)會(huì)根據(jù)需要自動(dòng)伸縮、旋轉(zhuǎn)、折疊、或切斷,以便完成最終的傳輸過(guò)程
【參數(shù)表】
hDestDC --------  Long,目標(biāo)設(shè)備場(chǎng)景
x,y ------------  Long,對(duì)目標(biāo)DC中目標(biāo)矩形左上角位置進(jìn)行描述的那個(gè)點(diǎn)。用目標(biāo)DC的邏輯坐標(biāo)表示
nWidth,nHeight -  Long,欲傳輸圖象的寬度和高度
hSrcDC ---------  Long,源設(shè)備場(chǎng)景。如光柵運(yùn)算未指定源,則應(yīng)設(shè)為0
xSrc,ySrc ------  Long,對(duì)源DC中源矩形左上角位置進(jìn)行描述的那個(gè)點(diǎn)。用源DC的邏輯坐標(biāo)表示
dwRop ----------  Long,傳輸過(guò)程要執(zhí)行的光柵運(yùn)算
(插一句:&HCC0020應(yīng)該是一個(gè)光柵運(yùn)算的常數(shù)vbSrcCopy)
DeleteDC
【說(shuō)明】
刪除專用設(shè)備場(chǎng)景或信息場(chǎng)景,釋放所有相關(guān)窗口資源。不要將它用于GetDC函數(shù)取回的設(shè)備場(chǎng)景
【返回值】
Long,執(zhí)行成功則為非零,失敗則為零
【其它】
若有對(duì)象被選入設(shè)備場(chǎng)景,則在調(diào)用本函數(shù)前應(yīng)將它們選出。為此,可將初始對(duì)象回選入DC,也可用SaveDC, RestoreDC函數(shù)對(duì)回復(fù)DC為其創(chuàng)建時(shí)的狀態(tài)
在vb里使用
不要將它用于由vb hdc屬性獲取的設(shè)備場(chǎng)景句柄
【參數(shù)表】
hdc ------------  Long,將要?jiǎng)h除的設(shè)備場(chǎng)景
ReleaseDC
【說(shuō)明】
釋放由調(diào)用GetDC或GetWindowDC函數(shù)獲取的指定設(shè)備場(chǎng)景。它對(duì)類或私有設(shè)備場(chǎng)景無(wú)效(但這樣的調(diào)用不會(huì)造成損害)
【返回值】
Long,執(zhí)行成功為1,否則為0
【其它】
對(duì)那些用CreateDC一類的DC創(chuàng)建函數(shù)生成的設(shè)備場(chǎng)景,不要用本函數(shù)
【參數(shù)表】
hwnd -----------  Long,要釋放的設(shè)備場(chǎng)景相關(guān)的窗口句柄
hdc ------------  Long,要釋放的設(shè)備場(chǎng)景句柄

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多