回 帖 发 新 帖 刷新版面

主题:请教StretchBlt函数

如下代码
Dim ScrhDC As Long
'取得萤幕资源
ScrhDC = GetDC(0)
'备份萤幕背景
Call BitBlt(in_Form.hdc, 0, 0, Gini_Width, Gini_Height, ScrhDC, in_FormX, in_FormY, vbSrcCopy)
'copy萤幕背景作为 in_desPic的背景
Call BitBlt(in_desPic.hdc, 0, 0, Gini_Width, Gini_Height, ScrhDC, in_FormX, in_FormY, vbSrcCopy)
'释放萤幕资源
Call ReleaseDC(0, ScrhDC)

Call StretchBlt(in_desPic.hdc, 0, 0, Gini_Width, Gini_Height, in_srcPic.hdc, GiniX, GiniY, Gini_Width, Gini_Height, vbSrcAnd)
in_desPic.Visible = True

为什么我最后显示出来的图片,是躲在了背景之后?

回复列表 (共7个回复)

沙发

Option Explicit
Private Declare Function GetDC Lib "user32" (ByVal hwnd 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 ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long

Private Sub Form_Click()
Dim ScrhDC As Long
ScrhDC = GetDC(0)
Call BitBlt(Me.hdc, 0, 0, 1000, 1000, ScrhDC, 0, 0, vbSrcCopy)
Call ReleaseDC(0, ScrhDC)
End Sub

板凳

楼上的写这段代码啥意思?我想可能我开始的表达不够详细。
是这样的,上面这段代码是我仿造一个桌面精灵改写的。用桌面作为移动时的图片背景,但是,在移动过程中,这个图片显示出来的状态就像是浮在文字下方,而不像QQ宠物那样覆盖了所经过的文字。所以,还请大侠帮忙解惑一下?

3 楼

Option Explicit
Private Declare Function GetDC Lib "user32" (ByVal hwnd 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 ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Private Declare Function StretchBlt Lib "gdi32" (ByVal hdc 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 nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long

Private Sub Form_Click()
    Dim SrchDC As Long
    SrchDC = GetDC(0)
    Call BitBlt(Me.hdc, 0, 0, 1000, 1000, SrchDC, 0, 0, vbSrcCopy)
    Call StretchBlt(Me.hdc, 0, 0, 1000, 1000, SrchDC, 2, 2, 1000, 1000, vbSrcAnd)
    Call StretchBlt(Me.hdc, 0, 0, 1000, 1000, SrchDC, 2, 2, 1000, 1000, vbSrcErase)
    Call StretchBlt(Me.hdc, 0, 0, 1000, 1000, SrchDC, 2, 2, 1000, 1000, vbSrcCopy)
    Call StretchBlt(Me.hdc, 0, 0, 1000, 1000, SrchDC, 2, 2, 1000, 1000, vbSrcInvert)
    Call StretchBlt(Me.hdc, 0, 0, 1000, 1000, SrchDC, 2, 2, 1000, 1000, vbSrcPaint)
    Call ReleaseDC(0, SrchDC)
End Sub

'你还真可以,竟然用语言描述图形图像。

4 楼

楼上的朋友,谢谢你的帮助,不过就像你说的,用文字表达始终无法真正描述清楚,我把编译好的EXE文件上传上来了,你可以下载后运行一下,你就知道我所说的是什么问题了。当然,这个程序同时还存在其他的BUG,所以,请不要介意:)

5 楼

用透明窗口比较好吧?

6 楼

给楼主的建议:
1、在PopupMenu之前,调用一下SetForegroundWindow,不然人家不点击菜单的话,菜单会一直存在的。
2、你这个好像可以用Windows的Agent组件实现

不过你写的效果很不错,厉害。

7 楼

SetForegroundWindow 怎么用?我也是边学边用的,能麻烦楼上的解释一下这个函数吗?

我来回复

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