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 Const SRCCOPY = &HCC0010Private Sub Timer1_Timer()
BitBlt Picture1.hdc, 126, 0, 16, 28, Picture2.hdc, 16 * Int(Mid$(Time, 8, 1)), 0, SRCCOPY
End Sub上面的代码是从图片框2截取图片到图片框1的,如何修改让他可以从图像框2截取图片到图像框1呢?
如何修改让他可以从图像框2截取图片到图像框1呢?很矛盾,都不知你要问什么?
是不是想问
如何修改让他可以从图像框1截取图片到图像框2呢?
如果是这样,那么就这么写
BitBlt Picture2.hdc, 126, 0, 16, 28, Picture1.hdc, 16 * Int(Mid$(Time, 8, 1)), 0, SRCCOPY 当然你的处理目的我不清楚,所以坐标我没换,只换了对象
图片框控件和图像框控件不一样的吧?图片框是Picture1,图像框是Image1,把Picture1.hdc换成Image1.hdc就不可以,所以才问如何实现Image2里的图片截取并放到Image1?
楼主只要稍微查看一下BITBLT这个API的参数说明就会明白了, 一个HDC是SOURCE即图像源,另一个HDC是DESTINATION即目标, 其它几个参数无非是截取的位置和大小,自己改一下参数就可以随心所欲调用了,这不是什么很难的事吧
那3楼的兄弟,你把代码里的Picture1.hdc和Picture2.hdc换成Image1.hdc和Image2.hdc看会不会出错?
你这么个用法,不出错才怪
都不知道你想表达什么意思,是要更改Image1里的图像还是什么。
如果你的想法是更改Image里的图像,直接设置Picture属性就可以了。
如果你想找个位置处理图像然后让Image显示处理好的图像,可以有几种
方法:
1、通过一个PictureBox来处理图像,然后取PictureBox的Image属性
赋值给Image对象的Picture属性。
2、通过GDI创建一个设备,然后通过内存设备处理好图像将设备图像转换
成Picture类型再赋值给Image对象的Picture属性。
3、通过Image对象Picture属性的位图句柄,然后更改其数据,然后刷新
Image对象。还有,Image设计出来的目的不是为了让人处理图形的,而是实现简单的
图形显示,所以也就没有 hDC 和 hWnd 这样的属性。就像一把裁纸刀,
本来设计出来是为了裁纸,但如果你想用它来坎骨头或坎材,不是不行,
但会非常累,你想用Image控件处理设备图像的想法也是一样的。
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) 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 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 Const SRCCOPY = &HCC0020 ' (DWORD) dest = sourcePrivate Sub Command1_Click()
Dim lMemDC As Long
Dim lBitmap As Long
Dim lMode As Long
lMode = Picture1.ScaleMode
Picture1.ScaleMode = 3
lMemDC = CreateCompatibleDC(Picture1.hdc)
lBitmap = SelectObject(lMemDC, Image1.Picture.Handle)
BitBlt Picture1.hdc, 0, 0, Picture1.Width, Picture1.Height, lMemDC, 0, 0, SRCCOPY
SelectObject lMemDC, lBitmap
DeleteDC lMemDC
Picture1.ScaleMode = lMode
End Sub
http://blog.csdn.net/SupermanKing/archive/2008/12/16/3526090.aspx
即使你真的要用Image对象显示处理后透明的效果,也不是按你的想法实现的,需要用到GDI+来处理,
最后还是我上面说的方法,将处理好的图像转成 Picture 类型再赋值给 Image 对象的 Picture 属性。
自己有想法是好的,但是要有技术基础后再订下研究方向,不然方向错了就会走进死胡同。
所以当你没有确定方向是否正确的时候,最好问一下方向性的问题再问实质的技术问题。
比如先问:“有什么方法可以实现透明图像的显示?”,然后再问具体的技术问题。
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc 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 LongPrivate Declare Function TransparentBlt Lib "Msimg32.dll" _
( _
ByVal hdcDest As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal w As Long, _
ByVal h As Long, _
ByVal hdcSrc As Long, _
ByVal x1 As Long, _
ByVal y1 As Long, _
ByVal w1 As Long, _
ByVal h1 As Long, _
ByVal cr As Long _
) As Long
Private Sub Command2_Click()
Dim objImg As StdPicture
Dim lMode As Long
Dim lWidth As Long
Dim lHeight As Long
Dim lMemDC As Long
Dim hBitmap As Long
Dim x&, y&, w&, h&, w1&, h1&
lMode = Picture1.ScaleMode
Picture1.ScaleMode = 3
Set objImg = LoadPicture("e:\1.bmp")
w1 = ScaleX(objImg.Width, vbHimetric, vbPixels)
h1 = ScaleY(objImg.Height, vbHimetric, vbPixels)
With Picture1
x = .ScaleLeft
y = .ScaleTop
w = .ScaleWidth
h = .ScaleHeight
End With
lMemDC = CreateCompatibleDC(Picture1.hdc)
hBitmap = SelectObject(lMemDC, objImg.Handle)
' 假设透明色为白色
Dim lMask As Long
lMask = RGB(255, 255, 255)
TransparentBlt Picture1.hdc, x, y, w, h, lMemDC, 0, 0, w1, h1, lMask
SelectObject lMemDC, hBitmap
DeleteDC lMemDC
Set objImg = Nothing
End Sub